Лабораторная работа n 6
Табулирование
Программирование с использованием подпрограмм
Задание
Табулированием называют составление таблицы значений заданной функции. Это может оказаться нетривиальной задачей, если значения функции определяются по сложной формуле или в результате какого-либо сложного процесса.
Задача табулирования формулируется следующим образом.
Пусть функция y=f(x) задана на сегменте xϵ[a,b]. Требуется определить yi=f(xi) в n+1 точке xi=a+i*h для i=0..n , где h=(b-a)/n – шаг табулирования.
Результат следует представить в виде таблицы.
x f(x)
... ...
Задание выполняется в виде консольного приложения. Необходимо использовать две процедуры. Одна из них должна быть предназначена для вывода таблицы на экран монитора, а другая – для записи в текстовый файл, имя которого пользователь вводит с клавиатуры. Параметрами процедур должны быть a, b, n и имя функции. Так как значения функции вычисляются многократно, следует задать ее в виде подпрограммы-функции. В рамках задания необходимо разработать модуль, в который поместить процедуры и функцию.
Теоретическая часть Процедуры и функции
Процедура вводится в употребление с помощью описания процедуры, помещенного в разделе процедур и функций.
<описание процедуры> ::= <заголовок процедуры>;<блок>
<заголовок процедуры>::=procedure<имя процедуры>|
procedure<имя процедуры>(<список формальных параметров>)
Список формальных параметров состоит из групп (секций), отделенных друг от друга точкой с запятой. В каждой секции присутствуют параметры одного типа значений, отделенные друг от друга запятой.
<список форм.пар.>::=<секция форм.пар.>{;<секция форм. пар.>}
<секция форм. пар.>::=<имя>{,<имя>}:<имя типа>|
Var <имя>{,<имя>}:<имя типа>|
Const <имя>{,<имя>}:<имя типа>
Здесь <имя> – идентификатор.
Для определения функции служит размещаемое в разделе процедур и функций описание функции, похожее на описание процедуры.
<описание функции>::=<заголовок функции>;<блок>
<заголовок функции>::= function <имя функции>:<имя типа>|
function<имя функции>(<список форм. параметров>):<имя типа>
Следует обратить внимание на два момента:
после имени функции и параметров в скобках ставится двоеточие и указывается тип возвращаемого значения.
в теле функции должен присутствовать хотя бы один оператор вида
<имя функции>:=<выражение>
Операторов указанного вида может быть и несколько, но хотя бы один из них должен выполняться. Результат последнего по времени выполнения оператора присваивания указанного типа и принимается в качестве окончательного значения функции. Операторы присваивания указанного вида могут использоваться только в описаниях функций и нигде больше. Справа имя функции без аргументов использовать нигде нельзя. Ошибочно использование имени функции с аргументами в левой части оператора присваивания.
Чтобы упростить программирование функций, в Delphi в каждой функции по умолчанию задана встроенная переменная Result, которая имеет тот же тип, что и тип возвращаемого значения. Эту переменную специально объявлять не нужно, она уже готова к работе. В отличие от других языков, в Delphi этой переменной можно присваивать значение неоднократно. Результатом будет последнее присвоенное значение. Присваивание результата расчета имени функции из переменной Result (в случае ее использования) осуществляется автоматически.
Подпрограмму-функцию можно вызвать так же, как процедуру, если нас не интересует возвращаемый результат, а важны действия, которые она выполняет. Такая возможность задается с помощью директивы {$X+} (расширенный синтаксис, установленный по умолчанию).
В Паскале допускается использование в качестве параметров процедур и функций других процедур и (или) функций. Формальный параметр-процедура (функция) задается в виде заголовка той процедуры (функции), имя которой может быть задано в качестве фактического параметра – при этом имя такой процедуры (функции) и ее формальные параметры выбираются достаточно произвольным образом. В качестве параметров нельзя использовать процедуры (функции), фактические параметры которых вызываются по имени, т.е. параметрами таких процедур могут быть только параметры-значения. Это ограничение снижает гибкость использования процедур, но повышает надежность программ.
Применение процедурных типов требует установления специального дальнего механизма компилирования функции, который можно задать, поместив перед заданием функции директиву компилятору {$F+}.
Пример.
type fun= function (x: real):real;
var a,b:real; n:integer;
{$F+}
function f(x: real):real;
begin f:=x-cos(x) end;
procedure tabscr(a1,b1:real;n1:integer;ff:fun);
var h,x,y:real; i:integer;
begin
h:=(b1-a1)/n1; x:=a1; y:=ff(x);
writeln(‘x f(x)’:16);
writeln(x:4:1,y:12:4);
for i:=1 to n1 do
begin
x:=x+h; y:=ff(x);
writeln(x:4:1,y:12:4)
end
end;
Тогда в программе, если заданы значения a, b и n, можно, например, записать оператор
tabscr(a,b:real;n:integer;f:fun);