Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Пример 1.4



Использование процедуры с параметрами без типа (1-й способ). Программа полного и частичного сравнения значений элементов массивов и записей.

Program Ravno1;

Type

Vector = Array [1..6] Of Integer;

Point = Record

Х, У: Integer

End;

Var {Объявление глобальных переменных}

Vec1, Vес2: Vector; {Vec1, Vec2 — массивы из 6 целых чисел}

N, I: Integer;

Р: Point; {Р - запись из двух целых полей Х и У}

Rеz: Boolean; {Rez — глобальная переменная, куда заносится результат выполнения процедуры Equal1}

{Процедура Equal1 сравнивает любые две переменные Source и Dest любого размера Size}

Procedure Equal1 (Vаr Source, Dest; Size: Word; Var Rez: Boolean); {Sourсе, Dest – сравниваемые переменные (параметры-переменные без типа); Size – размер полей, занимаемых сравниваемыми переменными в памяти компьютера; Rez – результат выполнения процедуры Equal1}

Var

N: Integer; {N — локальная переменная}

S: Array [0 .. Maxint] Of Byte Absolute Source; {На переданный параметр Source наложен массив байтов S}

D: Array [0 .. Maxint] Of Bуtе Аbsolute Dest; {На переданный параметр Dest наложен массив байтов D}

Begin

N:= 0;

While (N < Size) And (S [N] = D [N]) Do Inc (N); {Встроенная функция Inc (N) увеличивает значение своего аргумента на единицу. Наращивание производится в пределах размеров сравниваемых переменных в байтах (N < Size) дo тех пор, пока N-е байты массивов D и S равны}

Rez:= N = Size; {Rez равен True, если значения D и S в пределах длины Size равны (N достигло значения Size), в противном случае Rеz равен False}

End; {Конец процедуры Equal1}

Begin {Вызывающая программа}

Writeln (‘Введите значения переменных в последовательности:’);

Writeln (‘Vес1 [1] Vec1 [2] ... Vес1 [6]’);

Writeln (‘Vec2 [1] Vec2[2] ... Vec2 [6]’);

Fог I:= 1 Tо 6 Do Read (Vec1 [I]); {Ввод массива Vec1}

Read1n;

For I:=1 Tо 6 Dо Rеаd (Vес2 [I]); {Ввод массива Vеc2}

Readln;

Equal1 (Vec1, Vес2, Sizeof (Vector), Rez); {Первый оператор вызова процедуры — выполняется полное сравнение массивов Vec1 и Vес2 по всей длине Sizeof' (Vector); стандартная функция Sizeof возвращает размер памяти в байтах, занимаемый своим аргументом}

Writeln (‘Результат полного сравнения массивов = ‘, Rez); {Печать Rez}

Writeln (‘Введите количество N сравниваемых элементов массивов’);

Rеаdln (N); {Ввод N }

Equal1 (Vес1, Vес2, Sizeof(Integer) * N, Rez); {Второй оператор вызова процедуры — выполняется побайтное сравнение первых N элементов типа Integer массивов Vеc1 и Vеc2}

Writeln (‘Результат сравнения ‘, N, ‘ элементов =‘, Rez); {Печать Rez}

Equal1 (Vec1, Vес2 [3], Sizeof (Integer) * 2, Rez); {Третий оператор вызова процедуры — выполняется побайтное сравнение первых двух элементов типа Integer массива Vec1 с 3-м и 4-м элементами массива Vec2}

Writeln (‘Результат сравнения 1-го и 2-ro элементов Vec1 с 3-м и 4-м ’ + ‘элементами Vес2 =’, Rez); {Печать Rez}

Writeln ('Введите значения полей Х и У записи Р в виде: Х У’);

Readln (P. Х, Р. У);

Equal1 (Vес1 [5], Р, 4, Rez);. {Четвертый оператор вызова процедуры — выполняется побайтное сравнение 5-ro и 6-го элементов массива Vес1 с полями записи Р.Х и Р.У}

Writeln (‘Результат сравнения 5-го и 6-ro элементов массива Vec1 с ’ + ‘полями записи Р.Х и Р.У ’, Rez); {Печать Rez }

End.

Данная программа иллюстрирует возможности сравнения значений произвольных типов на примере сравнения массивов Vec1 и Vес2, состоящих из шести целых чисел, между собой и с записью Р, состоящей из двух полей целого типа Х и Y. Массивы Vес1 и Vес2 сравниваются как в полном объеме, так и по отдельным частям.

Для организации сравнения переменных любого типа использована процедура Equal1 с четырьмя параметрами — Source, Dest, Size, Rez.

Процедура выполняет сравнение переменных Source и Dest. Размер памяти, занимаемый этими переменными, определяется параметром-значением Size типа Word. Логический результат работы процедуры присваивается параметру-переменной Rez типа Boolean.

Переменные Source и Dеst оформлены в виде параметров-переменных без типа. Для обеспечения их совместимости с фактическими параметрами любого типа в теле процедуры Equal1 введены локальные переменные S и D типа массив (состоящий из Maxint+1 байта), наложенные на параметры Source и Dest соответственно (Maxint — это встроенная в язык константа, равная максимальному числу типа Integer, представимому в компьютере). При вызове процедуры переменные S и D накладываются на конкретную область памяти, занимаемую фактическими переменными, передаваемыми в качестве значений Source и Dest. Таким образом, фактические переменные, независимо от их действительного типа, будут рассматриваться как массивы байтов. Конкретное количество байтов в массиве при работе процедуры ограничивается величиной Size, передаваемой на вход процедуры в качестве параметра-значения.

Обратите внимание на то, что в данном примере использованы две различные переменные с одним и тем же именем N. Глобальная переменная N типа Integer введена в разделе Var вызывающей программы и представляет собой количество элементов входных массивов Vес1, Vec2, в пределах которых мы хотим сравнить данные массивы. Область действия глобальной переменной N — все тело программы, начиная от точки ее определения, за исключением тела процедуры Equal1, поскольку в данной процедуре введена локальная переменная типа Integer под тем жe именем N. Областью действия локальной переменной N является тело процедуры Equal1. При выходе из процедуры локальная переменная N прекращает свое существование, ее значение теряется.

В теле процедуры Equal1 последовательно сравниваются на равенство соответствующие элементы массивов S и D. При этом фактически сравниваются соответствующие байты параметров без типа Source и Dest. При их равенстве значение локальной переменной N увеличивается на единицу.

Если в результате последовательного сравнения соответствующих элементов массивов S и D окажется, что в пределах поля Size S = D, параметру-переменной Rez будет присвоено значение True, в противном случае - False.

В вызывающей программе выполняется четыре вызова процедуры Equal1.

При первом вызове процедуры Equal1 (Vес1, Vес2, Sizeof (Vесtог), Rez) осуществляется сравнение массивов Vec1 и Vec2 в пределах размера памяти, определяемого значением встроенной функции Sizeof (для аргумента Vector значение функции Sizeof равно 12 байт — напомним, что переменная типа Integer занимает поле памяти, равное двум байтам). Таким образом, выполняется полное сравнение массивов Vec1 и Vес2.

При втором вызове процедуры Equal1 (Vес1, Vec2, Sizeof (Integer) * N, Rez) выполняется сравнение первых N элементов типа Integer массивов Vес1 и Vec2.

При третьем вызове процедуры Equal1 (Vec1, Vec2 [3], Sizeof (Integer) *2, Rez) сравниваются первые два элемента массива Vес1 с третьим и четвертым элементами массива Vес2.

При четвертом вызове процедуры Equal1 (Vec1[5], P, 4, Rez) размер сравниваемых полей памяти ограничен четырьмя байтами. Поэтому сравниваются пятый и шестой элементы массива Vес1 с полями записи Р. Х и Р. У соответственно.

Помимо двух переменных с одним именем N в данной программе применены две переменные с именем Rеz. Переменная Rez, используемая в качестве фактического параметра в операторах вызова процедуры Equal1, является глобальной переменной. Она объявлена в разделе объявления глобальных переменных вызывающей программы и предназначена для занесения результата работы процедуры Equal1. Областью действия данной переменной является вся программа от точки ее объявления, исключая процедуру Equal1, где такое же имя использовано в качестве параметра-переменной. Областью действия параметра Rez является тело процедуры.





Дата публикования: 2014-12-11; Прочитано: 186 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...