Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции Турбо Паскаль.doc
Скачиваний:
22
Добавлен:
22.03.2016
Размер:
307.71 Кб
Скачать

Процедуры и функции

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

Процедура имеет следующий формат

procedure <имя процедуры>(< формальные параметры>);

lable <метки>;

const <объявление констант>;

type <определение типов данных>;

var <объявление переменных>;

procedures and functions;

begin

<тело процедуры>;

end;

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

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

Пример

Вычислить сумму

, для ч=2.1, n=10.

Решение

program sum1;

const

n=10;

x=2.1;

var

s, p:real;

I,z:integer;

procedure fact(k:integer, var f:real);

var

j:integer;

begin

f:=1;

for j:=1 to k do f:=f*j;

end;

begin

s:=0;

z:=1;

for i:=1 to n do

begin

fact(2*i, p);

s:=s+z*p/exp((2*i-1)*ln(x));

z:=-z;

end; {for i}

writeln(‘summa=’,s:8:3);

readln;

end.

Функция имеет такой же формат, что и процедура, но в качестве заголовка служит оператор:

Function <имя функции>(<формальные параметры и их тип>):<тип функции>;

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

Пример

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

, для х=2.1, n=10.

Решение

program sum1;

const

n=10;

x=2.1;

var

s, p:real;

I,z:integer;

function fct(k:integer):real;

var

j:integer;

begin

fct:=1;

for j:=1 to k do fct:=fct*j;

end;

begin

s:=0;

z:=1;

for i:=1 to n do

begin

s:=s+z*fct(2*i)/exp((2*i-1)*ln(x));

z:=-z;

end; {for i}

writeln(‘summa=’,s:8:3);

readln;

end.

Комментарии

Для внесения пояснений в программу можно вставлять комментарии, которые игнорирует компилятор, и используются лишь для удобства чтения программы. Комментарии ограничиваются либо фигурными скобками и записываются в виде: {<комментарии>}, либо символами (* *) и имеют вид:

(*<комментарии> *).

Оператор безусловного перехода

Оператор безусловного перехода нарушает порядок выполнения программы и имеет вид:

Goto(<метка>);

где <метка> - идентификатор метки, которым помечается оператор, на который нужно передать управление. После метки, помечающей оператор, ставится двоеточие. Все идентификаторы меток должны быть объявлены в описательной части программы в разделе меток label. Использование оператора Goto нежелательно, это считается низким уровнем программирования, поскольку паскаль позволяет составлять программы с использованием более прогрессивных способов, использующих составные операторы и другие логические приемы.

Пример

Вычислить и вывести на печать

, для х=0,5 8,5; ∆х=0,5.

Вычисления прекратить и выйти из программы, если абсолютная величина знаменателя меньше 10-5.

program tab;

label m7;

const

xn=0.5;

xk=6.5;

h=0.5;

c=1e-5;

var

a,b,x,y,z:real;

begin

writeln(‘a, b=?’);

readln(a,b);

x:=xn;

writeln(‘ x y’);

while x<xk+h/2 do

begin

z:=sqr(x)*(a-b*x*sin(x));

if abs(z)<c

then

begin

writeln(‘’);

goto m7;

end;

y:=(a+b*cos(x))/z;

writeln(‘x=’,x:3:1,’ y=’,y:8:3):

x:=x+h;

end; {while}

7: writeln;

end.

Операторы досрочного выхода из цикла и прерывания программы

Оператор досрочного выхода их цикла имеет вид:

exit;

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

Оператор прерывания программы имеет вид:

halt(n);

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

Тогда предыдущую задачу можно решить следующим образом:

program tab;

label m7;

const

xn=0.5;

xk=6.5;

h=0.5;

c=1e-5;

var

a,b,x,y,z:real;

begin

writeln(‘a, b=?’);

readln(a,b);

x:=xn;

writeln(‘ x y’);

while x<xk+h/2 do

begin

z:=sqr(x)*(a-b*x*sin(x));

if abs(z)<c

then

begin

writeln(‘’);

halt(1);

end;

y:=(a+b*cos(x))/z;

writeln(‘x=’,x:3:1,’ y=’,y:8:3):

x:=x+h;

end; {while}

7: writeln;

end.