Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
000161_03_006_Kafedra_IT-Lektsii_po_distsipline....doc
Скачиваний:
15
Добавлен:
20.04.2019
Размер:
717.31 Кб
Скачать

Параметры процедур и функций

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

Если формальный параметр описан со служебным словом var, то его называют параметром-переменной и говорят, что он передается по ссылке. Если же параметр описан без слова var, то его называют параметром-значением и говорят, что он передается по значению.

Если параметр передается по значению, то при вызове подпрограммы значения фактических параметров присваиваются соответствующим формальным параметрам. Например, пусть имеется следующее описание процедуры:

procedure PrintSquare(i: integer); begin   writeln(i*i); end;

Тогда при вызове PrintSquare(5*a-b) значение 5*a-b будет вычислено и присвоено переменной i, после чего выполнится тело процедуры.

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

procedure Mult2(var a: integer); begin   a:=a*2; end;

то после вызова Mult(d) значение d увеличится в 2 раза.

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

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

procedure Print(var a: array [1..10] of integer; n: integer); var i: integer; begin   for i:=1 to n do     write(a[i],' ');   writeln; end;

Параметр может быть также описан со служебным словом const. Это означает, что он передается по значению, но менять его в подпрограмме запрещено. Например:

procedure PrintSquare1(i: integer); begin   i:=i*i; // верно   writeln(i); end; procedure PrintSquare2(const i: integer); begin   i:=i*i; // ошибка!!!   writeln(i); end;

Локальные и глобальные переменные

Переменные, описанные в разделе описаний подпрограммы, называются ее локальными переменными. Переменные же, описанные вне подпрограммы, называются глобальными по отношению к ней.

Параметры подпрограммы считаются ее локальными переменными.

Е сли имя локальной переменной совпадает с именем глобальной переменной, то локальная переменная скрывает глобальную, так что к глобальной переменной нельзя обратиться внутри подпрограммы. Например:

var i: real;

procedure p;

var i: integer;

begin

// к глобальной переменной i внутри процедуры нельзя обратиться

i:=5; // присваивание локальной переменной i; ...

end;

Пример 1.

Написать программу, рассчитывающую площадь круга и выводящую его значение на экран (рис.1)

Программа:

program S_krug;

uses CRT; // для вывода в отдельном окне

var

r,S: real;

begin

write('Введите радиус круга R = ');

readln(r);

s:= Pi*sqr(r);

write('Площадь круга S = ',S:8:2);

end.

Пример 2.

Написать программу, которая запросит число X и выведет на экран информацию о его знаке (положительное, отрицательное или нуль). (рис.2)

Программа:

program znak;

uses CRT; // для вывода в отдельном окне

var

X: real;

b egin

write('Введите X = ');

readln(X);

if X > 0 then writeLn('X положителен')

else if X < 0 then writeLn('X отрицателен')

else writeLn('X равен нулю');

end.

Пример 3.

Написать программу, которая запросит четыре числа A, B, C, D и выведет на экран «Правда» или «Неправда» на вопрос: «Правда ли, что первое число самое большое?».

Программа:

program from4;

uses CRT; // для вывода в отдельном окне

var

A,B,C,D: real;

begin

write('Введите значения A,B,C,D = ');

readln(A,B,C,D);

if (A>B) and (A>C) and (A>D) then writeLn('Правда')

// сопоставляемые значения берутся в скобки, т.к. действие

// and имеет более высокий приоритет чем сравнение >

else writeLn('Неправда');

end.