
- •Лабораторная работа 7 массивы Цель работы
- •Методические указания
- •Вывод элементов I-й строки матрицы
- •Лабораторная работа 8 строки и множества
- •Лабораторная работа 9 комбинированный тип данных (записи)
- •Лабораторная работа 10 подпрограммы с типизированными параметрами -значениями и параметрами-переменными Цель работы
- •Лабораторная работа 11 подпрограммы с параметрами процедурного типа
- •Лабораторная работа 12 параметры-константы, нетипизированные параметры подпрограмм, массивы и строки открытого типа
- •Библиографический список
- •Содержание
- •Редактор м.Е. Цветкова Корректор н.А. Орлова
- •390005, Рязань, Гагарина, 59/1.
Лабораторная работа 11 подпрограммы с параметрами процедурного типа
Цель работы
Изучение правил оформления и использования параметров подпрограмм, которые сами являются подпрограммами.
Методические указания
В качестве формальных параметров подпрограмм могут использоваться процедуры и функции. Как и все другие параметры, эти параметры также должны быть описаны с указанием типа. В Turbo Pascal тип параметров-процедур и параметров-функций носит название процедурного типа. В общем случае процедурный тип объявляется следующим образом:
type <имя> = procedure(<список формальных параметров>);
<имя > = function(<список формальных параметров>) :
<тип возвращаемого значения>;
например, fun = function(x : real) : real; proc = procedure;
К объявленному типу fun относятся все функции, имеющие один формальный параметр-значение типа real и возвращающие результат такого же типа. К типу proc относятся все процедуры без параметров.
Существуют следующие правила использования подпрограмм как объектов процедурного типа:
подпрограммы должны компилироваться с ключом {$F+} или иметь директиву far;
они не должны быть стандартными подпрограммами;
они не должны объявляться внутри других подпрограмм;
подпрограммы не должны иметь директив 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.
Контрольные вопросы
Что такое процедурный тип?
Что предполагает директива far?
Как сделать стандартную процедуру параметром подпрограммы?
Почему подпрограммы процедурного типа нельзя объявлять в подпрограммах?
Чем отличается действие ключа {$F+} от действия директивы far?
Что означает директива near?
Опишите тип функций, вычисляющих среднее значение для целочисленных элементов векторов разного размера, не превышающего 100.
Каким должен быть порядок описания основной подпрограммы и используемых ею объектов процедурного типа?
Перечислите правила использования процедурного типа.
Какие подпрограммы относятся к типу
tip = function(x, y : real) : real;?
Варианты задания
С погрешностью 0.001 уточнить по методу Ньютона корни уравнений: ln(x)- x +1.8 = 0 на отрезке [1; 3] и
на отрезке [1.5; 4.5].
С погрешностью 0.001 вычислить по методу прямоугольников
.
С погрешностью 0.0001 методом простой итерации уточнить корни уравнений ln(x)- x +1.8 = 0 на отрезке [1; 3] и
на [0; 2].
С погрешностью 0.0001 вычислить для x=2.1
и для x=2.7 - -
.
Методом перебора с шагом 0.05 определить минимумы функций: f(x)=
на отрезке[1.5; 4.5] и g(x)=
на отрезке [0; 3].
Протабулировать функции: с шагом 0.1 - f(x)= ln(x)- x +1.8 на отрезке [2; 3] и с шагом 0.2 - g(x)=
на отрезке[0; 2].
Вычислить значения многочленов : для x = 1.2 - -
и для x = 3.5 -
. Коэффициенты полиномов задать с помощью массивов.
Методом перебора с шагом 0.1 определить максимумы функций: f(x)=
на отрезке [0; 2] и g(x)=
на отрезке[-1; 1].
С погрешностью 0.001 вычислить для x = 0.4
и дляx=0.3
.
Протабулировать функции f(x,y)= ln(x)- x + y и
для
1 x 4 с шагом 0.5 и 1 y 3 с шагом 1.
С погрешностью 0.001 уточнить методом дихотомии корни уравнений
на отрезке[0; 1] и
на отрезке[3; 5].
С погрешностью 0.0001 вычислить
для x=0.6 и
.
С помощью процедуры обработки матрицы с параметром процедурного типа ввести, транспонировать и вывести матрицу заданного размера.
С помощью процедуры обработки строки с параметром процедурного типа вывести отсортированную и перевернутую исходную строку.
С помощью процедуры обработки строки с параметром процедурного типа закодировать и декодировать строку символов.
С помощью процедуры с параметром процедурного типа преобразовать матрицу символов в матрицу кодов и наоборот.
Перебором с шагом 0.05 найти минимум функции g(x)=
на отрезке [1; 3] и максимум функции f(x) =
на отрезке [0; 2].
Отсортировать вектор исходных данных по убыванию и по нарастанию с помощью подпрограммы с параметром процедурного типа.
С помощью подпрограммы с параметром процедурного типа получить из двух векторов третий, каждый элемент которого равен меньшему элементу исходных векторов, и вектор, состоящий из сумм соответствующих компонентов исходных векторов.
С помощью подпрограммы с параметром процедурного типа вывести на экран главную и побочную диагонали матриц 4х4 и 7х7.
С помощью подпрограммы с параметром процедурного типа вывести значения с шагом 0.1 для f(x)= ln(x)- x +1.8 на отрезке [2; 3], а также границы отрезка, на котором эта функция имеет корень.
С помощью подпрограммы с параметром процедурного типа транспонировать и вывести исходную и результирующую матрицы.
Уточнить корень уравнения ln(x)- x +1.8 =0 на отрезке [2; 3] методами простой итерации и Ньютона и вывести его на экран с помощью одной процедуры, имеющей параметр процедурного типа.
С помощью подпрограммы с параметром процедурного типа вывести матрицы, элементы которых равны сумме или произведению соответствующих элементов двух исходных матриц.
С помощью подпрограммы с параметром процедурного типа вычислить среднее значение и дисперсию для вектора из 10 случайных значений, не превышающих 100.