Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АиП -Лабораторная работа№3_2семестр.doc
Скачиваний:
2
Добавлен:
13.09.2019
Размер:
117.76 Кб
Скачать

2. Разработка алгоритма решения.

Разработаем алгоритм только для функции substr(), игнорируя внешнюю функцию, которая вызывает ее.

При разработке алгоритма мы сразу же "заглядываем вперед", имея в виду его последующую реализацию в программном коде, т.к. уже в задании обусловлены некоторые детали реализации.

  Функция начинается с цикла (блоки 2 -5), цель которого - установить указатель на символ с номером pos. Как параметр цикла используется параметр функции pos, который "работает на уменьшение". В каждой итерации цикла pos уменьшается на 1 (блок 5), а указатель src увеличивается на 1 (блок 4). Когда pos уменьшится до 0 (блок 3) - указатель должен быть установлен на нужный символ.

Но есть возможность того, что мы достигнем конца строки раньше, чем символа с номером pos. Эта возможность проверяется отдельно (блок 2) - не показывает ли src на символ с кодом 0 - признак конца строки. Следовательно, выход из цикла возможен либо по достижению нужного символа (блок 3), либо по достижению конца строки, причем, последнее действие возможно только при некорректном задании параметров.

После выхода из цикла проверяется корректность задания параметров: не задана ли отрицательная длина подстроки (блок 6) и не выходит ли pos за пределы строки (блок 7). Отметим, что если значение pos ошибочно задано отрицательным, то цикл блоков 2 - 5 не выполнится ни одного раза и в блоке 7 значение pos будет ненулевым. Оно также будет ненулевым, если pos превышает длину строки-источника. В любом случае некорректного задания возвращаемое значение ret устанавливается в -1 (блок 8), и управление переходит на завершение функции.

Если же параметры заданы корректно, выполняется второй цикл (блоки 9 - 13). Этот цикл имеет параметром параметр функции len, который тоже "работает на уменьшение". В каждой итерации символ, на который показывает указатель src, пересылается туда, куда показывает указатель dest (блок 11) после чего оба эти указателя увеличиваются на 1 (блок 12), а len уменьшается на 1. Когда значение len достигнет 0, это означает, что из источника в результат переслано уже len символов и происходит выход из цикла (блок 10). Другая возможность выхода - если будет найден конец строки прежде, чем закончится пересылка (блок 9). После выхода из цикла проверяется остаток в переменной len (блок 14). Если он нулевой, значение для ret устанавливается в 0 (блок 16), если нет - это означает, что переслано меньшее количество символов, и значение ret устанавливается в 1 (блок 17).

Перед завершением в любом случае записывается признак конца строки туда, куда показывает dest (блок 17). Если функция завершается из-за некорректного задания параметров, это обеспечит, пустую строку по адресу dest. То значение ret, которое было установлено при выполнении алгоритма, возвращается функцией (блок 18).

3. Функция substr(). Текст программы.

Заголовок функции substr() полностью соответствует ее описанию, сформулированному при разработке спецификаций функции. В функции объявляется только одна локальная переменная - ret ,- в которой формируется то значение, которое возвращает функция.

Цикл, который на схеме алгоритма представлен блоками 2 - 5, реализован одним оператором:

for(; pos&&*src; pos--, src++);

Начальные установки для цикла не нужны. Оба условия выхода из цикла проверяются одним выражением:

pos&&*src,

что эквивалентно:

(pos==0)&&(*src=0),

в конце каждой итерации уменьшается pos и увеличивается src. Тело этого цикла пустое.

Единственный условный оператор:

if (pos||(len<0)) ret=-1;

является программной реализацией проверок некорректного задания параметров (блоки 6 - 8).

Если параметры корректны, следующий оператор цикла выполняет пересылку символов из источника в результат (блоки 9 - 13):

for(;len&&*src; *dest++=*src++,len--);

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

После цикла проверяется остаток и устанавливается значение ret (блоки 14 - 16):

ret = len ? 1 : 0;

Перед возвратом еще записывается признак конца строки (символ с кодом 0) в результат (блок 17):

*dest=0;

При завершении функция возвращает (блок 18) значение ret: