Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
622061_KL_1.doc
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
4.45 Mб
Скачать

Процедуры и функции

9.15.Структурный подход к разработке программы. Подпрограммы

Рассмотрим следующий пример. Дан треугольник ABC с длинами сторон a, b и c соответственно (Рис. 2). Необходимо разработать программу, вычисляющую его площадь.

Рис. 2

Для решения задачи воспользуемся формулой Герона:

,

где – полупериметр:

.

Алгоритм решения будет иметь вид:

Программная реализация этого алгоритма может иметь вид:

var

a, b, c : real; {Переменные для хранения исходных данных}

S : real; {Переменные для хранения исходных данных}

p : real; {Вспомогательная переменная для хранения полупериметра}

begin

write(‘Введите a, b и c: ’); read(a, b, c);

p := (a + b + c)/2.0;

S := sqrt(p*(p-a)*(p-b)*(p-c));

write(‘S=’, S:0:3);

end.

Усложним исходное задание. Предположим, что необходимо рассчитать площадь четырёхугольника ABCD, заданного длинами своих сторон a, b, c, d и длиной диагонали e.

Искомая площадь представляет собой сумму площадей соответствующих треугольников . Поэтому для решения задачи можно также воспользоваться формулой Герона, которую в этом случае придётся применять дважды. Алгоритм решения можно представить следующим образом:

Следует обратить внимание на то, что одна и та же последовательность вычислений: «расчёт полупериметра – расчёт площади», – выполняется в программе дважды, но с различными исходными данными. Первый раз вычисления производятся с использованием длин a, b и e, а во втором – c, d и e.

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

1. Дублирование операторов увеличивает размер программы, повышает требования к объёму оперативной памяти, необходимой для хранения машинных кодов.

2. Дублирование снижает возможности по сопровождению и модификации программы; например можно представить, что на каком-то этапе разработки программы было принято решение отказаться от использования формулы Герона, и рассчитывать площадь треугольников иным образом. В этом случае программисту пришлось бы тщательно отыскивать все места в программе, где встречается последовательность операторов расчёта площади и менять их на новые фрагменты. При этом нет полной уверенности, что все последовательности были найдены и корректно изменены.

3. Механическое дублирование увеличивает размер исходных текстов программы и усложняет её восприятие программистом.

Для преодоления всех этих проблем в языках высокого уровня предусматривается обычно возможность выделения отдельных фрагментов программы в некоторые самостоятельные блоки – подпрограммы, к которым можно обращаться многократно из основной части программы.

9.16.Понятие подпрограммы, виды подпрограмм в Паскале.

Подпрограммой называется именованный фрагмент кода, решающий определённую подзадачу в рамках общей задачи программы. К подпрограмме можно обращаться из основной части программы по мере необходимости.

В процессе изучения Паскаля мы уже неоднократно сталкивались с различными стандартными подпрограммами (например, ClrScr или sin), которые поставляются вместе с компилятором языка. Оказывается, что Паскаль позволяет программисту разрабатывать и использовать свои собственные подпрограммы. Таким образом, подпрограмму можно рассматривать как новую команду, порядок работы которой задаётся программистом самостоятельно.

Подпрограммой называется именованный фрагмент кода, к которой можно обращаться из основной части программы.

В схемах алгоритмов подпрограммы обозначаются блоками вида:

Внутри блока указывается имя подпрограммы, к которой происходит обращение.

Существует два основных вида подпрограмм: 1) процедуры и 2) функции. Отличие между ними состоит в том, что процедура выполняет предписанные действия, не возвращая явным образом числового результата. В качестве примера процедур можно привести процедуру очистки экрана ClrScr, процедуру генерации звукового сигнала Sound или процедуру установки текстового курсора в заданную позицию GotoXY.

В отличие от процедур, функции после выполнения предписанных действий возвращают результат работы в виде некоторого числа, символа или строки символов. Типичным примером функций являются функция вычисления квадратного корня sqrt, тригонометрические функции sin, cos, tan, функция генерации псевдослучайного числа Random и т.п. Поскольку функции возвращают определённое значение, их можно использовать в правых частях выражений.

Из приведённых примеров также следует, что для нормальной работы подпрограмм им обычно необходимо передавать определённые исходные данные. Например, для вычисления квадратного корня мы должны сообщить функции sqrt число, из которого этот корень будет извлекаться. Для позиционирования текстового курсора процедуре GotoXY следует указать координаты знакоместа на экране, в которое будет перемещён курсор. Подобные исходные данные называются аргументами, или параметрами подпрограммы. Они указываются в круглых скобках после имени вызываемой подпрограммы.

Рассмотрим, как можно модифицировать последний алгоритм, введя специальную подпрограмму, вычисляющую площадь отдельного треугольника.

Поскольку в результате работы этой подпрограммы должно быть найдено число, определяющее искомую площадь, целесообразно разрабатывать подпрограмму-функцию, а не подпрограмму-процедуру.

Кроме того, необходимо выбрать имя этой функции и определить список её параметров.

Имя функции должно удовлетворять следующим требованиям. Во-первых, оно, как и все идентификаторы Паскаля, должно состоять из букв латинского алфавита и, возможно, цифр; начинаться с буквы; не совпадать ни с одним зарезервированным словом или ранее объявленным идентификатором. Во-вторых, целесообразно давать подпрограммам осмысленные имена, отражающие суть выполняемых ими действий. Последнее требование не является обязательным с точки зрения синтаксиса языка Паскаль, но оперировать подпрограммами с именами вида P158, или fff_13 крайне неудобно.

Поскольку функция предназначена для расчёта площади, в качестве имени можно выбрать, например, слово Square.

Если для вычисления площади, как и в первом алгоритме, будет использоваться формула Герона, то в качестве исходных данных в функцию следует передавать длины сторон треугольника, для которого производится расчёт.

Таким образом, алгоритм вычисления площади четырёхугольника будет иметь вид:

При этом, разумеется, следует отдельно разработать алгоритм функции Square.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]