Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб12.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
128.51 Кб
Скачать

Лабораторная работа ╧12

Указатели, символьные строки и функции

1. Цель работы

     Целью лабораторной работы является совершенствование практических навыков в работе с указателями и получение навыков в работе с функциями пользователя.

2. Теми для предварительной проработки

  • Указатели. Типизированные указатели.

  • Указатели та массивы.

  • Функции пользователя

3. Задания для выполнения

     Разработать функцию, которая выполняет ту обработку символьной строки, которая определена в Вашем индивидуальном задании. При реализации функции запрещается пользоваться функциями библиотек языка C.

     Примечания:

  1. В большинстве заданий необходимо предусмотреть работу функции при некорректном задании ее параметров.

  2. В тех заданиях, где применен термин "слово", под ним понимается любая последовательность символов, ограниченная любым числом пробелов и/или началом/концом строки.

4. Варианты индивидуальных заданий

Вариант 1

Функция подсчитывает количество слов в строке.

Вариант 2

Функция дописывает одну строку в конец другой.

Вариант 3

Функция выделяет первое слово из строки.

Вариант 4

Функция сравнивает две строки, игнорируя различия в регистрах.

Вариант 5

Функция разбивает строку на две части: до первого вхождения заданного символа и после него.

Вариант 6

Функция выравнивает строку по левому краю до заданной длины.

Вариант 7

Функция копирует строку в другую строку заданной длины и размещает текст первой строки по центру второй строки.

Вариант 8

Функция удаляет из строки заданное количество символов, начиная с заданной позиции.

Вариант 9

Функция определяет в строке номер позиции слова с заданным номером.

Вариант 10

Функция заменяет символы строки из одного заданного алфавита на символы другого алфавита.

Вариант 11

Функция находит последнее вхождение в строку заданной подстроки

Вариант 12

Функция доводит длину строки до заданной, вставляя пробелы между словами

Вариант 13

Функция находит в строке первый символ, который входить в другую заданную строку.

Вариант 14

Функция удаляет из строки слово с заданным номером

Вариант 15

Функция перекрывает символы строки заданным количеством символов другой строки, начиная с заданной позиции.

Вариант 16

Функция находит в строке первый символ, который не входить в другую заданную строку.

Вариант 17

Функция сравнивает две строки, игнорируя количество пробелов между словами

Вариант 18

Функция удаляет из начала и из конца строки заданный символ.

Вариант 19

Функция выделяет из строки заданное количество слов, начиная со слова с заданным номером

Вариант 20

Функция выравнивает строку по правому краю до заданной длины.

5. Пример решения задачи (вариант 30)

5.1. Разработка спецификаций функции.

     Дадим функции, которую мы создаем, имя substr(). Состав и типы ее параметров достаточно просто могут быть определены из задания: это должны быть строка-источник данных (src), строка-результат (dest), начальная позиция (pos) и длина результата (len).

     Строки должны быть определены в той функции, которая вызывает нашу, следовательно, функции substr() передаются указатели на эти строки. Остальные параметры должны быть целыми числами. Обратите внимание на наши соображения по поводу размещения символьных строк. Вполне понятно, что память для строки-источника должна быть выделена во внешней функции. Но то же самое мы предусматриваем и для строки-результата - почему? Если мы объявим строку-результат как локальную в функции substr(), то память для нее будет выделена в нашей функции, и эта память будет освобождена, когда выполнение функции закончится, следовательно, та функция, которая вызвала нашу, воспользоваться результатом не сможет. Если же мы выделим память в нашей функции явным образом (с помощью malloc()), то память сохранится, но тогда на ту функцию, которая вызвала нашу, возлагается обязанность явным образом освободить эту память, когда строка-результат уже не будет нужна. Проанализируем возможности некорректного задания параметров при вызове функции. Во-первых, параметры pos и len не могут иметь отрицательного значения - оно просто не имеет смысла. Во-вторых, возможно такое значение параметра pos, которое будет превышать длину строки-источника. Будем считать все эти случаи ошибочным заданием параметров. Что должна делать функция при ошибочном задании параметров? Можно предложить три варианта:      1. Функция аварийно завершает работу всей программы.      2. Функция никак не реагирует на ошибку.      3. Функция возвращает какой-то признак ошибки.

     Из этих вариантов мы выбираем третий, исходя из тех соображений, что функция может использоваться в большом числе программ, так что пусть внешняя программа, получив признак ошибки, сама принимает решение о дальнейших действиях при ошибке. А если так, то наша функция должна возвращать признак ошибки. Удобно сделать этот признак именно тем значением, которое функция возвращает.

     Установим, что это значение будет 0 при нормальной работе функции, а при ошибке в параметрах это значение будет -1, а строка-результат будет пустой.

     Возможен еще один вариант некорректного задания параметров - когда начало подстроки лежит в пределах строки-источника, а конец выходит за ее конец. Договоримся не считать этот случай фатальной ошибкою, пусть в этом случае функция формирует результат меньшей длины, чем задано и возвращает 1.

     Еще одна проблема: если память для результата выделяет внешняя функция, что делать, если длина результата будет больше объема выделенной памяти? Чтобы контролировать эту ситуацию нужно ввести еще один параметр функции - максимальную длину строки-результата, а это нежелательно. Примем решение не контролировать такую ситуацию, перекладывая ответственность за нее на ту функцию, которая вызывает нашу. Это решения базируется на том, что именно так поступают и библиотечные функции языка С.

     В итоге разработки спецификации для функции мы формулируем такое описание функции substr():

int substr(

char *src,

char *dest,

int pos,

int len);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]