Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие по Паскалю отредактированное №2..doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
263.68 Кб
Скачать

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.

Задния

  1. Создать программу, имитирующую на экране стакан с чаем, в который падает кусочек сахара. Пока сахар тонет, он тает. Около нижней грани он исчезает.

  2. Создать программу, имитирующую движение в окне надписи, при столкновении с гранью окна, она отскакивает по закону отражения.

  3. Создать программу, имитирующую тараканьи бега. При запуске программы по экрану начинают двигаться пять кубиков слева направо:

а) кубики движутся с разными скоростями, которые устанавливаются в момент запуска программы;

б) скорость кубиков меняется периодически во время движения;

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

  1. Создать программу, имитирующую попарное мигание двух кубиков в разных частях экрана.