Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тurbo Pascal 7+.doc
Скачиваний:
12
Добавлен:
24.12.2018
Размер:
10.09 Mб
Скачать

13.4. Массивы как параметры

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

Задача. Имеется два массива, по два числа в каждом. Напечатать сумму элементов каждого массива. Использовать функцию sum, единственным параметром которой является имя суммируемого массива.

Программа:

TYPE vector =array [1..2] of Integer;

VAR a,b :vector;

FUNCTION sum (c:vector):Integer;

BEGIN sum:=c[1]+c[2] END;

BEGIN

a[1]:=10; a[2]:=20;

b[1]:=40; b[2]=50;

WriteLn (sum(a),' ',sum(b));

END.

Начиная вычислять функцию sum(a), Паскаль подставляет в ячейки для элементов массива с значения элементов массива а. Начиная же вычислять функцию sum(b), Паскаль подставляет в ячейки для элементов массива С значения элементов массива b.

В заголовке функции неправильно было бы писать

function sum (с: array [1..2] of Integer):Integer.

Необходимо было сначала определить тип массива в разделе TYPE, а затем использовать это определение и в описании а и b, и в заголовке функции. Таково требование синтаксиса Паскаля.

Задание 122.

В школе два класса. В каждом - 5 учеников. Каждый ученик получил отметку на экзамене по физике. Определить, какой из двух классов учится ровнее (будем считать, что ровнее учится тот класс, "в котором разница между самой высокой и самой низкой отметкой меньше).

Указание. Создать функции min(c:vector), max(c:vector) и raznitsa(c:vector).

13.5. Параметры-значения и параметры-переменные

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

VAR x: Integer;

PROCEDURE B (y:Integer);

BEGIN х:=х+у END;

BEGIN

x:=1000;

B(1);

WriteLn(x)

END.

Будет напечатано число 1001.

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

VAR х: Integer;

PROCEDURE B (y:Integer; var c :Integer);

BEGIN c:=c+y END;

BEGIN

x:=1000;

B(1,x);

WriteLn(x)

END.

Здесь у - хорошо знакомый нам параметр. Называется он параметром-значением. В начале выполнения подпрограммы для параметра-значения выделяется место в стеке и туда посылается значение соответствующего фактического параметра (1).

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

Вопрос: имеет ли смысл писать B(1,1000)? Ответ: не имеет, так как подпрограмма не будет знать, какой переменной присваивать результат 1001. Естественно, Паскаль выдаст сообщение об ошибке.

Задание 123

На двух станциях (А и В) в течение года измерялась температура. Соответственно созданы два массива чисел длиной 365. Затем оказалось, что на станции. А термометр все время показывал температуру на 2 градуса выше настоящей, а на станции В - на 3 градуса. ниже. Написать процедуру с двумя параметрами, которая исправляет исходный массив. Один формальный параметр - величина поправки, другой - параметр-переменная - массив температур.