
ОП 2012 Студентам / ОП. Лекции / ОП_4
.pdf
2012
Глава 4 Модульное программирование
МГТУ им. Н.Э. Баумана
Факультет Информатика и системы управления
Кафедра Компьютерные системы и сети Лектор: д.т.н., проф.
Иванова Галина Сергеевна 1

4.1 Процедуры и функции
Процедуры и функции – самостоятельные фрагменты программы, соответствующим образом оформленные и вызываемые по имени (программные блоки).
Программный блок:
Заголовок |
Раздел |
Раздел |
; |
|
блока |
описаний |
операторов |
||
|
Процедура:
procedure |
Идентификатор |
; |
|
|||
|
|
|
Список |
|
|
|
Функция: |
|
|
параметров |
|
||
|
|
|
|
|
||
function |
Идентификатор |
: |
Тип |
; |
||
результата |
||||||
|
|
|
Список |
|
||
|
|
|
|
|
||
|
|
|
параметров |
|
2 |
|
|
|
|
|
|

Передача данных в подпрограмму
Подпрограмма может |
Program ex; |
|
|
||
получать данные |
Var |
x:real; |
z:real; |
|
|
|
|
|
|
||
двумя способами: |
Procedure A; |
|
Обращение к |
||
|
|
||||
а) неявно – с |
|
глобальной |
|||
Var z:integer; |
|||||
использованием |
переменной |
||||
|
|
|
|||
глобальных |
Обращение к |
|
|
|
|
переменных; |
|
|
|
||
переменной |
|
Procedure B; |
|||
б) явно – через |
|
||||
вызывающей |
|
Var i:integer; |
|||
|
подпрограммы |
|
|||
параметры. |
|
Begin |
i:=z; x:=5; |
||
|
|
||||
|
Обращение к |
|
.... |
|
|
Неявная передача: |
|
End; |
|
||
глобальной |
|
|
|||
|
|
|
|||
1) приводит к |
переменной |
|
|
|
|
большому |
Begin |
|
|
||
количеству |
z:=round(x); ... |
|
|||
ошибок; |
End; |
|
|
||
2) жестко связывает |
Begin |
|
|
|
|
подпрограмму и |
... |
|
|
|
|
данные. |
End. |
|
|
3 |

Передача данных через параметры |
|
||||
Список параметров описывается в заголовке: |
|
|
|||
|
var |
|
|
|
|
( |
Идентификато |
: |
Тип |
) |
|
р |
параметра |
||||
|
|
|
|||
|
const |
|
|
|
|
|
, |
|
|
|
|
|
|
; |
|
|
|
Параметры, описанные в заголовке – формальные. |
|
При вызове подпрограммы необходимо определить фактические значения этих параметров – аргументы (константы и переменные).
Формальные и фактические параметры должны соответствовать по количеству, типу и порядку:
function proc(a:integer; b:single):byte; … n:= proc(5,2.1);
4

Способы передачи параметров
|
|
Передача по значению |
|
|
|
Передача по ссылке |
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Основная |
|
|
|
|
|
Подпро- |
|
Основная |
|
|
|
Подпро- |
||||
программа |
|
|
|
|
|
грамма |
|
программа |
|
|
|
грамма |
||||
|
Стек |
Стек |
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Копии |
Работа с |
Адреса |
Работа с |
|
копиями |
||||
|
||||
параметров |
параметрами |
|||
параметров |
||||
параметров |
||||
|
||||
|
через адреса |
|||
|
|
|||
|
|
|
||
Параметры - значения – в |
Параметры - переменные – в под- |
|||
подпрограмму передаются ко- |
программу передаются адреса фак- |
|||
пии фактических парамет- |
тических параметров, соответст- |
|||
ров, и никакие изменения этих |
венно все изменения этих парамет- |
|||
копий не возвращаются в вызы- |
ров в подпрограмме происходят с |
вающую программу. переменными основной программы.
5

Способы передачи параметров (2)
Параметры-значения при описании подпрограммы не помечаются, например:
function Beta(x:single; n:byte):integer; .
Параметры-переменные при описании подпрограммы помечаются служебным словом var, например:
function Alpha(x:single; Var n:byte):integer; .
Ограничение: в качестве фактических значений параметров-
переменных нельзя использовать литералы:
Alpha(2.5,5); // ошибка! правильно: n:=5; Alpha(2.5,n);
Параметры-константы – в подпрограмму, так же как и в случае параметров-переменных, передаются адреса фактических параметров, но при попытке изменить значение параметра компилятор выдает сообщение об ошибке; такие параметры при описании подпрограммы помечаются служебным словом const, например:
function Alpha(const x:single; n:byte); .
6

Определение площади четырехугольника
a |
|
Площадь четырехугольника определяем как |
|
|
b |
сумму площадей треугольников. |
|
e |
Площадь треугольника определяем по |
||
|
|||
d |
|
формуле Герона. |
|
|
|
||
c |
|
В качестве подпрограммы реализуем |
|
|
|
вычисление площади треугольника, |
|
|
|
поскольку эта операция выполняется два |
|
|
|
раза с разными параметрами. |
7

Схемы алгоритмов подпрограмм
Подпрограмма-функция
Начало алгоритма подпрограммы Формальные
параметры
Начало Stf(x,y,z)
Ввод |
p:=(x+y+z)/2 |
|
a,b,c,d,e |
||
|
||
Вывод |
Stf= ... |
|
Stf(a,b,e)+ |
||
|
||
Stf(c,d,e) |
|
|
|
Return |
Подпрограмма-процедура
Формальный параметр-переменная в заголовке на схеме не выделяется
|
Начало |
Stp(x,y,z,S) |
|
|
Ввод |
p:=(x+y+z)/2 |
|
|
a,b,c,d,e |
||
|
|
||
|
Stp |
S= ... |
|
|
(a,b,e,S1) |
||
Вызов |
|
||
|
|
||
проце- |
Stp |
|
|
дуры |
Return |
||
(c,d,e,S2) |
|||
|
|
Конец
Фактические Завершение параметры подпрограммы
Вывод
S1+S2
Конец
Фактическое
значение параметрапеременной8

Функция
Program Ex4_1; |
Глобальные |
|
переменные |
||
|
||
{$APPTYPE CONSOLE} |
|
|
Uses SysUtils; |
Тип |
Var A,B,C,D,E:single; |
возвращаемого |
|
значения |
||
Function Stf(const X,Y,Z: single): single; |
||
|
Var p:single; begin
p:=(X+Y+Z)/2;
Локальная
переменная
Result:=sqrt(p*(p-X)*(p-Y)*(p-Z)); // или Stf:=..
end; Begin
WriteLn('Input a,b,c,d,e:'); ReadLn(A,B,C,D,E);
Вычисление
возвращаемого
значения
WriteLn('S=',Stf(A,B,E)+Stf(C,D,E):7:3);
ReadLn;
End. |
Вызов |
|
|
функции из |
|
|
выражения |
9 |

Процедура
Program Ex4_2; |
Глобальные |
|
переменные |
||
|
||
{$APPTYPE CONSOLE} |
|
|
uses SysUtils; |
Возвращаемое |
|
|
||
Var A,B,C,D,E:real; S1,S2:single; |
значение |
|
Procedure Stp(const X,Y,Z:single;var S:single); |
||
Var p:single; |
Локальная |
|
|
||
begin p:=(X+Y+Z)/2; |
переменная |
|
S:=sqrt(p*(p-X)*(p-Y)*(p-Z)); |
||
end; |
|
|
Begin |
|
|
WriteLn('Input a,b,c,d,e'); |
ReadLn(A,B,C,D,E); |
|
Stp(A,B,E,S1); |
Вызов |
|
|
||
Stp(C,D,E,S2); |
процедуры |
WriteLn('S= ',S1+S2:7:3);
ReadLn;
End. |
10 |