Подпрограмма - это повторяющаяся
группа операторов, оформленная в виде самостоятельной программной единицы. Она записывается однократно, а в соответствующих местах
программы обеспечивается лишь обращение к ней по имени.
Подпрограммы решают три важные задачи, значительно облегчающие программирование:
1. избавляют от необходимости многократно повторять в тексте программы аналогичные
фрагменты, т.е. сократить объём программы;
2. улучшат структуру программы, облегчая понимание при разборе;
3. уменьшают вероятность появления ошибок, повышают устойчивость к ошибкам программирования
и непредвиденным последствиям при модификации.
В этих разделах описываются данные, используемые только
внутри подпрограммы и являющиеся промежуточными при её выполнении. Такие
данные называются
локальными. В подпрограмме могут участвовать переменные,
описанные в главной программе. Эти данные называются глобальными,
их значения и подпрограмма, и главная программа берут из общей памяти.
Подпрограммы делятся
на две категории: процедуры и функции.
Процедура — подпрограмма,
имеющая любое количество входных и выходных данных.
Любая процедура начинается с заголовка, который
является её обязательной частью. Он состоит из служебного слова Procedure, за которым
следует имя процедуры, а в круглых скобках — список формальных параметров. После
заголовка могут идти те же разделы, что и в программе.
Procedure <Имя>(формальные параметры);
var
локальные переменные
begin
тело процедуры
end;
Процедура может быть описана без параметров и с параметрами. Параметры -это данные
из заголовка процедуры, как передаваемые её на обработку, так и получаемые в виде
результатов.
Для удобства передачи данных в процедуру и получения из
неё результата используются формальные и фактические параметры.
Формальные — условные
обозначения в описании процедуры — описываются в её заголовке. Фактические
— с которыми требуется выполнить процедуру — перечисляются при вызове процедуры.
Формальные и фактические параметры
должны соответствовать по количеству, типу и порядку следования. Формальные параметры
описываются только в заголовке процедуры и больше нигде.
Формальные параметры разделяют на параметры - значения и параметры переменные. Параметры - переменные, в отличие от параметров - значений возвращают измененное значение параметра в главную программу. Измененные, произведенные с параметрами - значениями в главную программу не передаются.
Чаще всего, параметры, соответствующие входным данным, будут являться параметрами - значениями, а те, в которых получается результат, будут параметрами - переменными.
Параметры переменные отмечают в заголовке процедуры словом var:
Procedure <Имя>(параметры - значения; var параметры - переменные);
Пример 1. Рассмотрим написание процедуры, вычисляющей сумму двух целых чисел (S = A +B) и вызов ее в главной программе:
procedure Summa(a,b:integer; var s:integer);
//a,b - параметры - значения, s - параметр - переменная
begin
s := a + b;
end;
//объявляем глобальные переменные
var
x,y,res : integer;
begin
read(x,y);
Summa(x,y,res); // x,y,res - это фактические параметры
write(res);
end. Рассмотрим для примера написание процедуры, вычисляющей сумму двух целых чисел (S = A +B) и вызов ее в главной программе:
procedure Summa(a,b:integer; var s:integer);
//a,b - параметры - значения, s - параметр - переменная
begin
s := a + b;
end;
//объявляем глобальные переменные
var
x,y,res : integer;
begin
read(x,y);
Summa(x,y,res); // x,y,res - это фактические параметры
write(res);
end.
Функция аналогична
процедуре, но имеются два отличия.
●
Функция передает
в программу результат своей работы – единственное значение, носителем которого является
имя своей функции.
●
Имя функции
может входить в выражение как операнд. Функция возвращает результат в точку своего
вызова.
Например, sqr(x) – возведет в квадрат значение х и возвратит
в точку вызова вычисленное значение квадрата числа х: y:=sqr(x);
Функция, определенная пользователем, состоит из заголовка
и тела функции. Тело функции по структуре аналогично программе. Описание меток,
констант, типов и т.д. действительны только в пределах данной процедуры.
Указать, какое значение следует возвращать функции в качестве результата можно двумя способами:
result := возвращаемый результат;
или
<Имя Функции> := возвращаемый результат;
Структура функции:
Function <Имя>(формальные параметры):тип результата;
var
локальные переменные
begin
тело процедуры
...
result := возвращаемый результат;
end;
Пример 2. Рассмотрим написание функции, вычисляющей сумму двух целых чисел (S = A +B) и вызов ее в главной программе:
Function Summa(a,b:integer):integer;
//a,b - параметры - значения тип результата - integer
begin
result := a + b;
end;
//объявляем глобальные переменные
var
x,y,res : integer;
begin
read(x,y);
res := Summa(x,y) // x,y - это фактические параметры
write(res);
end.
Пример 3. Заполнить массив по следующем правилу: на четные места
ставить номер элемента, на нечетные - номер элемента со знаком “-”.
const
n = 10;
type
miniarr = array[1..n] of integer;
var
a: miniarr;
procedure arr_pro (k:integer; var arr: miniarr);
var i: byte;
begin
writeln ('Заполнение массива через процедуру');
for i := 1 to k do
begin
if (arr[i] mod 2 = 0) then arr[i] := i;
if (arr[i] mod 2 <> 0) then arr[i] :=- i;
end;
end;
function arr_func (k:integer):miniarr;
var
i: byte;
c: miniarr;
begin
writeln ('Заполнение массива через функцию');
for i := 1 to k do
begin
if (c[i] mod 2 = 0) then c[i] := i;
if (c[i] mod 2 <> 0) then c[i] :=- i;
end;
result := c;
end;
procedure arr_out (k:integer; var arr: miniarr);
var i: byte;
begin
write ('Вывод массива: ');
for i := 1 to k do
write (arr[i]:4);
writeln;
end;
begin
arr_pro (n, a);
arr_out (n, a);
a := arr_func (n);
arr_out (n, a);
end.
Задание для самостоятельного выполнения
- Написать функцию, которая выводит простые числа и с помощью нее сгенерировать последовательность. Использовать переменную типа bollean. Вывести первые n простых чисел.
- Написать программу нахождения чисел Фибоначчи без использования рекурсии. Входной параметр функции - n, выходной - последовательность из m чисел Фибоначчи.
- Даны две дроби a/b и c/d. Написать программу для умножения дроби на дробь. Результат должен быть несократимой дробью. Для сокращения дробей (и данных и результата) нужно найти НОД (наибольший общий делитель) числителя и знаменателя. Нахождение НОД двух чисел оформить в виде процедуры.
Домашнее задание
- Дано число N. Проверить является ли оно степенью пятерки(написать функцию позволяющую распознавать степени пятерки) через рекурсию
- Описать процедуру Add(D,K), добавляющую к целому положительному числу K слева цифру D (D - входной параметр целого типа, лежащий в диапазоне 0-9, K - параметр целого типа, являющийся одновременно входным и выходным). С помощью этой процедуры последовательно добавить к данному числу K слева данные цифры.
Комментариев нет:
Отправить комментарий