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

Лабораторная работа 12 параметры-константы, нетипизированные параметры подпрограмм, массивы и строки открытого типа

Цель работы

Изучение других видов параметров подпрограмм и способов их использования с целью придания подпрограммам большей универсальности.

Методические указания

Последние версии языка содержат средства, позволяющие разработчику создавать более гибкие программы. Основу таких средств, наряду с ранее рассмотренными (работы 10, 11), составляют нетипизированные параметры подпрограмм, а также особые виды параметров - одномерные массивы не объявляемого (скрываемого) размера.

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

function Summa(const matrix : tip) : real;

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

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

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

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

Пример 1. Сравнить n байтов двух переменных и вывести сообщение.

program Privedenie_Tipa;

const n = 10; {Число элементов в векторе}

type stroka = array[1..n] of word; {Каждый элемент занимает 2 байта}

matrix = array[1..n] of stroka;

const {Типизированные константы}

a : stroka = (1, 2, 3, 4, 5, 1, 2, 3, 4, 5); {Объекты для }

b : stroka = (1, 2, 3, 4, 5, 6, 7, 8, 4, 5); {побайтового}

var c : matrix; {сравнения}

j, k, sb : word;

function Yes(var x, y; m : word) : boolean; {Функция сравнения m байтов}

type {Локальный тип-массив, заведомо вмещающий x и y}

tip = array[1..Maxint] of byte;

var i : word;

begin i := 0;

repeat i := i + 1;

until (i = m) or (tip(x)[i] <> tip(y)[i]);

if tip(x)[i] <> tip(y)[i] then Yes := false else Yes := true end;

begin {Основная программа}

write(‘Массив a : ’);

for j := 1 to n write(a[j] : 3); writeln; {Вывод для контроля вектора a}

write(‘Массив b : ’);

for j := 1 to n write(b[j] : 3); writeln;

{Создаем матрицу c для сравнения, например так:}

c[1] := a; c[2] := b;

for j := 3 to n do for k := 1 to n do

if j mod 2 = 0 then c[j, k] := 1 else c[j, k] := 0;

writeln(‘Введите число первых сравниваемых в векторах a,b байтов’);

readln(j); if Yes(a, b, j)

then writeln(‘Первые ’, j, ‘ байтов совпали’)

else writeln(‘Первые ’, j, ‘ байтов разные’);

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

readln(k); if Yes(a, b, 2*k)

then writeln(‘Первые ’, k, ‘элементов векторов a и b совпали’)

else writeln(‘Первые ’, k, ‘элементов векторов a и b разные’);

write(‘Первые 5 и последние 5 элементов вектора a’);

if Yes(a[1], a[6], 10) then writeln(‘одинаковые’) else writeln(‘разные’);

writeln(‘Матрица c : ’); {Выведем матрицу для контроля}

for j := 1 to n do begin for k := 1 to n do write(c[j, k] : 4); writeln end;

writeln(‘Введите номера сравниваемых строк матрицы’);

readln(j, k); writeln(‘Сколько байтов в них сравнить?’); readln(sb);

if Yes(c[j], c[k], sb)

then writeln(sb, ‘ байтов строк ’, j, ‘ и ’, k, ‘ совпадают’)

else writeln(sb, ‘ байтов строк ’, j, ‘ и ’, k, ‘ разные’) end.

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

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

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

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.

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

Массив открытого типа - это такой формальный параметр, тип индексов которого, т.е. размер, не объявляется. Он может быть параметром-переменной, параметром-значением и параметром-константой. Индексация элементов массива ведется от нуля, а индекс последней компоненты определяется с помощью функции High. Рассмотрим использование массива открытого типа на примере.

Пример 3. Решить задачу примера 2 с помощью массива открытого типа.

program Otkr_Massiv;

const {Задаем исходные массивы}

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

b : array[1..4] of real = (6, 7, 8, 9);

function Sum_Otkr(z : array of real) : real; {z - массив открытого типа}

var i : byte; s : real;

begin s := 0;

for i := 0 to High(z) do {Нумерация элементов z от нуля!}

s := s + z[i];

Sum_Otkr := s end; {Sum_Otkr}

begin {Основная программа}

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

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

end.

Итак, массив открытого типа позволяет сократить число передаваемых в подпрограмму параметров.

Для описания в заголовке подпрограммы строки открытого типа используется специально введенный тип данных - OpenString. Можно также применять тип String в сочетании с ключом {$P+}, указываемым перед заголовком подпрограммы. Данный параметр может быть параметром-константой, параметром-значением и параметром-переменной.

Контрольные вопросы

  1. Как выполняют явное приведение типа?

  2. С какой целью используется директива absolute?

  3. Какой размерности может быть массив открытого типа?

  4. Где используется тип OpenString?

  5. Что можно определить с помощью функции High?

  6. Как работают с нетипизированными параметрами?

  7. Когда следует использовать массив открытого типа как параметр-значение?

  8. Можно ли в программе примера 1 сравнивать векторы с разнотипными компонентами?

  9. Как правильно выбрать размер локального типа-массива при работе с нетипизированными параметрами?

  10. Найдите для примера 2 сумму элементов двух векторов, если вектор x состоит из компонент типа word, а вектор y - типа byte.

Варианты задания

  1. Построчно подсчитать сумму элементов матриц 2х3 и 3х3 с использованием в подпрограмме массива открытого типа.

  2. Используя подпрограммы нахождения минимума и максимума вектора с параметром массив открытого типа, найти минимальный из максимальных элементов строк матриц 3х3 и 4х5.

  3. С помощью подпрограммы с массивом открытого типа организовать ввод и вывод матриц 3х2 и 4х4.

  4. Отсортировать по нарастанию строки матриц 4х5 и 3х3 с использованием массива открытого типа.

  5. Используя массив открытого типа, вычислить сумму элементов главных диагоналей матриц 5х5 и 3х3.

  6. Используя нетипизированный параметр в подпрограмме, найти максимальные элементы в векторах из 4 и 8 компонент.

  7. Используя нетипизированный параметр в подпрограмме, вычислить среднее значение элементов векторов из 5 и 7 компонент.

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

  9. С помощью подпрограммы вычислить среднее значение вещественных элементов для двух векторов: из 5000 и из 100 компонент. Значения элементам задать случайным образом.

  10. Используя подпрограмму с нетипизированным параметром, рассчитать среднее значение порядковых номеров символов массивов из 3000 и из 200 компонент, выбранных случайным образом.

  11. С помощью подпрограммы с нетипизированным параметром найти суммы элементов, делящихся на 6, для векторов из 8 и 11 компонент.

  12. Используя директиву absolute, найти с помощью одной подпрограммы минимальные элементы векторов из 7 и из 9 компонентов.

  13. Используя директиву absolute, отсортировать по убыванию с помощью одной подпрограммы векторы из 10 и 14 вещественных компонент.

  14. Отсортировать по убыванию строки матриц 3х4 и 2х5 с помощью подпрограммы сортировки вектора с нетипизированным параметром.

15. С помощью подпрограммы с параметром массив открытого типа пре-

образовать матрицы чисел 3х4 и 2х5 в матрицы с элементами булев-

ского типа: true - если соответствующий элемент матрицы < 5 и - false

в противном случае.

16. С помощью подпрограмм ввода и вывода вектора с нетипизированным

параметром ввести и вывести матрицы 4х4 и 5х3.

17. Используя директиву absolute, создать построчно с помощью

подпрограммы матрицы 5х5 и 2х3.

18. С помощью подпрограммы с массивом открытого типа подсчитать

сумму элементов в столбцах матриц 5х3 и 3х4.

19. С помощью подпрограммы определить количество символов ‘п' и ‘у’ в

строках из 100 и 300 символов.

20. Используя подпрограмму с массивом открытого типа, найти в 5- и 7-

компонентных векторах ближайшие к их среднему значению элементы.

21. Используя подпрограмму с нетипизированным параметром, перепи-

сать строки матриц 3х4 и 2х6 в обратном порядке.

22. Используя подпрограмму с нетипизированными параметрами, преоб-

разовать исходный вектор данных в код и обратно.

23.Используя параметр строка открытого типа, отсортировать по нарастанию строки из 10 и 12 символов.

24. Используя подпрограмму с массивом открытого типа, найти дисперсию для 5- и 8-компонентных векторов.

25. Используя подпрограмму с массивом открытого типа, подсчитать количество четных элементов в векторах из 9 и 11 натуральных компонент.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]