Компания ALT Linux
Опубликован: 10.04.2015 | Доступ: свободный | Студентов: 763 / 0 | Длительность: 14:03:00
Специальности: Программист, Преподаватель
Лекция 4:

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

4.7 Особенности работы с подпрограммами

Рассмотрим ещё несколько способов передачи параметров в подпрограмму.

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

Параметр-константа указывается в заголовке подпрограммы подобно параметру-значению, но перед его именем записывается зарезервированное слово const, действие которого распространяется до ближайшей точки с запятой. Параметр-константа передаётся в подпрограмму как параметр-переменная, но компилятор блокирует любые присваивания параметру-константе нового значения в теле подпрограммы.

В языке Free Pascal можно использовать параметры-переменные и параметры-константы без указания типа, и тогда фактический параметр может быть переменной любого типа, а ответственность за правильность использования того или иного параметра возлагается на программиста.

4.7.2 Процедурные типы

Процедурные типы были разработаны как средство передачи функций и процедур в качестве фактических параметров обращения к другим процедурам и функциям. Для объявления процедурного типа используется заголовок подпрограммы, в котором пропущено её имя. Существует два процедурных типа: тип-процедура и тип-функция:

type

тип_процедура=procedure (список_формальных_параметров );

тип_функция=function (список_формальных_параметров ) : тип;

Кроме того, в программе могут быть объявлены переменные процедурного типа:

var

имя_переменной_1 : тип_процедура;

имя_переменной_2 : тип_функция;

Например:

type
	Fun1=function ( x, y : real ) : real;
	Fun2=function : string;
	Proc1=procedure ( x, y : real; var c, z : real );
	Proc2=procedure ( );
var
	F1, f 2 : Fun1;
	p1, p2 : Proc1;
	mass : array [ 1.. 5 ] of Proc2;

Обращаться к переменным процедурного типа следует по их адресу4Операция взятия адреса (п. 2.5.4):

@имя_переменной

Рассмотрим механизм передачи подпрограмм в качестве параметра на примере следующей задачи.

ЗАДАЧА 4.10. Создать программу, которая выводит на экран таблицу значений функций f (x) и g(x).

Вычисление и вывод значений осуществляются с помощью функции VivodFunc. Её параметры:

  • a и b — границы интервала изменения аргумента функции;
  • n — количество точек, на которые будет разбит интервал (a, b);
  • ff — имя функции.
type {Описание процедурного типа func.}
	func=function ( x : real ) : real;
function VivodFunc ( a, b : real;N: word; ff : func ) : integer;
	var
		x, y, hx : real;
		f : text;
	begin
		{Шаг изменения переменной x.}
		hx :=(b-a )/N;
		x:=a;
		while ( x<=b ) do
		begin
		y:= ff ( x );
		writeln ( ’ x= ’, x : 5 : 2, ’ y= ’, y : 7 : 2 );
		x:=x+hx;
	end;
end;
{Определение функций f и g с описателем far.}
function f ( x : real ) : real; far;
	begin
		f := exp ( sin ( x ) ) * cos ( x );
	end;
function g ( x : real ) : real; far;
	begin
		g:=exp ( cos ( x ) ) * sin ( x );
	end;
begin
{Вызов Vivodfunc с функцией f в качестве параметра.}
	VivodFunc ( 0, 1, 7, @f );
	writeln;
{Вызов Vivodfunc с функцией g в качестве параметра.}
	VivodFunc ( 0, 2, 8,@g );
end.

В языке Free Pascal есть возможность использования в качестве формальных параметров массивов функций.

Модифицируем задачу 4.10. Программа, представленная далее, выводит на экран таблицу значений нескольких функций с помощью функции VivodFunc. Здесь в роли параметров функции выступают:

  • интервал (a, b);
  • количество узлов n интервала (a, b);
  • массив функций ff, в которых необходимо вычислить значения;
  • количество функций m в массиве ff.
type
	func=function ( x : real ) : real;
{В процедуру VivodFunc передается}
{входной параметр ff - открытый массив функций.}
function VivodFunc ( a, b : real;N: word;
		ff : array of func; m: word ) : integer;
	var
		x, y, hx : real;
		i : integer;
	begin
		hx :=(b-a )/N;
		{Цикл по всем функциям.}
		for i :=0 to m -1 do
		begin
			x:=a;
			while ( x<=b ) do
			begin
				{Вычисление значения i-й функции в точке x.}
				y:= ff [ i ] ( x );
				writeln ( ’ x= ’, x : 5 : 2, ’  y= ’, y : 7 : 2 );
				x:=x+hx;
			end;
			writeln;
		end;
	end;
function f ( x : real ) : real; far;
	begin
		f := exp ( sin ( x ) ) * cos ( x );
	end;
function g ( x : real ) : real; far;
	begin
		g:=exp ( cos ( x ) ) * sin ( x );
	end;
{Описание массива восьми функций fff.}
var fff : array [ 1.. 8 ] of func;
	begin
		{Запись реальных функций в массив fff.}
		fff [ 1 ] : = @f;
		fff [ 2 ] : = @g;
		{Вызов процедуры.}
		VivodFunc ( 0, 1, 7, fff, 2 );
	end.

Несколько подпрограмм можно объединять в модуль и затем использовать в других программах. Рассмотрим процесс создания модуля более подробно.

Юрий Шутиков
Юрий Шутиков

По первому тесту выполнил дважды задания. Результат получается правильный (проверял калькулятором). Пишет, что "Задание не проверено" и предлагает повторить. 
 

Евгений Силуков
Евгений Силуков

Еще в декабре выполнил тест №1, а его все так и не проверили.