- •Задание 1
- •Задание 2
- •4. Варианты индивидуальных заданий Задание 1
- •5. Примеры решения задач (вариант 00)
- •5.1. Задание 1
- •5.1.1. Разработка алгоритма решения.
- •5.1.2. Определение переменных программы
- •5.1.3. Разработка текста программы
- •5.1.4. Отладка программы
- •5.1.5. Результаты работы программы
- •5.2. Задание 2
- •5.2.1. Разработка спецификаций функции.
- •5.2.2. Разработка алгоритма решения.
- •5.2.3. Функция substr(). Текст программы.
- •5.2.4. Функция main()
- •5.2.4.1. Переменные функции main()
- •5.2.4.2. Текст функции main()
- •5.4.3. Общие объявления
- •5.2.5. Отладка программы
- •5.2.6. Результаты работы программы
5.2.4. Функция main()
Основным результатом нашего проекта должна быть функция substr(). Но эта функция не может выполняться самостоятельно, она должна вызываться из какой-нибудь внешней функции. Вообще для выполнения любого программного кода, написанного на языке C, в нем должна быть функция main(). На эту функцию мы возлагаем задачи ввода данных и вывода результатов. Следовательно, чтобы заставить нашу функцию substr() выполняться и проверить ее выполнение, мы должны создать также и функцию main().
5.2.4.1. Переменные функции main()
В функции main() должны быть объявлены переменные для:
строки-источника:
char s1[80];
строки-результата:
char s2[80];
позиции первого символа в подстроке:
int n;
длины подстроки:
int l;
того значения, которое вернет функция substr():
int r;
Пользуясь случаем, сделаем небольшое отступление, чтобы предупредить Вас про возможность ошибки, которую часто допускают начинающие программисты. Зная, что обращение к символьным строкам в языке C происходит через указатель на начало строки, такие программисты иногда объявляют символьную строку как char *. Но такое объявление, например:
char *s1;
выделяет память только для размещения указателя, но не для размещения самих символов строки. Если далее мы введем, например, 80 символов функцией gets(s1), то символы разместятся там, куда показывает указатель s1, но значение этого указателя не определено, следовательно, и символы разместятся неизвестно где. Следовательно, символьная строка обязательно должна быть объявлена как массив символов - этим выделяется для нее память, а уже обращаться к ней можно через указатель.
Не следует также забывать про необходимость резервировать в строке дополнительную позицию для признака конца строки.
5.2.4.2. Текст функции main()
После объявления переменных текст функции main() состоит из единственного бесконечного цикла. В каждой его итерации прежде всего выводится приглашение не ввод строки-источника. Следующий оператор, возможно, требует более детального рассмотрения:
if (!strcmp(gets(s1),"***")) break;
При его выполнении прежде всего выполняется функция gets(s1), которая вводит данные в строку s1. Эта функция возвращает указатель на строку s1. Строка, на которую показывает этот указатель, сравнивается с помощью функции strcmp() со строковой константой "***". Если они равны, strcmp() возвращает 0, тогда значение логического выражения в условном операторе истинное и выполняется выход из бесконечного цикла. Следовательно, цикл будет выполняться, пока не будет введена строка "***".
Потом вводятся значения переменных n и l и выполняется вызов функции substr(), которой передаются параметры s1, s2, n, l. Значения, которое возвращает substr(), присваивается переменной r.
Строка-источник, строка-результат и возвращенное значение выводятся на экран, и цикл повторяется. (Обратите внимание на то, что при выводе символьных строк мы берем их в "скобки": >> <<. Это сделано для того, чтобы на экране можно было разглядеть символы-пробелы, которые могут быть в начале и в конце строк.)
Обращение к функции gets() в конце цикла - "технологическое". Дело в том, что функция scanf() оставляет в буфере ввода последний код клавиши Enter, которым был закончен ввод. Если не будет "технологического" gets(), то gets() в следующей итерации цикла прочитает этот символ, как пустую строку. Так что "технологическое" gets() удаляет из буфера код клавиши Enter. Чтобы убедиться, попробуйте его убрать и посмотрите, что получится.
