Помощь в написании студенческих работ
Антистрессовый сервис

Существует несколько способов описания формальных параметров

РефератПомощь в написанииУзнать стоимостьмоей работы

В языке Turbo Pascal допускается использование процедурных типов. Процедурные типы относятся к типам, определяемым программистом. Они описываются в разделе описаний программы. Переменная процедурного типа имеет своим значением имя процедуры или функции. Использование процедурных типов дает программисту возможность передачи процедур и функций в качестве фактических параметров при обращении… Читать ещё >

Существует несколько способов описания формальных параметров (реферат, курсовая, диплом, контрольная)

1. Параметр-значение.

Описание:

:

Процедуре передается копия фактического параметра, и в ходе выполнения процедуры изменяется только эта копия. Ее изменение никак не влияет на значение фактического параметра. Это называется передачей параметра по значению. Параметру-значению при вызове процедуры должен соответствовать фактический параметр? выражение указанного типа.

2. Параметр-переменная.

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

Описание:

var :

Процедуре передается адрес фактического параметра, поэтому изменение соответствующего формального параметра внутри процедуры изменяют и фактический параметр. Это называется передачей параметра по ссылке (имеется в виду ссылка на адрес фактического параметра). Параметру-переменной при вызове процедуры должен соответствовать фактический параметр? переменная указанного типа.

3. Параметр-константа.

Описание:

const :

Процедуре передается адрес фактического параметра, однако такому параметру невозможно присвоить новое значение в ходе выполнения процедуры (это блокируется компилятором). Параметру-константе при вызове процедуры должен соответствовать фактический параметр? выражение указанного типа.

Все выходные параметры процедуры, через которые основной программе передаются результаты работы процедуры, должны быть описаны как параметры-переменные. С другой стороны, использование параметров-значений или констант позволяет работать с фактическими параметрами? выражениями, а также гарантирует невозможность случайно изменить значение фактического параметра при работе процедуры, что повышает надежность программы. Необходимо также учитывать, что использование параметров-значений требует дополнительных затрат памяти (так как для копии каждого параметра-значения отводится дополнительное место в памяти).

Параметры одного типа и назначения можно перечислить через запятую. Описание параметров разных типов и разного назначения отделяются точкой с запятой, например:

Procedure P (const c123: integer;

i, j: integer;

a, b, c: real;

var f1: real);

За заголовком процедуры могут следовать директивы. Стандартными директивами языка Turbo Pascal являются директивы assembler, external, far, near, forward, inline, interrupt. Например, использование директивы assembler указывает, что процедура представляет собой последовательность команд встроенного в компилятор языка Turbo Pascal ассемблера. Директива far определяет так называемую дальнюю модель памяти, т. е. обеспечивает возможность обратиться к процедурам и функциям, сопровождаемым этой директивой, из любого участка программы. Указание этой директивы необходимо, например, при использовании процедурных типов (см. ниже). Напротив, директива near определяет ближнюю модель памяти. Директива forward используется при опережающем описании процедуры,? так бывает, например, когда одна из процедур содержит обращение ко второй процедуре, а вторая, в свою очередь, к первой. Поскольку каждая процедура должна быть описана до обращения к ней, заголовок второй процедуры нужно объявить перед описанием первой процедуры, снабдив ее директивой forward. Директива forward, таким образом, указывает, что описание процедуры помещается далее в тексте программы, но обращаться к ней можно уже сейчас (из первой процедуры, описание которой предшествует описанию второй процедуры).

Функция отличается от процедуры тем, что результатом ее работы является единственное значение, поэтому обращение к функции можно использовать в выражениях наряду с переменными и константами.

Описание функции:

ЗАГОЛОВОК ФУНКЦИИ:

Function (<�описание формальных параметров>): ;

РАЗДЕЛ ОПИСАНИЙ (описание локальных констант, переменных, типов, процедур и функций низшего уровня) РАЗДЕЛ ОПЕРАТОРОВ.

begin

end.

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

: = ;

В предыдущем примере находилось значение функции с заданной точностью с помощью суммирования ряда. Результат сравнивался со значением, полученным с помощью стандартной функции языка Turbo Pascal. Проиллюстрируем на том же примере использование процедур и функций.

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

В нашем примере достаточно описать в основной программе переменные: epsilon? заданная точность вычисления; x? аргумент функции; sinus? результат вычисления функции с помощью ряда. Эти переменные будут глобальными по отношению к процедуре вычисления функции sinus. Вспомогательные переменные будут локальными (локализованными внутри процедуры).

В процедуре суммирования ряда sin1 используются следующие формальные параметры: e1? заданная точность вычисления; x1? аргумент функции.

Эти параметры не изменяются при выполнении процедуры и поэтому передаются по значению (как параметры-значения). s1? результат вычисления; он должен быть передан в основную программу и поэтому описывается как параметр-переменная. В принципе, можно было использовать для формальных параметров имена epsilon, x, sinus, поскольку в данном случае это не должно привести к недоразумению.

Результатом работы процедуры является единственное значение s1. Поэтому в данном случае можно было использовать функцию.

Такая функция описана далее в программе под именем sin2. Используются формальные параметры: e2? заданная точность вычисления; x2? аргумент функции. Значение функции имеет тип extended.

Program Procedures_and_functions1;

{Описание глобальных переменных}.

var

epsilon, x, sinus: extended;

Procedure sin1 (e1, x1: extended; var s1: extended);

{Описание вспомогательных (локальных) переменных}.

var

s, sqrx: extended;

n: byte;

{Раздел операторов процедуры sin1}.

begin {sin1}

s: = x1; {Первый член ряда}.

n: = 1; {Степень члена ряда}.

s1: = 0; {Сумма ряда}.

sqrx: = sqr (x1);

while abs (s) > e1.

do begin

s1: = s1 + s;

n: = n + 2;

s: = - s * sqrx / ((n — 1) * n).

end

end; {sin1}.

Function sin2 (e2, x2: extended): extended;

{Описание вспомогательных (локальных) переменных}.

var

s, sqrx, s2: extended;

n: byte;

{Раздел операторов функции sin2}.

begin {sin2}.

s: = x2; {Первый член ряда}.

n: = 1; {Степень члена ряда}.

s2: = 0; {Сумма ряда}.

sqrx: = sqr (x2).

while abs (s) > e2.

do begin

s2: = s2 + s;

n: = n + 2;

s: = - s * sqrx / ((n — 1) * n).

end;

{Присваивание вычисленного значения s2

функции sin2}.

sin2: = s2.

end; {sin2}.

{Основной текст — исполняемая часть программы}.

begin {Program}.

writeln ('Вычисление функции SIN (X): ');

write ('Введите заданную точность: ');

readln (epsilon);

write ('Введите аргумент функции: ');

readln (x);

{Вызов процедуры sin1}.

sin1 (epsilon, x, sinus);

{При обращении к процедуре sin1 формальные

параметры e1, x1, s1 заменяются фактическими

epsilon, x, sinus}.

write ('Значение, вычисленное с помощью ');

writeln ('суммирования ряда: ');

write ('Результат выполнения ');

write ('процедуры sin1 ');

writeln (sinus: 20: 18);

write ('Результат использования ');

write ('функции sin2: ');

writeln (sin2 (epsilon, x): 20: 18);

{Здесь обращение к функции происходит внутри

оператора writeln, что допустимо, поскольку

аргументом этого оператора является выражение}.

write ('Значение, вычисленное с помощью ');

write ('стандартной функции: ');

writeln (sin (x): 20: 18);

writeln;

end. {Program}.

Заметим, что операторы write, writeln, read, readln на самом деле осуществляют вызов стандартных процедур ввода-вывода языка Turbo Pascal. Так же, как и стандартные функции, эти процедуры не нуждаются в предварительном описании, в отличие от создаваемых программистом процедур и функций.

При обсуждении целочисленных типов данных (см. часть I) мы рассматривали пример вычисления суммы цифр числа. Покажем теперь, как можно вычислить эту сумму с помощью рекурсивного обращения процедуры самой к себе.

Program Procedures_and_functions2;

{Описание глобальных переменных n, summa}.

var

n: longint;

summa: byte;

Procedure Sum (n: longint; var ss: byte);

{Имя формального параметра n совпадает с именем

глобальной переменной n}.

{Раздел операторов процедуры Sum}.

begin {Sum}.

if n 0.

then begin

ss: = ss + abs (n mod 10);

Sum (n div 10, ss).

{Рекурсивный вызов процедуры Sum}.

end

end; {Sum}.

{Основной текст — исполняемая часть программы}.

begin {Program}.

writeln ('Вычисление суммы цифр: ');

write ('Введите любое целое число, которое ');

write ('по модулю не превосходит ');

writeln ('2 147 483 647');

readln (n);

summa: = 0;

Sum (n, summa);

writeln ('Сумма цифр ', n: 9, ' равна ', summa: 3).

end. {Program}.

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

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

Описание процедурного типа:

type

= <�заголовок процедуры или функции без указания имени процедуры или функции>;

Рассмотрим, например, фрагмент программы, в котором нам необходимо вывести на экран таблицы значений нескольких функций. Пусть это будут функции f1, f2.

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

Обе функции f1, f2? действительные функции одного действительного переменного. Введем процедурный тип func. Фрагмент программы, в котором значения функций f1 и f2 выводятся на экран, оформим в виде процедуры PrintFunction.

Program Procedures_and_functions3;

type

func = function (x: real): real;

Function f1 (x: real): real; far;

begin

f1: = (sin (x) + 1) * exp (-x).

end;

Function f2 (x: real): real; far;

begin

f2: = (cos (x) + 1) * exp (-x).

end;

Procedure PrintFunction (f: func);

{Формальный параметр f имеет процедурный тип func}.

{Описание локальных переменных}.

var

a, b, delta: extended;

begin {PrintFunction}.

write ('Задайте отрезок, на котором ');

writeln ('будут вычисляться значения функции: ');

write ('Начало отрезка: ');

readln (a);

write ('Конец отрезка: ');

readln (b);

write ('Задайте шаг вычисления ');

write ('значений функции: ');

readln (delta);

b: = b + 0.0001;

while a < b.

do begin

write (' x = ', a: 5: 3);

writeln (' f = ', f (a): 5: 3);

{Обращение к функции f в операторе

writeln}.

a: = a + delta.

end;

writeln.

end; {PrintFunction}.

{Основной текст — исполняемая часть программы}.

begin {Program}.

writeln ('Таблица функции (SIN (X) +1) *EXP (-X): ');

{Обращение к процедуре PrintFunction

с фактическим параметром-функцией f1}.

PrintFunction (f1);

writeln;

writeln ('Таблица функции (COS (X) +1) *EXP (-X): ');

{Обращение к процедуре PrintFunction

с фактическим параметром-функцией f2}.

PrintFunction (f2);

writeln.

end. {Program}.

Показать весь текст
Заполнить форму текущей работой