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

Лабораторная работа 11 подпрограммы с параметрами процедурного типа

Цель работы

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

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

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

type <имя> = procedure(<список формальных параметров>);

<имя > = function(<список формальных параметров>) :

<тип возвращаемого значения>;

например, fun = function(x : real) : real; proc = procedure;

К объявленному типу fun относятся все функции, имеющие один формальный параметр-значение типа real и возвращающие результат такого же типа. К типу proc относятся все процедуры без параметров.

Существуют следующие правила использования подпрограмм как объектов процедурного типа:

  1. подпрограммы должны компилироваться с ключом {$F+} или иметь директиву far;

  2. они не должны быть стандартными подпрограммами;

  3. они не должны объявляться внутри других подпрограмм;

  4. подпрограммы не должны иметь директив inline или interrupt.

Поясним суть наложенных на подпрограммы ограничений. Первое требование связано с организацией памяти компьютера в виде сегментов по 64 К. Абсолютный адрес любого объекта программы (в том числе и подпрограммы) складывается из номера сегмента и номера байта в сегменте. Последний называют смещением или «ближним» адресом ( по-английски - near). Абсолютный адрес - это «дальний» (far) адрес. Ключ компиляции {$F+} действует до его отмены директивой {$F-}, а действие директив far и near распространяется только на ту подпрограмму, в заголовке которой они использованы. Таким образом, ключ (директива) предписывают компилятору вести поиск нужных подпрограмм в разных сегментах памяти.

Если требуется использовать в качестве фактического параметра процедурного типа стандартную процедуру или функцию, то стандартную подпрограмму следует превратить в подпрограмму пользователя с помощью оболочки:

{$F+} function MySin(x : real) : real;

begin MySin := sin(x) end; и т.п.

Директивы inline и interrupt предназначены для создания подпрограмм, написанных в машинных кодах, и процедур, обрабатывающих прерывания, соответственно.

Пример 1. Используя одну подпрограмму,

вычислить с погрешностью0.0001:

program Tri_Funkcii;

type {Процедурный тип}

fun = function(m : word) : real;

const e = 0.0001;

var z1, z2, z3 : real;

function Sum_ryada(f : fun) : real; {Основная подпрограмма}

var {Локальные переменные}

j : word; {Номер слагаемого ряда}

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

begin s := 0; j := 1;

repeat s := s + f(j); j := j + 1 until f(j) < e;

Sum_ryada := s end; {Конец подпрограммы}

{Описание трех подпрограмм-функций процедурного типа}

function f1(i : word) : real; far; {‘Дальний’ вызов только для f1}

begin f1 := 1/i/(i + 1) end;

{$F+} {‘Дальний’ вызов для f2 и f3}

function f2(n : word) : real;

begin f2 := 1/sqr(2*n - 1) end;

function f3(k : word) : real;

begin f3 := 1/k/(k + 1)/(k + 2) end;

{$F-} {Отмена ‘дальнего’ вызова}

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

z1 := Sum_ryada(f1); writeln(‘z1 = ‘, z1 : 7 : 5);

z2 := Sum_ryada(f2); writeln(‘Сумма второго ряда = ’, z2 : 7 : 5);

writeln(‘z3 = ‘, Sum_ryada(f3) : 7 : 5) end.

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

Начало Подпрограмма Vvod

Входной параметр k, выходной - mat

Ввод (n)

i := 1 (1) k

Obrabotka(Vvod, mat, 5) j := 1 (1) k

Obrabotka(Vyvod, mat, 5)

Obrabotka(Vvod, mat, 7) Подпрограмма Vyvod

Входные параметры k, mat

Obrabotka(Vyvod, mat, 7) i := 1 (1) k

j := 1 (1) k

Конец Вывод i-й строки mat

Перевод курсора

Подпрограмма Obrabotka

Входные параметры - процедура p и размер k, выходной параметр - mat.

Начало

p(mat, k)

Конец

Опишем тип-матрицу с запасом - размером 10х10. В качестве объектов процедурного типа будем использовать процедуры ввода и вывода матрицы задаваемого с помощью соответствующего параметра размера. Указанные процедуры являются параметрами основной подпрограммы - Obrabotka. Выше представлен алгоритм решения задачи, а ниже - программа на его основе.

program Proc_Tip;

const n = 10;

type tip = array[1..n, 1..n] of byte;

proc = procedure(var m : tip; r : byte); {Процедурный тип}

var matrix : tip;

procedure Obrabotka(p : proc; var mat : tip; k : byte);

begin p(mat, k) end;

{$F+} {Объекты процедурного типа}

procedure Vvod(var mat : tip; k : byte);

var i, j : byte;

begin randomize;

for i := 1 to k do for j :=1 to k do mat[i, j] := random(20*k) end;

procedure Vyvod(var mat : tip; k : byte);

var i, j : byte;

begin writeln(‘Была введена матрица:’);

for i := 1 to k do begin

for j := 1 to k do write(mat[i, j] : 4);

writeln end end;

{$F-}

begin Obrabotka(Vvod, matrix, 5);

Obrabotka(Vyvod, matrix, 5);

Obrabotka(Vvod, matrix, 7);

Obrabotka(Vyvod, matrix, 7); end.

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

  1. Что такое процедурный тип?

  2. Что предполагает директива far?

  3. Как сделать стандартную процедуру параметром подпрограммы?

  4. Почему подпрограммы процедурного типа нельзя объявлять в подпрограммах?

  5. Чем отличается действие ключа {$F+} от действия директивы far?

  6. Что означает директива near?

  7. Опишите тип функций, вычисляющих среднее значение для целочисленных элементов векторов разного размера, не превышающего 100.

  8. Каким должен быть порядок описания основной подпрограммы и используемых ею объектов процедурного типа?

  9. Перечислите правила использования процедурного типа.

  10. Какие подпрограммы относятся к типу

tip = function(x, y : real) : real;?

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

  1. С погрешностью 0.001 уточнить по методу Ньютона корни уравнений: ln(x)- x +1.8 = 0 на отрезке [1; 3] и на отрезке [1.5; 4.5].

  2. С погрешностью 0.001 вычислить по методу прямоугольников .

  3. С погрешностью 0.0001 методом простой итерации уточнить корни уравнений ln(x)- x +1.8 = 0 на отрезке [1; 3] и на [0; 2].

  4. С погрешностью 0.0001 вычислить для x=2.1 и для x=2.7 - -.

  5. Методом перебора с шагом 0.05 определить минимумы функций: f(x)=на отрезке[1.5; 4.5] и g(x)= на отрезке [0; 3].

  6. Протабулировать функции: с шагом 0.1 - f(x)= ln(x)- x +1.8 на отрезке [2; 3] и с шагом 0.2 - g(x)= на отрезке[0; 2].

  7. Вычислить значения многочленов : для x = 1.2 - - и для x = 3.5 - . Коэффициенты полиномов задать с помощью массивов.

  8. Методом перебора с шагом 0.1 определить максимумы функций: f(x)= на отрезке [0; 2] и g(x)= на отрезке[-1; 1].

  9. С погрешностью 0.001 вычислить для x = 0.4 и дляx=0.3 .

  10. Протабулировать функции f(x,y)= ln(x)- x + y и для

1 x 4 с шагом 0.5 и 1 y 3 с шагом 1.

  1. С погрешностью 0.001 уточнить методом дихотомии корни уравнений на отрезке[0; 1] и на отрезке[3; 5].

  2. С погрешностью 0.0001 вычислить для x=0.6 и .

  3. С помощью процедуры обработки матрицы с параметром процедурного типа ввести, транспонировать и вывести матрицу заданного размера.

  4. С помощью процедуры обработки строки с параметром процедурного типа вывести отсортированную и перевернутую исходную строку.

  5. С помощью процедуры обработки строки с параметром процедурного типа закодировать и декодировать строку символов.

  6. С помощью процедуры с параметром процедурного типа преобразовать матрицу символов в матрицу кодов и наоборот.

  7. Перебором с шагом 0.05 найти минимум функции g(x)= на отрезке [1; 3] и максимум функции f(x) = на отрезке [0; 2].

  8. Отсортировать вектор исходных данных по убыванию и по нарастанию с помощью подпрограммы с параметром процедурного типа.

  9. С помощью подпрограммы с параметром процедурного типа получить из двух векторов третий, каждый элемент которого равен меньшему элементу исходных векторов, и вектор, состоящий из сумм соответствующих компонентов исходных векторов.

  10. С помощью подпрограммы с параметром процедурного типа вывести на экран главную и побочную диагонали матриц 4х4 и 7х7.

  11. С помощью подпрограммы с параметром процедурного типа вывести значения с шагом 0.1 для f(x)= ln(x)- x +1.8 на отрезке [2; 3], а также границы отрезка, на котором эта функция имеет корень.

  12. С помощью подпрограммы с параметром процедурного типа транспонировать и вывести исходную и результирующую матрицы.

  13. Уточнить корень уравнения ln(x)- x +1.8 =0 на отрезке [2; 3] методами простой итерации и Ньютона и вывести его на экран с помощью одной процедуры, имеющей параметр процедурного типа.

  14. С помощью подпрограммы с параметром процедурного типа вывести матрицы, элементы которых равны сумме или произведению соответствующих элементов двух исходных матриц.

  15. С помощью подпрограммы с параметром процедурного типа вычислить среднее значение и дисперсию для вектора из 10 случайных значений, не превышающих 100.

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