max_m(n,a,max,kmax );
Подпрограммы. Функции и процедуры.
Если в программе имеется несколько одинаковых фрагментов, то возникает вопрос: нельзя ли оформить повторяющийся фрагмент в виде отдельного блока, а затем обращаться к нему несколько раз. Аналогичная идея возникает при отладке больших программ – если разбить программу на отдельные блоки, то отладить ее по частям будет проще. На языке Паскаль подпрограммы реализуются в виде функций или процедур.
Функции и процедуры реализуют принципы структурного программирования.
К функциям и процедурам обращаются если необходимо:
- разбить большую задачу на несколько меньших по объему и сложности задач;
- уменьшить объем программы за счет выделения типовых программных действий в функции или процедуре;
- создание программных модулей, которые могут быть использованы и в других программах.
Структура программы, содержащей процедуру (функцию)
program <имя>;
<описательная часть основной прогаммы>;
procedure <имя процедуры>;
(function <имя функции>;)
<описательная часть процедуры/функции>;
begin
<исполнительная часть процедуры/функции>;
end;
begin
<исполнительная часть основной программы>;
end.
Процедуры ( функции ) могут содержать любые операторы языка Паскаль и повторяют структуру основной программы, только текст процедуры ( функции) - заканчивается «;».
Процедуры
Процедура – это независимая именованная часть программы, которую после однократного описания можно многократно вызывать по имени.
Первая строка любой процедуры:
procedure <имя>(<список формальных параметров>);
<имя> - уникальный идентификатор, строится по правилам составления имен простых переменных;
<список формальных параметров> - список имен переменных с указанием их типа, передающих информацию в процедуру и возвращающих результаты в основную программу.
Обращение к процедуре из основной программы:
<имя> (<список формальных параметров>);
<список фактических параметров> - список переменных или констант, разделенных запятыми.
Например:
procedure prim(x:real; var s:integer; z,y:integer);
Описан заголовок процедуры где:
x, z, y - передают информацию в процедуру;
s - передает информацию в процедуру и возвращает результат - в основную (можно сказать процедура изменяет значение s, хотя значение s в основной программе может быть до процедуры и не определено).
Чтобы формальный параметр возвращал результат в основную, его необходимо описать с использованием служебного слова var.
Обращение к процедуре из основной:
prim (x, s, z, y); ( имена фактических параметров x, s, z,y - совпадают с именами формальных)
или
prim (a, s1, b, 5); ( именами фактических параметров a, s1, b – не совпадают с именами формальных, а последний фактический параметр является числовой константой)
Формальные и фактические параметры должны совпадать по типу, количеству и порядку следования. Фактические параметры должны быть описаны в основной программе. Они называются глобальными переменными и доступны как в основной программе, так и в процедуре. Формальные параметры отдельно в процедуре не описываются. Время существования глобальных переменных – от начала и до конца работы программы.
Промежуточные переменные, которые используются только в процедуре, описываются в процедуре и называются локальными. Локальные переменные не доступны в основной программе. Время существования локальных переменных – от начала и до конца работы процедуры, в которой они описаны.
Задача.
Задан одномерный массив вещественных чисел. Найти максимальный элемент массива и определить его номер.
Составим программу с использованием двух процедур:
· процедура ввода элементов массива;
· процедура поиска максимального элемента и определение его номера.
Для передачи массива в процедуру введем пользовательский тип mas.
Program PP;
Type
mas=array[1..100] of integer; {пользовательский тип}
var { глобальные переменные }
a:mas;
max:real;
n,max,kmax:integer;
procedure input_mas(n:integer ; var a:mas );
var i:integer; {локальная переменная}
Begin
for i:=1 to n do readln(a[ i ]);
End;
procedure max_m(n:integer; a:mas; var max,kmax:integer );
var i:integer;
Begin
max:=a[1];kmax:=1;
for i:=1 to n do
if a[i]>max then
begin max:=a[i]; kmax:=i; end;
End;
Begin
writeln(‘ Введите n<=100’) ; readln( n );
writeln (‘ Введите элементы массива ‘);
Input_mas(n,a);
max_m(n,a,max,kmax );
writeln(‘max=’,max,‘kmax=’,kmax);
Readln;
End.
Функции
Если результатом подпрограммы является только одно значение, то имеет смысл оформить такую подпрограмму в виде функции.
Первая строка любой функции:
function <имя >(<список формальных параметров> ):<тип>;
<список формальных параметров> - список имен переменных с указанием их типа, передающих информацию в функцию;
<имя> - возвращает результат в основную программу;
<тип> - тип возвращаемого результата.
Обращение из основной программы к функции возможно в структуре какого либо оператора, например оператора присваивания:
<переменная>:= <имя> (список фактических параметров);
Функция возвращает в основную программу только один результат через переменную, являющуюся именем функции. Эта переменная не должна быть описана в основной программе. В описательной части функции этой переменной должно быть присвоено какое-либо значение, иначе функция не возвращает никакого значения.
Задача.
Составить программу вычисления n! с использованием функции.
n! = 1* 2 * 3 * …* n
Program factorial;
{описательная часть основной программы}
Var
n,k:integer;
function fun(k:integer):integer;
{описательная часть подпрограммы}
Var
p,i:integer;
Begin
{исполнительная часть подпрограммы}
p:=1;
for i:=1 to k do
p:=p*i;
fun:=p;
End;
{ исполнительная часть основной программы }
Begin
writeln('введите n');
Readln(n);
for k: = 1 to n do
writeln(fun(k));
End.
n, k - глобальные переменные.
p, i - локальные переменные.
fun - имя функции, возвращает результат в основную программу.
Имя функции в теле функции в операторах присваивания может стоять только слева от знака «:=» , поэтому использована дополнительная переменная p для подсчета произведения.
<== предыдущая лекция | | | следующая лекция ==> |
Публично-правовые образования как субъекты гражданского права | | | Половое созревание и половая зрелость |
Дата добавления: 2017-06-02; просмотров: 289;