Подпрограммы.
Процедуры без параметров
В практике программирования
часто встречаются ситуации, когда по ходу выполнения программы приходится
производить одни и те же вычисления или действия. Чтобы исключить повторение
одинаковых записей и сделать тем самым программу проще и понятнее, можно
выделить эти повторяющиеся фрагменты в самостоятельную часть программы,
которая может быть использована многократно по мере необходимости. Такая
автономная часть программы, реализующая определённый алгоритм и допускающая
обращение к ней из различных частей программы, называется подпрограммой.
Использование подпрограмм позволяет реализовать один из самых прогрессивных
методов программирования - структурное программирование. Язык
программирования Turbo Pascal 7.0, даже в сравнении с другими промышленными
системами программирования, обладает очень мощными средствами для работы с
подпрограммами.
Описание процедур без
параметров.
Как вы уже знаете, в
структуре Pascal-программы предусмотрен специальный раздел для описания
подпрограмм - раздел описания процедур и функций. Именно в этом разделе
производится описание подпрограмм. Структура любой подпрограммы почти
буквально повторяет структуру всей Pascal-программы, и выглядит следующим
образом:
Procedure <имя процедуры>;
Uses <имена модулей>;
Label <имена меток>;
Const <имена констант>;
Type <имена типов пользователя>;
Var <имена локальных переменных>;
<раздел объявления подпрограмм>;
Begin
<операторы>;
End;
Отличия Pascal-программ
от подпрограмм.
Единственным отличием
процедуры без параметров от Pascal-программы состоит в названии заголовка,
которое начинается не служебным словом Program, а служебным словом Procedure.
Наличие заголовка процедуры обязательно, в отличии от наличия заголовка
программы, который может быть опущен. Кроме того любая подпрограмма
заканчивается служебным словом End и точкой с запятой, в отличии от End с
точкой в Pascal-программе.
Вызов процедур без
параметров.
Вызов процедуры без
параметров осуществляется по имени данной процедуры в теле программы. Имя
процедуры воспринимается как оператор. При выполнении этого оператора
выполняется вся подпрограмма.
Вложенность подпрограмм.
Допускается использование в
одной программе сразу нескольких подпрограмм. Кроме использования
одновременно нескольких подпрограмм Pascal-программа допускает использование
вложенных подпрограмм. То есть каждая подпрограма может содержать в себе
описание других подпрограмм, которые являются таким образом подпрограммами
подпрограмм. Эти подпрограммы, в свою очередь, тоже могут содержать описание
своих подпрограмм и так далее.
Область доступности
переменных (объектов).
Структура подпрограмм
(блоков) Pascal-программ достаточно традиционна для многих языков и требует
определённой дисциплины для доступа к объектам (например переменным,
константам, типам пользователя), описанным в различных блоках. Эту
дисциплину можно сформулировать в виде следующих правил:
- Имена объектов, описанных в некотором блоке,
считаются известными в пределах данного блока, ВКЛЮЧАЯ и все вложенные
блоки.
- Имена объектов, описанных в блоке, должны быть
уникальны в пределах данного блока и могут совпадать с именами объектов
из других блоков.
- Если в некотором блоке описан объект, имя
которого совпадает с именем объекта, описанного в объемлющем блоке, то
это последнее имя становится недоступным в данном блоке.
Говорят, что имя, описанное
в блоке, экранирует (закрывает, делает недоступным) одноимённые объекты из
блоков, объемлющих данный.
Возвращаясь к предыдущей
схеме, можно сказать, что объекты описанные в блоке 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.
Преимущества применения
подпрограмм.
- Появляется возможность использовать при
написании программ, уже готовые, отработанные фрагменты программ,
оформленных в виде подпрограмм.
- Возможно применение технологии программирования
"сверху-вниз". При использовании такой технологии более сложная и
громоздкая задача разбивается на ряд простых и маленьких задач, решение
которых сводится к написанию подпрограмм, объединяемых, в конечном
итоге, в одну программу.
- Написание больших программ можно разделить
между несколькими програмистами одновременно, объединив после этого
подпрограммы, написанные ими, в одну программу.
- В результате использования локальных
параметров, память используется более рационально, так как память под
локальные переменные выделяется только во время работы данной
подпрограммы.
Контрольные вопросы.
- Что называется подпрограммой?
- Как описываются процедуры без параметров?
- Назовите основные отличия подпрограмм от
Pascal-программ.
- Как осуществляется вызов процедур без
параметров?
- Что представляют собой вложенные подпрограммы?
- Сформулируйте правила дисциплины, регулирующие
область доступности различных переменных (объектов).
- Что такое локальные и глобальные переменные?
- Перечислите преимущества использования
подпрограмм.
Задания для
самостоятельного выполнения.
- Изобразите на экране своё имя, высотой в восемь
строк. Каждая буква имени должна быть изображена с помощью своей
отдельной процедуры. Цвет букв различен.
- Нарисуйте на экране свои инициалы используя
линии разного стиля, цвета и толщины. Изображение каждой буквы оформить
с помощью отдельной процедуры.
- Нарисовать на экране последовательность из 7
одинаковых заполненных звёзд разного цвета.
- Составить программу калькулятор. Выполнение
операций "+", "-", "*", "/" оформить в виде отдельных подпрограмм.
- Составить программу для обработки массива
содержащего 10 целых чисел. Определить: 1) сумму элементов массива; 2)
среднее арифметическое элементов массива; 3) максимальный элемент
массива. Выполнение каждого логического блока программы оформить в виде
отдельных процедур.
- Нарисуйте на экране диагональ экрана состоящую
из 15 разноцветных правильных заполненных восьмиугольников.
- Нарисуйте окружность состоящую из 36
разноцветных пятиугольных звёзд, цвет которых непрерывно изменяется.
Программа прекращает свою работу по нажатию любой клавиши.
- Нарисуйте пирамиду состоящую из заполненных
шестиугольников. В основании пирамиды 20 шестиугольников
- Нарисуйте картину "лес", состоящую из
нескольких "рядов" "ёлочек" сложенных из треугольников.
- Нарисуйте олимпийский флаг, состоящий из колец,
каждое из которых, в свою очередь, состоит из 36 окружностей.
- Нарисуйте "сетку" размером 20x20, состоящую из
разноцветных прямоугольных треугольников четырёх видов, различающихся
расположением прямого угла.
- Нарисуйте сетку, в текстовом режиме размером
20x5, состоящую из надписи "Лицей N 53" выполненную различными цветами.
НАЗАД
ДАЛЕЕ
|