- •Программирование на Турбо Паскале
- •Вещественный тип данных
- •Символы и строки.
- •Операции и их приоритет
- •Процедура ввода
- •Процедура вывода
- •Оператор варианта
- •Процедуры и функции
- •Массивы
- •Упакованные массивы
- •Множества
- •Файловые типы данных
- •Операции ввода-вывода
- •Перемещения по файлу
- •Специальные операции
- •Работа с текстовыми файлами
- •Комбинированный тип данных
- •Оператор with
- •Переменная структура записи
Процедуры и функции
В паскале существует два вида подпрограмм пользователя – процедуры и функции. Процедура может быть вызвана отдельным оператором, а функция может использоваться в выражениях. Подпрограммы должны находиться сразу после описательной части программы непосредственно перед ее телом.
Процедура имеет следующий формат
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.
