Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика 2 семестр.doc
Скачиваний:
5
Добавлен:
01.04.2025
Размер:
609.28 Кб
Скачать

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

Если в качестве параметра-значения подпрограммы используется структура, то работа с ней может приводить к переполнению стека. Версия 7.0 Turbo Pascal позволяет передавать такой вид параметра как параметр-константу. Параметр-константа передается в подпрограмму копией адреса, но при этом предусмотрена защита этого параметра от изменения (изменение приводит к сообщению об ошибке). Такой параметр нельзя использовать для обращения к другой подпрограмме, он может быть любого типа, кроме файлового; его описывают в заголовке со служебным словом const. Ниже приведен пример описания параметра-константы в заголовке подпрограммы:

procedure Dispers (const v1 : vector; n : byte; var v2 : vector );.

1.3.4. Нетипизированные параметры подпрограмм

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

Явное преобразование типа осуществляется следующей конструкцией:

<Идентификатор типа> (<Переменная>).

Рассмотрим реализацию данного способа типизации на примере.

Пример 6. Найти максимальные элементы вектора v и матрицы mat, используя одну подпрограмму.

program Netipizir_Parametr;

uses crt;

const

v : array[1..10] of byte = (1, 2, 3, 4, 5, 11, 6, 7, 8, 9);

mat : array[1..3, 1..4] of byte = ((1, 2, 3, 4), (5, 6, 7, 8), (1, 1, 1, 1));

var

p, q : byte;

r : byte;

function Max(var x; r, c : byte) : byte;

type {Локальный тип-массив, к которому будет приводиться}

tip = array [1..100] of byte; {нетипизированный параметр x}

var

i, j : byte;

m : byte;

begin

m := tip(x)[1]; {Пусть первый элемент массива и есть максимальный}

for i := 2 to r*c do {r и c – количество строк и столбцов в массиве}

if tip(x)[i] > m then m := tip(x)[i];

Max := m

end;

begin

clrscr;

writeln('Максимальный элемент матpицы: ');

for p:= 1 to 3 do

begin

for q := 1 to 4 do

write(mat[p, q] : 3);

writeln;

end;

writeln(' это - ', Max(mat, 3, 4));

writeln('Максимальный элемент вектора:');

for p := 1 to 10 do

write(v[p] : 4);

writeln;

writeln(' ' : 40,' это ', Max(v, 1, 10));

writeln('Нажмите enter');

readln

end.

Второй способ типизации параметра без типа внутри подпрограммы предполагает описание в ней локальной переменной определенного типа и совмещение ее в памяти с нетипизированным параметром. Для совмещения адресов используют директиву absolute. Рассмотрим реализацию метода на конкретном примере.

Пример 7. С помощью одной подпрограммы вычислить сумму элементов двух векторов разной длины.

program Sovmes_Adress;

const {Задаем массивы с помощью типизированных констант}

x : array[1..5] of real = (1, 2, 3, 4, 5);

y : array[1..3] of real = ( 6, 7, 8);

function Summa(var z; n : byte) : real;

var {Задаем локальный массив большого размера}

w : array[1..Maxint div SizeOf(real)] of real absolute z;

i : byte; {Номер компоненты вектора}

s : real; {Текущая сумма}

begin s := 0;

for i :=1 to n do s := s + w[i];

Summa := s end; {Summa}

begin

writeln(‘Сумма элементов вектора x = ’, Summa(x, 5) : 2 : 0);

writeln(‘Сумма элементов вектора y = ’, Summa(y, 3) : 2 : 0);

end.