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

Лабораторная работа №9 Процедуры и функции пользователя в языке Паскаль

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

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

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

Заголовок процедуры имеет следующий вид:

Procedure идентификатор [(параметры)];

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

Список параметров может состоять из нескольких групп параметров, разделенных точкой с запятой (;):

(группа параметров [; группа параметров [; …] ] ).

Группа параметров, которая содержит список параметров одного типа, может быть трех следующих видов:

  • идентификатор [, идентификатор [,…] ]: type (список параметров-значений - только передают значения в процедуру);

  • var идентификатор [, идентификатор [,…] ]: type (список параметров-переменных – возвращают значения в вызывающую программу из процедуры);

  • var идентификатор [, идентификатор [,…] ] (список нетипизированных параметров-переменных).

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

Пример. Процедура для вывода текстовой строки в указанную позицию на экране. Описание процедуры:

Procedure WrStr(X, Y: integer; S: string); {Заголовок}

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

SaveX, SaveY: Integer;

begin

SaveX := WhereX; {Запоминаем позицию курсора на экране по Х}

SaveY := WhereY; {То же по Y}

GotoXY(X,Y); {Перемещаем курсор в заданную позицию X,Y}

Write(S); {Выводим с заданной позиции строку текста}

GotoXY(SaveX, SaveY); {Перемещаем курсор в исходную позицию}

end;

Обращение к ней из головной программы или другой процедуры может выглядеть следующим образом: WrStr(40, 2, ’Расчет …’):

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

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

Функция, в отличие от процедуры, имеет имя, которое принимает определенное значение после ее выполнения. Описание функции:

{функция, которая преобразует все символы строки в прописные}

Function UpCaseStr(S: string): string; {заголовок}

var i : integer; {раздел описаний локальных переменных}

begin {начало тела функции}

for i := 1 to Length(S) do

if (S[i] >= 'a') and (S[i] <= 'z') then Dec(S[i], 32);

UpCaseStr := S;

end; {конец описания функции}

Вызов этой функции из головной программы или другой процедуры может выглядеть следующим образом: Write(UpCaseStr(’Расчет …’)).

Использование подобных функций пользователя ничем не отличается от использования стандартных функций вроде sin(x), exp(a) и проч.

Ниже приведён пример построения программы с разбиением её на отдельные процедуры:

Program Prg_proc;

Uses Crt, Printer;

Var

xn, xk, h : real;

i, j, m, n : word;

x, y : array [1..50] of real;

mnu : array [1..6] of string[10];

vv : char;

Procedure my_mnu;

begin

Window(1, 1, 80, 1); TextColor(0); GoToXY(1,1);

for i:=1 to 5 do

if i=m then

begin

TextBackground(2);Write(' ',mnu[i],' ');

end

else

begin

TextBackground(7); Write(' ',mnu[i],' ');

end;

Window(1, 2, 80, 25);

GoToXY(1,1); TextColor(15);TextBackground(0);

end;

Procedure input_kl;

begin

ClrScr;

Write('x начальное = '); Readln(xn);

Write('x конечное = '); Readln(xk);

Write('количество точек графика (n<50) = '); Readln(n);

m:=2; my_mnu

end;

Procedure calc_dat;

begin

x[1]:=xn;

h:=(xk-xn)/(n-1);

for i:=1 to n do

begin

y[i]:=sin(x[i]); x[i+1]:=x[i]+h;

end;

ClrScr; Write('Расчет выполнен!')

end;

Procedure out_dat;

begin

ClrScr;

Writeln('------------------------------');

Writeln(' X Y ');

Writeln('------------------------------');

for i:=1 to n do Writeln(x[i]:15:5,Y[i]:15:5);

Writeln('------------------------------');

end;

Procedure out_gr;

begin

Write('здесь нужно описать вывод графика на экран')

end;

begin {Головная программа}

TextBackground(0); ClrScr;

mnu[1]:='Исх.данные';

mnu[2]:='Расчет' ;

mnu[3]:='Таблица';

mnu[4]:='График' ;

mnu[5]:='Выход' ;

m:=1;

my_mnu;

Repeat

vv:=Readkey;

if ord(vv)=0 then vv:=Readkey;

case ORD(VV) of

13:begin

Case m of

1:input_kl;

2:calc_dat;

3:out_dat ;

4:out_gr ;

end;

end;

77:begin if m<5 then m:=m+1 else m:=1; my_mnu end;

75:begin if m>1 then m:=m-1 else m:=5; my_mnu end;

end;

Until (vv=chr(13)) and (m=5);

end.