- •1. Модуль crt
- •Назначение модуля crt, его подключение и использование
- •1.2. Процедуры управления цветом
- •1.3. Процедуры работы с экраном
- •Задания
- •1.4. Функции опроса клавиатуры
- •Задания
- •1.5. Процедуры и функции управления курсором
- •1.6. Процедуры работы со строками
- •1.7. Процедуры управления встроенным динамиком и таймером
- •2. Структурное программирование
- •2.1. Описание подпрограммы
- •2.2. Основные понятия структурного программирования
- •Литература
2.2. Основные понятия структурного программирования
Фактически подпрограммы представляют собой инструмент, с помощью которого любая программа может быть разбита на ряд, в известной степени, независимых друг от друга частей. Такое разбиение бывает необходимо по двум причинам:
Во-первых, это средство экономии памяти; каждая подпрограмма существует в программе в единственном экземпляре, в то время как обращаться к ней можно многократно из разных точек программы. При вызове подпрограммы активизируется последовательность образующих его операторов, а с помощью передаваемых подпрограмме параметров нужным образом модифицируется реализуемый в ней алгоритм.
Вторая причина заключается в применении методики нисходящего проектирования программ. В этом случае алгоритм представляется в виде последовательности относительно крупных подпрограмм, реализующих более или менее самостоятельные смысловые части алгоритма. Подпрограммы, в свою очередь, могут разбиваться на менее крупные подпрограммы нижнего уровня и т.д. последовательное структурирование программы продолжается до тех пор, пока реализуемые подпрограммами алгоритмы не станут настолько простыми, чтобы их можно было легко запрограммировать.
Как известно, любое имя в программе должно быть обязательно описано, перед тем как оно появится среди исполняемых операторов. Не делается исключения и в отношении подпрограмм: каждую свою процедуру и функцию программисту необходимо описать в разделе описаний.
Программа |
|
|
||||
|
Подпрограмма А |
|
||||
|
|
Подпрограмма AI |
|
|
||
|
|
Подпрограмма А2 |
|
|
||
|
|
|
|
|
||
|
|
|
|
|
||
|
Подпрограмма В |
|
|
|||
|
|
Подпрограмма В1 |
|
|
||
|
|
П |
Подпрограмма В2 |
|
|
|
|
|
|
Подпрограмма В21 |
|
|
|
|
|
|
Подпрограмма В22 |
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
||
Пример структуры программы
Описать подпрограмму – это значит указать ее заголовок и тело. В заголовке объявляются имя подпрограммы и формальные параметры, если они есть. Для функции, кроме того, указывается тип возвращаемого ею результата. За заголовком следует тело подпрограммы, которое, подобно программе состоит из раздела описаний и раздела исполняемых операторов. В разделе описаний подпрограммы могут встретиться описания подпрограмм низшего уровня, в тех - описания других подпрограмм и т.д.
Иерархия описаний для программы, структура которой показана выше, имеет вид:
Program...;
Procedure A;
Procedure Al;
Begin
……..
End {Al};
Procedure A2:
Begin
………
End {A2};
Begin {A}
………
End {A},
Procedure В;
Procedure ВI
Begin
…….
End;{Bl};
Procedure B2;
Procedure B21,
и т.д.
Подпрограмма любого уровня имеет обычно множество имен констант, переменных, типов и вложенных в нее подпрограмм низшего уровня. Считается, что все имена, описанные внутри подпрограммы, локадизуются в ней, т.е. они как бы невидимы снаружи подпрограммы. Таким образом, со стороны операторов, использующих обращение к подпрограмме, она трактуется как «черный ящик», в котором реализуется тот или иной алгоритм. Все детали этой реализации скрыты от глаз пользователя подпрограммы, и поэтому недоступны ему. Так, в рассмотренном выше примере из основной программы можно обратиться к процедурам А и В, но нельзя вызвать ни одну из вложенных в них процедур А1, А2, В1 и т.д.
Это относится не только к именам подпрограмм, но и вообще к любым именам (идентификаторам), объявленным в них константам, переменным, меткам и т.д. все имена (идентификаторы) в пределах подпрограммы должны быть уникальными и не могут совпадать с именем самой подпрограммы.
При входе в подпрограмму низшего уровня становятся доступными не только объявленные в ней имена, но и сохраняется доступ ко всем именам верхнего уровня. Образно говоря, любая подпрограмма как бы окружена полупрозрачными стенками; снаружи подпрограммы мы не видим ее внутренности, но, попав в подпрограмму, можем наблюдать все, что делается снаружи. Так, например, из подпрограммы В21 мы можем вызвать подпрограмму А, использовать имена, объявленные в основной программе, в подпрограммах В и В2. И даже обратиться к ним. Любая подпрограмма может, наконец, вызвать саму себя - такой способ вызова называется рекурсией.
Пусть имеем такое написание:
Program..,;
VarVl:....;
Procedure A;
VarV2:..,;
Procedure В;
VarV3...;
Procedure В1;
VarV4:...;
Procedure B11;
VarV5;
Из процедуры В11 доступны все пять переменных VI,... V5, из процедуры В1 доступны переменные VI,... V4, из центральной программы -только VI.
При взаимодействии подпрограмм одного уровня иерархии вступает в силу основное правило Турбо Паскаль: любая подпрограмма перед ее использованием должны быть описана. Поэтому из подпрограммы В можно вызвать подпрограмму А, но из А вызвать В невозможно. Подпрограмме доступны только те объекты верхнего уровня, которые описаны до описания данной программы. Эти объекты называются глобальными по отношению к подпрограмме.
В отличие от стандартного Паскаля, в Турбо Паскаль допускается произвольная последовательность описания констант, переменных, типов, меток и подпрограмм. Например, раздел Var описания переменных может появляться в пределах раздела описаний одной и той же подпрограммы много раз и перемежаться с объявлениями других объектов и подпрограмм. Для Турбо Паскаль безразличен порядок следования и количество разделов Var, Const, Type, Label, но при определении области действия этих описаний следует помнить, что имена (идентификаторы), описанные ниже по тексту программы, недоступны из ранее описанных подпрограмм, например:
Var VI:...;
Procedure S;
VarV2:...;
End{S};
VarV3:...;
Из процедуры S можно обратиться к переменным VI и V2, но нельзя использовать V3, поскольку описание V3 следует в программе за описанием процедуры S.
Локальные имена (идентификаторы) в подпрограмме могут совпадать с ранее объявленными глобальными именами. В этом случае считается, что локальное имя как бы закрывает глобальное и делает его недоступным, например:
Var i: integer;
Procedure P;
Var
i: integer;
Begin
Writeln (i)
End{P};
Begin
I:=1;
P;
End.
Эта программа выведет на экран произвольное значение внутренней переменной. Если убрать описание переменной из процедуры Р, то на экран будет выведено значение глобальной переменной I, т.е. 1 .
Таким образом, одноименные глобальные и локальные переменные – это разные переменные. Любое обращение к таким переменным в теле подпрограммы трактуется как обращение к локальным переменным, т.е. глобальные переменные в этом случае попросту недоступны.
Пример процедуры, работающей со строками.
При использовании функции Up Case программист, не владеющий анпийским языком, сталкивается с существенными ограничениями сферы применения своих программ. Возникает необходимость в построении функции, преобразующей строчные литеры русского алфавита в прописные. Program MyFunctionUpCase;
Uses CRT;
Var
Words: string;
Procedure MyUpCase (Var Words: string);
(Данная программа обеспечивает полное преобразование строчных литер в прописные, включая литеры русского алфавита}
Var
i: BYTE
Procedure StringManipulation(Var Words: String; i: BYTE);
(Данная процедура осуществляет посимвольное преобразование строки}
Begin
Words [i] of
'a':Words[i]: = 'A';
'6':Words[i]: = 'E';
'в': Words [i]: = 'B';
……………
end;
End;
Begin
for i: = 1 to Length(Words) do StringManipulation(Words, i);
CirScr;
Words: = ‘Современная гуманитарная академия’;
MyUpcase( Words);
Writeln(Words);
End.
В процедуре MyUpcase объявляется только одна переменная. Это переменная типа BYTE, предназначенная в качестве счетчика. Для переменной i был выбран тип BYTE, поскольку максимальная длина строки равна 255 символов, а переменная BYTE как раз обеспечивает хранение чисел с величиной до 255.
В процедуре StringMampulation сначала производится попытка преобразования символов с помощью функции UpCase. Затем для символов русского алфавита, не преобразуемых этой функцией, реализуется прямое преобразование с помощью конструкции CASE OF.
Использование структурного программирования позволяет создавать более сложные, динамичные программные проекты. Пример программы, которая создает на экране окно и имитирует движение в нем кубика белого цвета, который при столкновении с гранью окна отскакивает от него по закону отражения.
Program DemoProcedures;
Uses CRT;
Procedure dvigenie;
Var a,b,x,y:integer;
ch:char;
Procedure Okno;
begin
TextBackGround(blue);
Window(10,1,60,15);
Clrscr;
end;
Procedure Kubik;
begin
TextBackGround(white);
Window(x,y,x+1,y);
ClrScr;
end;
Procedure Dvig;
begin
repeat
Okno;
x:=x+a;
y:=y+b;
kubik;
delay(2000);
until (x>=59) or (x<=10) or (y<=1) or (y>=15);
end;
begin
x:=10;
y:=1;
a:=1;
b:=1;
repeat
if keypressed
then ch:=readkey;
dvig;
if (x<=10) and ((a=-1) and (b=1)) then a:=1;
if (x<=10) and ((a=-1) and (b=-1)) then a:=1;
if (y>=15) and ((a=1) and (b=1)) then b:=-1;
if (y>=15) and ((a=-1) and (b=1)) then b:=-1;
if (x>=59) and ((a=1) and (b=1)) then a:=-1;
if (x>=59) and ((a=1) and (b=-1)) then a:=-1;
if (y<=1) and ((a=1) and (b=-1)) then b:=1;
if (y<=1) and ((a=-1) and (b=-1)) then b:=1;
until ch=#32;
end;
Begin
TextBackGround(0);
ClrScr;
dvigenie;
End.
Задния
Создать программу, имитирующую на экране стакан с чаем, в который падает кусочек сахара. Пока сахар тонет, он тает. Около нижней грани он исчезает.
Создать программу, имитирующую движение в окне надписи, при столкновении с гранью окна, она отскакивает по закону отражения.
Создать программу, имитирующую тараканьи бега. При запуске программы по экрану начинают двигаться пять кубиков слева направо:
а) кубики движутся с разными скоростями, которые устанавливаются в момент запуска программы;
б) скорость кубиков меняется периодически во время движения;
в) скорость кубиков меняется случайным образом у кубиков произвольно во время движения.
Создать программу, имитирующую попарное мигание двух кубиков в разных частях экрана.
