Подпрограммы.
Процедуры без параметров
В практике программирования часто встречаются ситуации, когда по ходу выполнения программы приходится производить одни и те же вычисления или действия. Чтобы исключить повторение одинаковых записей и сделать тем самым программу проще и понятнее, можно выделить эти повторяющиеся фрагменты в самостоятельную часть программы, которая может быть использована многократно по мере необходимости. Такая автономная часть программы, реализующая определённый алгоритм и допускающая обращение к ней из различных частей программы, называется подпрограммой. Использование подпрограмм позволяет реализовать один из самых прогрессивных методов программирования - структурное программирование. Язык программирования Turbo Pascal 7.0, даже в сравнении с другими промышленными системами программирования, обладает очень мощными средствами для работы с подпрограммами.
Описание процедур без параметров.
Как вы уже знаете, в структуре Pascal-программы предусмотрен специальный раздел для описания подпрограмм - раздел описания процедур и функций. Именно в этом разделе производится описание подпрограмм. Структура любой подпрограммы почти буквально повторяет структуру всей Pascal-программы, и выглядит следующим образом:
Procedure <имя процедуры>;
Uses <имена модулей>;
Label <имена меток>;
Const <имена констант>;
Type <имена типов пользователя>;
Var <имена локальных переменных>;
<раздел объявления подпрограмм>;
Begin
<операторы>;
End;
Отличия Pascal-программ от подпрограмм.
Единственным отличием процедуры без параметров от Pascal-программы состоит в названии заголовка, которое начинается не служебным словом Program, а служебным словом Procedure. Наличие заголовка процедуры обязательно, в отличии от наличия заголовка программы, который может быть опущен. Кроме того любая подпрограмма заканчивается служебным словом End и точкой с запятой, в отличии от End с точкой в Pascal-программе.
Вызов процедур без параметров.
Вызов процедуры без параметров осуществляется по имени данной процедуры в теле программы. Имя процедуры воспринимается как оператор. При выполнении этого оператора выполняется вся подпрограмма.
Вложенность подпрограмм.
Допускается использование в одной программе сразу нескольких подпрограмм. Кроме использования одновременно нескольких подпрограмм Pascal-программа допускает использование вложенных подпрограмм. То есть каждая подпрограма может содержать в себе описание других подпрограмм, которые являются таким образом подпрограммами подпрограмм. Эти подпрограммы, в свою очередь, тоже могут содержать описание своих подпрограмм и так далее.
Область доступности переменных (объектов).
Структура подпрограмм (блоков) Pascal-программ достаточно традиционна для многих языков и требует определённой дисциплины для доступа к объектам (например переменным, константам, типам пользователя), описанным в различных блоках. Эту дисциплину можно сформулировать в виде следующих правил:
1. Имена объектов, описанных в некотором блоке, считаются известными в пределах данного блока, ВКЛЮЧАЯ и все вложенные блоки.
2. Имена объектов, описанных в блоке, должны быть уникальны в пределах данного блока и могут совпадать с именами объектов из других блоков.
3. Если в некотором блоке описан объект, имя которого совпадает с именем объекта, описанного в объемлющем блоке, то это последнее имя становится недоступным в данном блоке.
Говорят, что имя, описанное в блоке, экранирует (закрывает, делает недоступным) одноимённые объекты из блоков, объемлющих данный.
Возвращаясь к предыдущей схеме, можно сказать, что объекты описанные в блоке B, известны (видимы), кроме самого блока B, ещё и в блоках D и E. Имена из блоков C, D, E известны только в пределах соответствующих блоков. Наконец, имена объектов из самого внешнего блока A (то есть блока, соответствующего программе в целом) известны во всех вложенных блоках.
Общий вид Pascal-программы с использованием подпрограмм.
Схематически Pascal-программа содержащая подпрограммы может выглядеть следующим образом:
PROGRAM <главная программа А>;
procedure <подпрограмма B>;
procedure <подпрограмма D>;
begin
<операторы подпрограммы D>;
end;
begin
<операторы подпрограммы B>;
end;
BEGIN
<операторы главной программы A>;
END.
Примеры использования процедур без параметров.
Программа, текст которой приведён ниже, выполняет рисование 15 прямоугольных треугольников расположенных горизонтально. Рисование прямоугольного треугольника оформлено в виде процедуры TRG. Треугольник рисуется от текущего указателя, который является правым нижним углом данного треугольника.
PROGRAM ex_25_1;
USES Graph,Crt;
VAR
gd,gm,i: integer;
procedure TRG;
begin
linerel(40,0);
linerel(-40,-40);
linerel(0,40);
end;
BEGIN
gd:=vga;
gm:=vgahi;
Initgraph(gd,gm,);
if Graphresult=grok then
begin
MoveTo(10,200);
for i:=1 to 15 do begin MoveRel(45,0); TRG; end;
Repeat Until KeyPressed;
end;
END.
Для того, чтобы нарисовать линию из 15 разноцветных треугольников можно немного изменить процедуру рисования треугольников.
procedure TRG2;
begin
setcolor(i);
linerel(40,0);
linerel(-40,-40);
linerel(0,40);
end;
Как вы заметили, переменная i, которая используется для изменения цвета рисования, в процедуре TRG2 не объявлена. Она объявлена в главной программе и доступна (видима) в любой её подпрограмме, в том числе и в процедуре TRG2. Такие переменные называются глобальными.
Переменные можно объявлять и внутри подпрограммы. Но в этом случае, переменная объявленная внутри подпрограммы будет доступна только внутри этой подпрограммы. Такие переменные называются локальными переменными. Ниже приведён пример нашей процедуры рисования прямоугольного треугольника с разноцветными сторонами, с использованием локальной переменной j.
procedure TRG3;
var j: integer;
begin
j:=12; setcolor(j); linerel(40,0);
j:=succ(j); setcolor(j); linerel(-40,-40);
j:=succ(j); setcolor(j); linerel(0,40);
end;
Пример программы с вложенными процедурами.
Программа ex_25_2, рисует сетку состоящую из разноцветных прямоугольных треугольников. Процедура LineTrg предназначна для рисования линии из треугольников, начиная от текущего положения указателя. Она содержит в качестве подпрограммы уже знакомую вам процедуру TRG.
PROGRAM ex_25_2;
USES Graph,Crt;
VAR
gd,gm,i: integer;
procedure LineTrg;
var k: integer;
procedure TRG;
begin
linerel(40,0);
linerel(-40,-40);
linerel(0,40);
end;
begin
for k:=1 to 10 do begin setcolor(i+k); moverel(45,0); trg; end;
end;
BEGIN
gd:=vga;
gm:=vgahi;
Initgraph(gd,gm,);
if Graphresult=grok then
begin
MoveTo(10,50);
for i:=1 to 9 do begin LineTrg; MoveRel(-450,50); end;
Repeat Until KeyPressed;
end;
END.
Преиму
Подпрограммы. Процедуры без параметров (Turbo Pascal 7.0)
Лекции по предмету «Программирование»