Процедуры являются основой модульного программирования (МП). Модульное программирование – это процесс построения программы, разделенной на логические части, называемые модулями, и последовательное программирование каждого модуля.
Принципы модульного программирования.
Целью МП является: возможность независимого написания и отладки отдельного модуля; возможность замены модуля без изменения всей программы; облегчение тестирования (проверки) модулей программы.
Если соблюдается системный принцип проектирования задачи сверху вниз, то она разбивается на подзадачи, которые возможно отразить программными модулями. При этом преследуют две цели:
Для модуля должны быть известны: алгоритм решения задачи; область допустимых входных значений; область возможных выходных значений.
Каждый модуль должен решать одну задачу, то есть быть «кирпичиком», из которого строится программа. Вы можете программы для ноутбука скачать тут без заморочек. Как правило, использование модулей сокращает число глобальных переменных программы.
На рис. 1.4 в виде блок-схемы приведен проект будущей программы, имеющей линейную структуру.
Эта программа должна обеспечить ввод с клавиатуры двух матриц А и В, осуществить их умножение, результатом которого является матрица С, и вывести матрицу С на экран монитора. Тело программы содержит вызовы трех подпрограмм MOD1, MOD2, MOD3, имеющих один вход и один выход.
В таком представлении (рис. 1.4) процесс разработки программы сводится к последовательному программированию модулей, если разработчик один, или сразу всех, если разработчика три. Предположим, что MOD2 и MOD3 разработаны, а MOD1 — нет. В этом случае вместо MOD1 ставят «заглушку», то есть модуль имитирующий процесс работы MOD1.
Принципы модульного программирования реализуются в Паскале с помощью пользовательских процедур, представляющих собой оператор с уникальным идентификатором и списком формальных параметров, если они нужны.
Структура и синтаксис процедуры.
Процедура пользователя представляет собой именованную группу операторов, реализующую часть общей задачи. Процедура отличается от функции способом вызова и возврата управления. Процедура работает с параметрами значениями (исходными данными), и параметрами переменными, которые используются для возвращения в качестве результатов переменных скалярного или структурированного типа. Схематично (в виде черного ящика) процедуру можно отобразить следующим образом (рис. 1.5).
Допускаются описания процедур, выполняющих некоторые действия и не формирующих никаких результатов расчетов. Например: вывод на экран строки из звездочек или часто встречающихся сообщений.
Процедура, описанная пользователем, в общем случае имеет синтаксис:
PROCEDURE < имя > [(< список формальных параметров >)]; { Заголовок }
< Разделы описаний > { Тело процедуры }
BEGIN
< Раздел операторов >
END;
При обращении к процедуре указывается имя процедуры и список фактических параметров, порядок которых очень существенен, так как он должен строго соответствовать порядку, принятому в списке формальных параметров заголовка процедуры. Фактические параметры отделяются друг от друга запятыми и заключаются в круглые скобки. В общем случае список параметров процедур может отсутствовать.
Подстановка фактических параметров вместо формальных осуществляется механизмом замены, который обеспечивает многократное выполнение процедуры с различными исходными данными и помещает результаты вычислений в переменные, задаваемые пользователем.
Пример 7. Используя принцип модульного проектирования программ разработать программу вычисления произведения двух матриц С = А х В по формуле:
где Aj,k – элементы прямоугольной матрицы Amxp ; m – число строк матрицы Amxp ; р – число столбцов Amxp, и число строк матрицы Bpxn; Bk,j – компоненты матрицы Bpxn, n – число столбцов матрицы Bpxn; Сi,j – компоненты матрицы Cmxn, получаемые в результате умножения.
PROGRAM PR7;
TYPE MAT = ARRAY [1..10, 1..10] OF REAL;
VAR AF, BF, CF: MAT; MF, NF, PF: INTEGER;
PROCEDURE MOD1(CH:CHAR; VAR M, N: INTEGER; VAR W: MAT);
VAR I, J: INTEGER;
BEGIN { Ввод матрицы W, размерностью M на N}
WRITELN('Введите размерность М и N матрицы ', СН);
READLN(M, N);
WRITELN('Введите матрицу', СН);
FOR I := 1 ТО М DO FOR J := 1 ТО N DO READ (W[I, J]);
END; {MODI }
PROCEDURE MOD2(M, P, N: INTEGER; A, B: MAT; VAR C: MAT);
VAR I, J, K: INTEGER;
BEGIN {Умножение матриц А и В}
FOR I := 1 TO M
DO FOR J:=l TON DO BEGIN
C[I,J]:=0;
FOR K:=1 TO P
DO C[I,J]:=C[I,J] + A[I,K]*B[K,J]
END
END; {MOD2}
PROCEDURE MOD3(CH: CHAR; M, N: INTEGER; W: MAT); VAR I. J: INTEGER;
BEGIN { Отображение матрицы W, размерностью M на N }
WRlTELN('Матрица', СН, ':');
FOR I:=1 TO M
DO BEGIN
FOR J := 1 TO N DO WRITE(W[I, J]: 10:5);
WRITELN
END
END; {MOD3}
BEGIN {Тело программы}
MOD1('A', MF, PF, AF); { Ввод матрицы А, размерностью MF на PF}
MOD1('B', PF, NF, BF); { Ввод матрицы В, размерностью PF нa NF}
MOD2(MF, PF, NF, AF, BF, CF); { Умножение матриц А и В }
MOD3('C', MF, NF, CF) { Отображение матрицы С, размерностью MF на NF}
END.
Предыдущая статья: Рекурсивные вычислительные процессы.
Оглавление: Лекции по Pascal. Часть 2.
Следующая статья: Спецификация процедуры.