
- •Введение
- •Описание подпрограмм
- •Заголовок подпрограммы
- •Список формальных параметров
- •Параметры-значения
- •Параметры-переменные
- •Нетипизированные параметры
- •Умалчиваемые параметры
- •Параметры-массивы
- •Параметры-строки
- •Параметры-записи
- •Локальные элементы подпрограмм
- •Тело подпрограммы
- •Рекурсивные подпрограммы и опережающее описание
- •Примеры использования подпрограмм
- •Вычисление значений выражений
- •Ввод-вывод переменных типа запись
- •Работа с массивами
- •Сортировка методом прочесывания
- •Процедурные типы
- •Задания к лабораторной работе
- •Вопросы к лабораторной работе
- •Справочные таблицы

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
procedure Second; begin
...
First;
...
end;
Из выше приведенного листинга видно, что процедура First вызывает процедуру Second, а процедура Second вызывает процедуру First. Если попытаться откомпилировать выше приведенный фрагмент программы, то компилятор выдаст ошибку, «Идентификатор Second не определен». Как известно все идентификаторы в Object Pascal обязательно должны быть описаны перед первым использованием. Как видно из листинга ни какой порядок описания процедур не может удовлетворить этому условию. Для выхода из этой ситуации применяется опережающее описание подпрограмм. Для этого необходимо описать заголовок одной из подпрограмм с директивой forward. Перепишем приведенный выше пример
procedure Second; forward;
procedure First; begin
...
Second;
...
end;
procedure Second; begin
...
First;
...
end;
Этот фрагмент откомпилируется без ошибок, т.к. при вызове процедуры First идентификатор процедуры Second уже будет описан.
Примеры использования подпрограмм
В данной главе приведены некоторые приемы использования подпрограмм.
Вычисление значений выражений
Листинг 2
program Func;
{$APPTYPE CONSOLE}
function MyFunc(x:real):real;

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
begin
if x>0 then result:=x else result:=x*x;
end;
var x:real; begin
write('x=');
readln(x);
writeln('F(x)=', 7*x*MyFunc(x):6:3); readln;
end.
Ввод-вывод переменных типа запись
Как говорилось выше в Object Pascal нет стандартных средств для операций вводавывода для переменных типа запись. Поэтому удобно написать собственные подпрограммы для осуществления этих операций. Пример таких подпрограмм приведен ниже.
Листинг 3
program Records;
{$APPTYPE CONSOLE} uses SysUtils;
type TPerson=record name:string[12]; fam :string[16]; otch:string[20]; BirthDay:TDateTime;
end;
//ввод записи
procedure InRecord(var Person:TPerson); var s:string;
begin
with Person do begin
write('name '); readln(name); write('familia '); readln(fam); write('othectvo '); readln(otch); write('BirthDay '); readln(s);
//преобразуем строку в тип дата-время
BirthDay:=StrToDate(s);
end;{with}
end;{InRecord}
//вывод записи
procedure OutRecord(const Person:TPerson);
begin |
|
with Person do |
|
begin |
|
writeln('name |
', name); |

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
writeln('familia ', fam); writeln('othectvo ', otch); writeln('BirthDay ', DateToStr(BirthDay));
end;{with} end;{OutRecord}
//основная программа var P:TPerson; begin
InRecord(P); writeln('___________________'); OutRecord(P);
readln;
end.
Рассмотрим еще один пример по работе с записями. Перепишем программу из лабораторной работы №5 (листинг 2) c использованием подпрограмм.
Листинг 4
program TableRec;
{$APPTYPE CONSOLE}
const n=10;//емкость массива type TStudent=record
name |
:string[12]; |
//имя |
familia:string[16]; |
//фамилия |
|
gruppa |
:Integer; |
//группа |
end;
var Table:array [1..n] of TStudent; //таблица
Count:integer; //число строк в таблице MenuState:byte;//код выбранного действия
//выводит меню, возвращает результат выбора function ShowMenu:Integer;
begin writeln;
writeln('Viberite deistvie'); writeln('0 - Exit program'); writeln('1 - Add record'); writeln('2 - Show all record'); write('>>');
readln(Result);
end;
//ввод записи
procedure InRecord(var P:TStudent); begin
writeln('Insert record >>');
with P do |
|
begin |
|
write('name |
:'); readln(name); |
write('familia |
:'); readln(familia); |
write('gruppa |
:'); readln(gruppa); |
end;{with} |
|
end;{InRecord} |
|
//вывод записи
procedure ShowRecord(const P:TStudent); begin