Продолжение Таблицы 4.1
strcspn |
int strcspn(char *st1, char *st2); Вычисляет индекс первого символа строки st1, который принадлежит набору символов строки st2 (это эквивалентно длине начальной подстроки st1, которая не содержит ни одного символа из набора символов st2). |
strlen |
unsigned int strlen(char *st); Вычисляет длину строки st ( в байтах, не учитывая символ ‘\0’). |
strrev |
сhar *strrev(char *st); Переворачивает строку st (т.е. меняет порядок символов на противоположный).
|
strspn |
int strspn(char *st1, char *st2); Вычисляет индекс первого символа строки st1, который не принадлежит набору символов строки st2 (это эквивалентно длине начальной подстроки st1, которая содержит только символы из набора символов st2). |
Продолжение Таблицы 4.1
strstr |
char *strstr(const char *st1, const char *st2); Поиск первого вхождения строки st2 в строку st1. Возвращает указатель на символ, с которого начинается первое вхождение или NULL, если вхождение не найдено.
|
strtok |
char *strtok(const char *st1, const char *st2); Поиск в строке st1 лексем (слов), разделенных символами-разделителями из строки st2. При первом вызове strtok возвращает указатель на первое слово (первый символ) st1. Чтобы найти начало следующего слова в st1, необходимо вызвать функцию strtok, задавая первый параметр NULL-значением. Набор символов-разделителей может от вызова к вызову различаться ( т.е. второй параметр может при каждом вызове быть другим). Когда при очередном вызове в st1 нет больше слов, функция возвращает NULL. |
Продолжение Таблицы 4.1
strchr |
char *strchr(char *st, int c); Поиск первого вхождения символа c в строку st. Возвращает указатель на первое вхождение символа или NULL, если вхождение не найдено. |
strncat |
char *strncat(char *st1, char *st2, int kol); Добавляет kol первых символов строки st2 в строку st1. |
strncmp |
int strncmp(char *st1, char *st2, int kol); Сравнивает лексикографически первые kol символов строк st1 и st2. Результат аналогичен результату strcmp. |
strncpy |
char *strncpy(char *st1, char *st2, int kol); Копирует первые kol символов строки st2 в строку st1 (если значение kol меньше длины st2, то символ ‘\0’ не добавляется в новую строку). |
strnicmp |
char *strnicmp(char *st1, char*st2,int kol);Аналогично функции strncmp только не делает различий между заглавными и строчными буквами (т.е. не различает регистры). |
Продолжение Таблицы 4.1
strnset |
char *strnset(char *st, int c, int kol); Заменяет первые kol символов строки st символом c. |
strpbrk |
сhar *strpbrk(char *st1, char *st2); Поиск в строке st1 первого вхождения любого из символов строки st2. Возвращает указатель на первое вхождение или NULL, если нет общих символов в строках. |
strrchr |
сhar *strrchr(char *st, int c); Поиск в строке st последнего вхождения символа c. Возвращает указатель на последнее вхождение символа или NULL, если заданный символ не найден. |
Тема. Программирование с использованием подпрограмм.
Цель. Закрепить умение разбивать (структурировать) программу на программные модули (подпрограммы), уметь описывать подпрограммы и использовать их при решении задач, знать способы передачи данных в подпрограммы.
Содержание работы
1. Изучить технологию нисходящего программирования.
2. Изучить организацию подпрограмм (понятие подпрограммы, описание подпрограммы, вызов подпрограммы, способы передачи данных в подпрограмму).
3. Спроектировать структуру программы решения задачи, выделив в ней подзадачи, которые необходимо оформить в виде подпрограмм. Определить исходные данные и результаты подпрограмм, способы передачи данных в подпрограммы и типы формальных параметров.
4. Написать и отладить программу решения задачи.
Методические указания
При нисходящей разработке проектирование программы ведется “сверху-вниз”. В решаемой задаче сначала выделяется небольшое число достаточно самостоятельных, более простых задач (подзадач), а в проектируемой программе намечается соответствующее число блоков (частей программы), каждый из которых предназначен для решения одной из подзадач. Определяется функциональное назначение каждого блока (модуля): что он должен делать, какие данные являются исходными для блока, какие – результатами. Если какие-то из подзадач оказываются достаточно сложными (алгоритмы их решения не являются очевидными), то к каждой из них применяется аналогичный процесс выделения подзадач. Этот процесс пошаговой детализации продолжается до тех пор, пока каждый из выделенных блоков программы не окажется таким, что его реализация (кодирование) на выбранном языке программирования уже не вызовет трудностей. Таким образом, программа может иметь многоуровневую структуру:
Модуль 1 уровня
Модули 2 уровня
Модули 3 уровня
и т.д.
Если на каждом шаге детализации будут использоваться принципы структурного программирования, то это обеспечит хорошую структурированность и программы в целом.
В языках программирования одним из средств реализации модульной структуры программы является метод подпрограмм.
Подпрограмма – это самостоятельная программная единица, которая позволяет выделить из программы частичный алгоритм и записать его только один раз, но использовать столько раз, сколько это необходимо.
Основные свойства подпрограмм:
1) подпрограмма должна иметь один вход и один выход;
2) подпрограмма должна решать самостоятельную задачу по принципу одна подпрограмма – одна функция. Например, ввод линейного массива, вычисление произведения матриц, поиск наибольшего элемента в одномерном массиве и т.д.;
3) подпрограмма должна возвращать управление в ту часть программы, которая ее вызвала;
4) подпрограмма может вызывать другую подпрограмму, в том числе и саму себя, в последнем случае мы имеем дело с рекурсивной подпрограммой;
5) подпрограмма должна настраиваться на входные данные вызывающей части и возвращать результат;
6) размер подпрограммы желательно ограничивать одной-двумя страницами исходного текста.
Каждой подпрограмме дается имя, которое используется для активации действий, описанных в подпрограмме (вызова подпрограммы) в тех местах программы, где необходимо их выполнить. В точке вызова подпрограммы управление передается ее первой команде. Выполнение подпрограммы завершается действиями по возвращению управления в точку вызова – т.е. команде, непосредственно следующей за точкой вызова, называемой точкой возврата.
Таким образом, в структурированной программе между программными единицами устанавливается отношение вызываемая–вызывающая. Схема взаимодействия вызывающей и вызываемой может быть следующей:
Синтаксически подпрограмма состоит из:
– определения подпрограммы,
– обращения к подпрограмме.
Определение подпрограммы:
<определение подпрограммы> ::= <заголовок подпрограммы> <тело подпрограммы>
Тело подпрограммы является описанием того частичного алгоритма, который объявляется подпрограммой.
Заголовок подпрограммы задает ее имя и определяет данные, с которыми эта подпрограмма работает.
Обращение к подпрограмме служит для ее активации.
Большинство языков программирования допускает подпрограммы двух видов – подпрограммы-процедуры и подпрограммы-функции (или просто процедуры и функции). В отличие от процедуры функция реализует функциональную зависимость, у которой один результат. Кроме того, результат функции может быть, как правило, простого типа.
Программа на языке Си это совокупность подпрограмм – функций (в дальнейшем просто функций), среди которых выделяется одна обязательная (главная) с именем main. Остальные функции вводятся в структуру программы для улучшения ее структурированности. Их выполнение инициируется прямо или косвенно вызовами из функции main.
В простом случае определение функции на языке Си:
<Определение функции> ::= <заголовок функции> <блок>
<заголовок функции> <составной оператор>
<Заголовок функции> :: =
<cпецификация типа результата функции> <имя функции> ( [ <cписок формальных параметров> ] )
| void <имя функции> ( [ <cписок формальных параметров> ] )
Таким образом, тело функции задается блоком (блок это последовательность описаний и операторов, заключенная в фигурные скобки) или составным оператором. В заголовке функции задается тип ее результата, если функция имеет возвращаемый результат, иначе тип void. Список формальных параметров, если он не опущен, содержит перечисленные через запятую спецификации формальных параметров. В теле функции, если она возвращает результат, обязательно должен быть хотя бы один оператор возврата в точку вызова:
return <выражение>;
Выражение определяет возвращаемый результат, его тип описан в заголовке функции. Если функция не возвращает никакого значения (т.е. имеет тип void), оператор возврата опускается.
Обращение к функции, возвращающей результат, это выражение вида:
<имя функции>(<список фактических параметров>)
или <имя функции> ( ) , если у функции нет формальных параметров. Вызов такой функции является операндом какого-либо выражения.
Синтаксически обращение к функции, не возвращающей результат, задается также, но в этом случае обращение – это оператор вызова:
<имя функции>(<список фактических параметров>);
или <имя функции> ( );
Одним из важных моментов при организации подпрограмм является задание данных, над которыми будут выполняться действия подпрограммы. Данные в подпрограмму можно передавать двумя способами: 1) используя для этого глобальные объекты, 2) используя формальные параметры.
В определении подпрограммы можно жестко зафиксировать ее данные, непосредственно используя в ней объекты вызывающей части программы. Такие подпрограммы не имеют параметров.
Пример определения функции без параметров:
int MAX ( )
{ return ( a > b ? a : b ) ; }
Функция MAX может выполнять действия только над переменными a и b (входные данные функции). Переменные a и b должны быть определены вне функций и называются внешними или глобальными переменными. Тело функции MAX – составной оператор. Обращение к функции MAX – операнд выражения, например : x = MAX ( ); Переменной x будет присвоено значение функции MAX, т.е. наибольшее из значений a и b.