
7.4 Виды подпрограмм
Если программа большая и сделана в виде одной функции main, то ее трудно
составлять, отлаживать, тестировать и понимать. В ней могут присутствовать
повторяющиеся части. Поэтому для упрощения решения задачу делят на части и
для каждой части составляют алгоритм. Каждый алгоритм - это этап решения, и
ему соответствует независимая часть программы - подпрограмма.
Он должен легко пониматься, читаться и модифицироваться.
Текст главной функции mainобъединяет подпрограммы.
Подпрограммы упрощают программирование. Чем короче и яснее подпрограммы,
тем выше качество программы. Использование подпрограмм - правило хорошего
тона. Считается, что размер их не должен превышать 1-2 экранов.
В программной документации обычно приводится структурная схема
программы, в который каждой подпрограмме соответствует прямоугольник
стандартного размера с именем подпрограммы или цифрой. Вся схема имеет
вид иерархической структуры со связями по горизонтали и вертикали
(см. рис. 7.1). Для подпрограмм, описанных в других документах, например,
стандартных, обычно боковые стороны прямоугольников проводятся двумя
чертами.
main
Рис. 7.1. Структурная схема программы из 6 подпрограмм
В предшествующих лекция по С++ указывалось, что все подпрограммы
делятся на 3 вида:
main (. . .) - это главная функция, т.е. основная подпрограмма,
имя (. . . ) - это функция.
void имя (. . . ) - это функция, не возвращающая значения,
и поэтому называемая иногда процедурой.
ОСНОВНЫЕ ПРАВИЛА
Любая программа содержит одну главную функцию main
и ноль или более других функций.
В тексте все функции записываются подряд и в любом порядке.
Каждая функция начинается после завершающей фигурной скобки }
предыдущей функции. Обычно между функциями вставляют
пустую строку или строку комментариев с каким-либо символом.
3. Вложение подпрограмм друг в друга в С++, в отличие от языка
Pascal, запрещено. (Каждая программа - это как бы "кирпичная стена",
где подпрограммы - это "кирпичи", а поставить кирпич в кирпич нельзя).
Пример текста с подпрограммами:
#include . . . . . .
. . . . . . . //(7.6)
#include . . . . . .
. . . . . . .
имя1 (. . . ) { . . . . . }
/ / - - - - - - - - - -
Void main ( ) { . . . . . }
/ / - - - - - - - - - -
имя3 (. . . ) { . . . . . }
/ / - - - - - - - - - -
имя4 (. . . ) { . . . . . }
Здесь показаны 4 функции, разделенные строками комментариев.
Количество операторов в теле каждой функции, т.е. в фигурных скобках,
может быть любым, но оно обычно невелико, что характерно для стиля
С++ . Это означает, что исходная сложная задача должна быть представлена в
виде множества компактных алгоритмов, т.е. для каждой функции свой алгоритм.
В курсовой работе должны использоваться функции с алгоритмами для каждой.
Каждая функция имеет вход и выход: вход - это её аргументы в скобках, а выход -
это значение имени функции по аналогии с обычной записью в математике f ( x,y).
Функции взаимодействуют парами. Рассмотрим одну из пар.
На рис. 7.2 F1 является вызывающей функцией , а F2 - вызываемой.
Вызывающая функция Вызываемая функция
Заголовок
int F1
( ) double F2(
int x, int y)
Заголовок
{ { . . . . . double z;
. . . z = x + y + exp(x);
Вызов F2 F2 ( a, b); z = sin(z);
. . . return z ; } Возвращение
Вызов
F2
p
= F2
(c,d);
значения F2
. . . . }
Рис. 7.2 Взаимодействие двух функций
В заголовке функции нет точки с запятой.
Тип функции должен быть описан. Если описание типа функции в заголовке
отсутствует, то полагается тип int.
Типы аргументов в заголовке описываются. Если передаваемых параметров нет,
то в заголовке и при вызове используются пустые скобки. Вместо пустых скобок ( ) можно написать ( void) .
Оператор return присваивает указанное (или полученное) в нем значение
имени функции, которое возвращается в вызывающую подпрограмму.
Например, при втором вызове F2 получим в функции F1
численное значение p = sin(c + d + exp(c)).
Если нет возвращаемого значения, то либо return отсутствует, либо используется
оператор return; без значения. Функции без указания значения после слова
return имеют тип void, см. также раздел 8.1.
________ Контрольная работа K3