ПРЕДВАРИТЕЛЬНЫЕ ЗНАНИЯ:
Подпрограмма (п/п) – это повторяющаяся группа операторов, оформленная в виде самостоятельной программной единицы. Она записывается однократно, а в соответствующих местах основной программы обеспечивается лишь обращением к ней по имени.
(или: подпрограмма – специальным образом оформленная программа, к которой можно обращаться из любой точки основной программы.)
2. Использование п/п позволяет:
сократить объем программы;
улучшить структуру программы с точки зрения ее читаемости и наглядности;
облегчает процесс отладки.
В Паскале подпрограммы реализованы в виде Функций и Процедур
Все переменные, а также другие объекты, описанные в подпрограмме, являются локальными и действуют только внутри этой подпрограммы. Никакой связи между ними и объектами вызывающей программы (основной), имеющими такие же имена, нет.
Параметры, указанные в описании подпрограммы называются формальными
Обращение к подпрограмме записывается в виде имени подпрограммы, за которым следует заключенный в скобки список параметров, отделенных друг от друга запятыми. Эти параметры называются фактическими и их количество, последовательность и тип должны совпадать с типом, количеством и последовательностью формальных параметров.
ПРОЦЕДУРЫ
Когда подпрограмма вырабатывает не одно (как функции), а несколько значений, или вообще их не вырабатывает, то она оформляется как процедура. Имя процедуры (как и функции) дается программистом.
Т.к. процедура не обязана возвращать значение, поэтому нет необходимости указывать тип, как в заголовке функции
Формат процедуры:

Procedure имя ( , , ; var , , );
Список переменных (и их типов), требующихся для передачи выработанных процедурой значений
Список формальных параметров (игроков)
и их типов.
BEGIN
….
Тело процедуры
….
END;
! Поскольку процедура не возвращает значение, нельзя включать вызов процедуры в выражение или в оператор WRITE
Сравнительное описание функции и процедуры:
| Function pr(a, b:integer): integer; Begin
Результат работы функции – одно значение Pr:=a+b End; |     Procedure pr(a, b:integer; var c, d, x, y: integer); Begin
Из этих переменных можно будет «забирать» и использовать полученные значения  C:=a+b; D:=a-b;  X:=a*b; Y:=a div b End; |
Примеры (для работы на компьютере с разбором)
Процедура без параметров
Описать процедуру, выводящую на экран сообщение: «Внимание!». (В рабочих программах этим сообщением может быть объемная инструкция)
| Procedure pr ; Begin Writeln ('Внимание!') End; | Вызов процедуры: …; …;
На экране появится сообщение «Внимание!» Pr; … |
Процедура с одним параметром
Описать процедуру, выводящую на экран сообщение: «Внимание!» «заказанным» при вызове цветом
| Procedure pr (a:integer) ; Begin Textcolor (a); Writeln ('Внимание!') End; | Вызов процедуры: … …
На экран выводится сообщение красным цветом (номер цвета может находиться в переменной) Pr(4); В:=6; Pr(B);… |
Процедура с несколькими входными параметрами
Описать процедуру, выводящую на экран сообщение «Внимание!» «заказанным» цветом в «заказанной» позиции экрана.
| Procedure pr (a,b,c:integer) ; Begin Textcolor (a); Gotoxy(b,c); Writeln ('Внимание!') End; | Вызов процедуры: … … …
На экран выводится сообщение красным цветом в 20 позиции на 10 строчке Pr(4,20,10); … |
Процедура с несколькими входными параметрами и несколькими выходными рассчитанными значениями
Описать процедуру, выводящую на экран сообщение «Внимание!» «заказанным» цветом в «заказанной» позиции и производящую расчет трех значений.
| Procedure pr (a, b, c:integer;var x, y, z: integer) ; Begin X:=a*b; Y:=a*8+b*b; Z:=a-b; Textcolor(c); Writeln ('Внимание!') End; | Вызов процедуры: … … Pr(4, 8, 3; k, l, m); … Z:=m+k; … На экран выведется надпись цветом № 3, в переменные k, l, m будут записаны выработанные значения, которые можно будет использовать в дальнейшей работе. |
Задания для самостоятельной работы:
Описать процедуру, которая выводит на экран изображение стрелки (–) в заданной позиции;
Описать процедуру, которая помещает в центр экрана сообщение «STOP!» и, после паузы, удаляет его;
Описать процедуру, рассчитывающую площадь и периметр прямоугольника;
Описать процедуру, рассчитывающую площадь и объем куба;
Описать процедуру, которая вычисляет сумму двух чисел и выводит эту сумму на экран;
Описать процедуру, которая переводит рубли в доллары и евро.
Варианты проверочной работы:
(В некоторых вариантах не используется одна из переменных основной программы)
Вар. 1 Что будет напечатано на экране в результате выполнения программы:
Program prim;
Var m,n:integer;
Procedure a(x,y:integer; var z : integer );
begin
Ответ:
2
6
Ответ:
82
Ответ:
6
10
writeln (x+y);
z:=x+y*2
end;
BEGIN
m:=4;
a (2,m,n);
writeln(n)
END.
Вар. 2 Что будет напечатано на экране в результате выполнения программы:
Program prim;
Var m,n:integer;
Procedure a(x:integer);
begin
write (2*x);
end;
BEGIN
m:=2;
a (4);
writeln (m)
END.
Вар. 3 Что будет напечатано на экране в результате выполнения программы:
Program prim;
Var m,n:integer;
Procedure a(x,y:integer; var z : integer );
begin
writeln (x);
z:=x+y
end;
BEGIN
a (2,4,n);
writeln(n)
END
Вар. 4 Что будет напечатано на экране в результате выполнения программы:
Program prim;
Var m,n:integer;
Procedure a(x:integer; var y,z: integer );
begin
Ответ:
15
y:=2*x;
z:=3*x
end;
BEGIN
a (3,m,n);
writeln(m+n)
END.
Вар. 5 Что будет напечатано на экране в результате выполнения программы:
Program prim;
Var m,n:integer;
Procedure a(x,y:integer);
Begin
writeln(x+y)
Ответ:
6
24
end;
BEGIN
m:=2;
n:=4;
a(m,n);
writeln(m,n)
END.
Вар. 6 Что будет напечатано на экране в результате выполнения программы:
Program prim;
Var m,n:integer;
Procedure a(x:integer; var y: integer);
begin
Ответ:
x
6
Ответ:
2*x
6
y:=2*x;
writeln('2*x')
end;
BEGIN
m:=3;
a(m,n);
writeln(n)
END.
Вар. 7 Что будет напечатано на экране в результате выполнения программы:
Program prim;
Var m,n:integer;
Procedure a(x:integer; var y: integer);
begin
y:=2+x;
writeln('x')
end;
BEGIN
a(4,m);
writeln(m)
END.
Вар. 8 Что будет напечатано на экране в результате выполнения программы:
Program prim;
Var m,n:integer;
Procedure a(x:integer; var y: integer);
begin
Ответ:
6
x
Ответ:
9
3
Ответ:
3
3
y:=2*x;
writeln(x)
end;
BEGIN
m:=3;
a(m,n);
writeln(m)
END.
Вар. 9 Что будет напечатано на экране в результате выполнения программы:
Program prim;
Var m,n:integer;
Procedure a(x,y:integer);
begin
writeln(x+y);
Ответ:
6
x
Ответ:
9
3
writeln(x)
end;
BEGIN
m:=3;
n:=4;
a(m,n)
END.
Вар. 10 Что будет напечатано на экране в результате выполнения программы:
Program prim;
Var m,n:integer;
Procedure a(x,y:integer);
begin
writeln(x+y);
writeln('x')
end;
BEGIN
m:=2;
n:=4;
a(m,4)
END.
Вар. 11 Что будет напечатано на экране в результате выполнения программы:
Program prim;
Var m,n:integer;
Procedure a(x:integer; var y: integer);
begin
y:=2*x;
Ответ:
8
4
Ответ:
4
8
Ответ:
4
8
writeln(x)
end;
BEGIN
a(4,m);
writeln(m)
END.
Вар. 12 Что будет напечатано на экране в результате выполнения программы:
Program prim;
Var m,n:integer;
Procedure a(x,y:integer);
begin
writeln(x);
writeln(x+y)
end;
BEGIN
m:=4;
a(m,4)
END.
Вар. 13 Что будет напечатано на экране в результате выполнения программы:
Program prim;
Var m,n:integer;
Procedure a(x:integer; var y: integer );
begin
y:=x;
writeln (2*x);
end;
BEGIN
m:=4;
a (m,n);
writeln(n)
END.
Вар. 14 Что будет напечатано на экране в результате выполнения программы:
Program prim;
Var m,n:integer;
Procedure a(x,y:integer);
begin
Ответ:
8
4
Ответ:
x
4
writeln ('x');
writeln (y);
end;
BEGIN
m:=4;
a (m,4);
END.
Пример процедуры, использующей локальные переменные:
Процедура, выводящая на экран «цепочку» из тире «заказанного» количества звеньев:
Описание процедуры:
procedure pr(a:integer);
var i: integer; {i – локальная переменная}
begin
for i:=1 to a do
write ('– ')
end;
Вызов процедуры в программе:
…
…
For i:=1 to 5 do {i – переменная из основной программы}
begin
pr(i);
writeln
end;
…
…
Результат выполнения фрагмента:
–
– –
– – –
– – – –
– – – – –