Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Процедуры и функции лекция 4.docx
Скачиваний:
4
Добавлен:
14.04.2019
Размер:
34 Кб
Скачать

Процедура без параметров:

Var a,b: integer;

procedure P;

begin

b:=a+b;

writeln(b);

end;

Begin

a:=1; b:=2;

P;

a:=5; b:=9;

P;

readln;

End.

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

В данном случае фрагмент текста программы, объявленный процедурой, весьма невелик, существенного выигрыша мы не получили. Но,

Если бы этот фрагмент был большим, выигрыш был бы очевиден.

Процедура с параметрами:

Введенная нами в употребление процедура не очень удобна, т.к. ее назначение зафиксировано слишком жестко. Исходными значениями могут служить только a и b, а выходным – b. Но нашу программу можно записать так:

var a,b,x,y: integer;

procedure P(d: integer, c: integer;);

begin

c:=d+c;

writeln(c);

end;

Begin

a:=1; b:=2;

P(a,b);

x:=5;y:=9;

P(x,y);

readln;

End.

Идентификаторы d , c являются формальными параметрами процедуры, x , y - фактическими. Формальные параметры указываются в заголовке процедуры, при этом для каждого формального параметра должно быть указано имя типа. При обращении к процедуре в программе вслед за именем процедуры надо в круглых скобках задать список фактических параметров. Соответствие между фактическими и формальными параметрами устанавливается путем их сопоставления в обоих списках: первый по порядку фактический параметр соответствует первому формальному параметру, второй – второму и т. д.

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

В отличие от формального параметра-значения, фактическим параметром для которого может быть. любое выражение соответствующего типа (не x, y, a, b, а 2*x, x*y и т.д.), для параметра–переменной фактическим параметром может быть только переменная.

Передача массива в процедуру (массив является параметром)

Пример 2

Написать процедуру определения максимального элемента массива.

Const n=30;

Type Massiv = array [1..n] of real;

Var a: Massiv;

amax: real;

procedure MaxZn ( var x: Massiv, var xmax: real);

Var k,I : integer;

begin

for i:=1 to n do readln (x[i]);

xmax := x[1];

for i:=2 to n do

if xmax < x[i] then xmax := x[i];

end;

Begin

MaxZn (a,amax);

Writeln ( ‘максимальное значение = ‘, amax :7:2 );

readln;

End.

Пример 3.

Использовать процедуру-функцию для вычисления максимальных значений нескольких одномерных массивов.

Program Prg 30;

Const n=10;

Type massiv=array[1..n] of real;

{Программа определения максимума в разных массивах}

Var a:massiv;

L, kolmas: integer;

amax: real;

Procedure MaxZn(Var x:massiv; Var xmax: real);

Var

k, i: integer;

begin

writeln(‘ввести количество элементов в массиве’); readln(k);

writeln(‘введите массив, аосле каждого числа нажать Enter’);

for i:=1 to k do readln(x[i]);

xmax:=x[1];

for i:=2 to k do

if xmax<x[i] then xmax:=x[i];

end;

Begin

Writeln(‘скилько массивов обрабатываем?’);

Readln(kolmas);

For L:=1 to kolmas do begin

MaxZn(a, amax);

Writeln(‘максимальное значение=’, amax:7:2);

end;

End.

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

При обращении к процедуре в главной программе указывается имя процедуры MaxZn, а в скобках – фактические параметры a и amax , которые отвечают формальным параметрам x и xmax.

Результат анализа возвращается в главную программу через параметр-переменную xmax/ amax. Параметр х явояется также параметром-переменной с целью экономии памяти и времени (на создание копии массива).

Процедура вызывается в цикле несколько раз в зависимости от количества массивов, которые обрабатываются.

Пример 4.

Заданы масивы x[10], y[30], z[18] целых чисел, необходимо эти масивы ввести и в каждом из них найти его минимальный элемент и его индекс.

Program MASSIV;

Uses Crt;

Var x: array [0..9] of integer;

y: array [0..29] of integer;

z: array [0..17] of integer;

i: byte;

xmin, ixmin, ymin, iymin, zmin,

izmin: integer;

Procedure Pmin(m: array of integer; Var min: integer; Var imin: byte);

Begin

min:=m[1]; imin:=1;

for i:=0 to High(m) do if m[i]<min then

begin

min:=m[i]; imin:=i;

end;

end;

Begin

Writeln(’Ввод масива x’);

for i:=0 to 9 do read (x[i]); readln

Pmin(x, xmin, ixmin);

Writeln(’xmin=’,xmin:6,’ixmin= ’,ixmin);

Writeln(’Ввод масива y’);

for i:=0 to 29 do read(y[i]); readln;

Pmin(y, ymin, iymin);

Writeln(’ymin= ’,ymin:6,’iymin= ’,iymin);

Writeln(’Ввод масива z’);

for i:=0 to 17 do read(z[i]); readln;

Pmin(z, zmin, izmin);

Writeln(’zmin= ’,zmin:6,’izmin= ’,izmin);

End.

Пояснения к программе. В главной программе после описания и ввода фактических массивов x, y, z трижды обращаемся к процедуре. Результаты обработки каждого массива возвращаются в главную программу через фактические параметры xmin, ixmin, ymin, iymin, zmin, izmin; iглобальная переменная.

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

В самой процедуре выполняются необходимые операции над полями записи.

Пример 5.

Ввести информацию о результатах сдачи экзаменов 30 студентов (ф.и., оценки (5 предметов)). Проанализировать информацию о каждом студенте и вывести на экран средний бал каждого студента.

Uses crt;

Const N=30;

Type stud=record

fio:string[20];

ocenki:array[1..5] of integer;

End;

Var st: stud;

i,k:integer;

sredbal:real;

Procedure AnUsp(Var Formstud: stud; Var sredbal:real);

Var j:integer;

Begin

sredbal:=0;

With Formstud do begin

For j:=1 to 5 do sredbal:= sredbal+ ocenki[j];

sredbal:= sredbal/5;

End;

End;

Begin

For i:=1 to N do begin

With st do begin

Writeln(‘введите информацию о следующем студенте’);

Readln(fio);

For k:=1 to 5 do read(ocenki[k]); readln;

AnUps (st, sredbal);

Writeln(‘sredbal =’ sredbal:5:2);

End;

End;

End.

Пояснения к программе. Здесь обеспечивается ввод данных о результатах экзаменов N студентов, информация о каждом студенте анализируется в процедуре AnUps. Такая процедура принимает запись St/Formstud и возвращает средний бал.

Подпрограмма функции используется в тех случаях, когда результатом вычислительного процесса, который она реализует, является одно значение. Это значение передается в программу, которая вызывает функцию, в виде имени функции. Обращение к подпрограмме-функции выполняется из какого-нибудь арифметического выражения так, как и к стандартным функциям типа Sin(x), Cos(x).

Структура подпрограммы функции имеет вид:

Function <имя > (список формальных параметров): <тип имени>;

(раздел локальных данных)

Begin {раздел исполняемых операторов}

……..

имя:=………..;

еnd;

Пример 6.

Использовать подпрограмму-функцию для вычисления выражения:

Y=n!/(m!(n-m)!)

Program Prg35;

{использование функции для вычисления факториала}

Var

n,m,y: byte;

Function F(p:byte):integer;