Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции информатика.doc
Скачиваний:
59
Добавлен:
11.04.2015
Размер:
2.47 Mб
Скачать

5.5 Побочные эффекты при использовании подпрограмм

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

Пример: программа с побочным эффектом

var s,p: integer;

procedure Sum(n: integer, var f: integer);

var i: integer;

begin

s

~

:=0;

for i:=1 to n do s:=s+i;

f:=s;

end;

begin

s:=2;

sum(3,p);

writeln(s,p); 6 6

end.

Процедура изменяет значение глобальной переменной S (!). Надо добавить в нее описание локальной S:

procedure Sum(n: integer, var f: integer);

var i: integer;

s: integer;

begin

5.6 Передача массивов в подпрограммы

Типом формального параметра подпрограммы может быть стандартный или заранее определенный тип, заданный в виде идентификатора (!). Поэтому описание процедуры следующего вида является недопустимым:

procedure S(a: array [1..10] of real);

В связи с этим, если в качестве параметра необходимо использовать массив, то делается предварительное описание типа массива:

type mas=array [1..10] of real;

procedure s(a: mas);

begin

end;

var b: mas;

c: array [1..10] of real;

begin

S(b);

S(c); - нельзя!

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

Пример:

type mas=array [1..10] of integer;

var c,d: mas;

i: integer;

procedure S(a: mas, var b: mas);

var i: integer;

begin

for i:=1 to 10 do

begin

a[i]:=a[i]*5;

b[i]:=b[i]*5;

end;

end;

begin

for i:=1 to 10 do

begin

c[i]:=1;

d[i]:=1;

end;

s(c,d);

for i:=1 to 10 do write (c[i]:3); 1 1 1 1 1 1 …

writeln;

for i:=1 to 10 do write (d[i]:3); 5 5 5 5 5 5 …

end.

Следующие три пункта 5.7, 5.8 и 5.9 являются необязательными для изучения, хотя рассмотренный в них материал достаточно широко используется в программировании.

5.7 Параметры-костанты

В Турбо-Паскаль 7.0 существует еще один вид параметров – параметры-константы.

(const имя: тип)

В этом случае в подпрограмму передается адрес фактического параметра, но он защищен от изменений.

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

type mas=array [1..10] of real;

var a: mas;

function Summa (const x:mas): integer;

var s,i: integer;

begin

s:=0;

for i:=1 to 10 do s:=s+x[i];

summa:=s;

end;

begin

randomize;

for i:=1 to 10 do a[i]:=random(20);

writeln(‘сумма элементов массива: ’,summa(a));

end.

5.8 Массивы открытого типа

В Турбо-Паскаль 7.0 в качестве параметров-переменных можно использовать массивы открытого типа, у которых не задаются размеры. В этом случае подпрограмма может обрабатывать массив любого размера. Фактический размер массива может быть определен с помощью функции High. При описании не указывается тип индекса массива. Индексация элементов открытого массива всегда от 0 до значения функции High ( 0..high(x) , где x – имя массива).

function Summa (var x: array of real): real;

var i: integer;

s: real;

begin

s:=0;

for i:=1 to high(x) do s:=s+x[i];

summa:=s;

end;