Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика (начальный курс) - 2 семестр.doc
Скачиваний:
4
Добавлен:
18.11.2019
Размер:
814.08 Кб
Скачать

Подпрограммы.

Понятия подпрограмм. Процедуры и функции.

В практике программирования часто встречаются случаи, когда по логике выполнения программы приходится выполнять одни и те же вычисления, но при различных исходных данных. Для исключения повторений одинакового кода и упрощения программы, повторяющиеся вычисления выделяют в самостоятельную часть программы, которая может быть использована многократно по мере необходимости. Такая автономная часть программы, реализующая определенный алгоритм, оформленная в виде отдельной синтаксической конструкции, снабжённая именем и допускающая обращение к ней из различных частей общей программы, называется подпрограммой. Подпрограмма - это последовательность операторов, которые определены и записаны только в одном месте программы, однако их можно вызвать для выполнения из одной или нескольких точек программы. Каждая подпрограмма определяется уникальным именем.

Алгоритм решения задачи проектируется путем декомпозиции всей задачи в отдельные подзадачи. Обычно подзадачи реализуются в виде подпрограмм.

В Turbo Pascal различают два вида подпрограмм - это процедуры и функции. Процедура и функция - это именованная последовательность описаний и операторов. При использовании процедур или функций Pascal - программа должна содержать текст процедуры или функции и обращение к процедуре или функции. Тексты процедур и функций помещаются в раздел описаний процедур и функций.

Процедура - это независимая именованная часть программы, которую можно вызвать по имени для выполнения определённой в ней последовательности действий. Процедуры служат для задания совокупности действий, направленных на изменение внешней по отношению к ним программной обстановки.

Функция отличается от процедуры тем, что возвращает результат указанного при её описании типа. Вызов функции может осуществляться из выражения, где имя функции используется в качестве операнда. Функции являются частным случаем процедур, и обязательно возвращают в точку вызова результат как значение имени этой функции. При использовании функций необходимо учитывать совместимость типов в выражениях.

Описание и вызов процедур.

Описание процедуры производится в разделе описаний основной программы. Любая процедура оформляется аналогично программе, может содержать заголовок, разделы описаний и операторов. Синтаксис заголовка процедуры:

Procedure <Name>(<Список формальных параметров>);

… {Раздел описаний}

Begin

…{Раздел операторов процедуры}

End;

где Procedure - служебное слово; Name - произвольный идентификатор, определяющий имя процедуры.

Procedure MyProc (A,B,C: Real; var X1,X2: Real);

Begin

WriteLn('A=',A, ' B=', B, 'C=', C);

X1:=A+B;

X2:=A*B-C

End;

Разделы описаний процедуры подобно основной программе могут содержать разделы описания меток (Label), констант (Const), типов (Type), переменных (Var) и раздел процедур и функций. Раздел операторов помещается после служебного слова Begin и заканчивается служебным словом End, после End становится " ; ". В основной программе процедуры располагают перед разделом операторов (телом программы) основной программы.

Формальные параметры - это переменные, посредством которых передаются данные из места вызова процедуры в её тело, либо из процедуры в места вызова. Список формальных параметров может отсутствовать, при этом символ " ; " ставится сразу за именем процедуры и данные из места вызова процедуры в её тело не передаются.

Для вызова процедуры на исполнение к ней необходимо обратится. Вызов процедуры производится указанием имени процедуры и списком фактических параметров:

Name(<Список фактических параметров>);

MyProc(K, L+M, 12, Y1, Y2);

Выполнение оператора вызова процедуры состоит в том, что все формальные параметры заменяются соответствующими фактическими. После этого создается динамический экземпляр процедуры, который и выполняется. После выполнения процедуры происходит передача управления в основную программу, т.е. начинает выполняться оператор, следующий за оператором вызова процедуры.

Фактические параметры - это переменные (или значения заданные явно), которые передаются в процедуры на место формальных параметров. Если в вызываемой процедуре отсутствует список формальных параметров, то список фактических параметров тоже отсутствует.

Количество фактических параметров должно соответствовать количеству формальных параметров; соответствующие фактические и формальные параметры должны совпадать по порядку записи и по типу данных.

Описание и вызов функций.

Оформляется функция аналогично процедуре. Отличительной особенностью функции является то, что она возвращает только один результат выполнения. Этот результат обозначается именем функции и возвращается (передается) в основную программу (место вызова). Функция состоит из заголовка, раздела описаний и раздела операторов.

Function <Name>(<Список формальных параметров>):<Type>;

… {Раздел описаний}

Begin

…{Раздел операторов процедуры}

Name:=<выражение соответствующего типа>;

… End;

где Function - служебное слово; Name - произвольный идентификатор, определяющий имя функции. В отличии от процедур в разделе операторов тела функции обязательно должен быть хотя бы один оператор присвоения имени функции выражения или значения соответствующего типа. После работы функции результат присваивается имени функции.

Таким образом, алгоритм можно оформить в виде функции в том случае, если в качестве результата получается одно единственное значение. Для вызова функции достаточно указать ее имя (с фактическими параметрами) в любом выражении, где тип результата функции будет приемлем. Имя функции можно использовать в арифметических выражениях и других командах.

Пример Разработать функцию, определяющую по двум катетам гипотенузу прямоугольного треугольника.

Function Gepoten(a,b:real):real;

Begin

Gepoten:=Sqrt(Sqr(a)+Sqr(b))

End;

Вызов функции из основной программы может выглядеть следующим образом:

z:=Gepoten(x, y); {z присваивается значение гипотенузы}

или

WriteLn('Значение гипотенузы', Gepoten(x, y));

Параметры-значения и параметры-переменные.

Передача параметров в подпрограмму может осуществляться несколькими способами. Параметры процедур и функций могут быть следующих видов: параметры-значения, параметры-переменные, параметры-константы и не типизированные параметры.

Группа параметров без предшествующего ключевого слова является списком параметров-значений.

Группа параметров, перед которыми следует ключевое слово Const и за которыми следует тип, является списком параметров-констант.

Группа параметров, перед которыми стоит ключевое слово Var и за которыми следует тип, является списком типизированных параметров-переменных.

Группа параметров, перед которыми стоит ключевое слово Var или Const за которыми не следует тип, является списком не типизированных параметров-переменных.

Параметры строкового типа и массивы могут быть открытыми параметрами. Параметры-переменные, описанные с помощью идентификатора OpenString или с использованием ключевого слова string при включённой директиве {$P+}, являются открытыми строковыми параметрами. Значение, константа или параметр-переменная, описанные с помощью синтаксиса array of type, являются открытым параметром-массивом.

При передаче параметров по значению в формальный параметр передаётся копия значения соответствующего фактического параметра, при этом сам формальный параметр создаётся в стеке. Примерами параметров-значений служат параметры A, B и C в процедуре с заголовком MyProc. В этом случае фактическим параметром, соответствующим A, либо B, либо C, может быть любое выражение или переменная типа Real. Для параметров-значений компилятор при вызове процедуры выделяет место в сегменте стека (специальная область оперативной памяти) для каждого формального параметра, вычисляет значение фактического параметра и передаёт его в ячейку, соответствующую формальному параметру, выполняет тело процедуры. После завершения работы процедуры, формальные параметры уничтожаются, а фактические остаются неизменными (по значению).

Формальный параметр-значение обрабатывается, как локальная по отношению к процедуре или функции переменная, за исключением того, что он получает свое начальное значение из соответствующего фактического параметра при активизации процедуры или функции.

Соответствующее фактическое значение параметра-значения должно быть выражением и его значение не должно иметь файловый тип или какой-либо структурный тип, содержащий в себе файловый тип. Фактический параметр должен иметь тип, совместимый по присваиванию с типом формального параметра-значения. Если параметр имеет строковый тип, то формальный параметр будет иметь атрибут размера, равный 255.

Устройства в Turbo Pascal.

В Turbo Pascal и в операционной системе DOS внешняя аппаратура, как например, клавиатура, устройство печати, дисплей, рассматриваются, как устройства. С точки зрения программиста устройство можно рассматривать как файл и с ним можно работать с помощью того же набора стандартных функций, что и с файлом. В Turbo Pascal поддерживается два типа устройств - устройства DOS и устройства для текстовых файлов.

Устройства DOS.

Устройства DOS реализованы с помощью зарезервированных имен устройств, которые имеют специальный смысл. Устройства DOS полностью прозрачны : в Turbo Pascal неизвестно даже, когда файловая переменная связана с устройством, а когда с файлом на диске. Например, программа:

var

Lst : Text;

begin

Assign(Lst, 'LPT1');

Rewrite(Lst);

Writeln(Lst, 'Hello World ...');

Close(Lst);

end.

выведет строку 'Hello World ...' на устройство печати, хотя синтаксис точно такой же, как если бы она выводилась в файл на диске. Устройства, реализованные в операционной системе DOS, используются для одновременного ввода или вывода. Таким образом, устройства в DOS используются , обычно, для вывода текстовых файлов.

Устройство CON.

Устройство CON означает консоль, посредством которой выводимая информация пересылается на экран дисплея, а вводимая информация воспринимается с клавиатуры. Если не было изменено направление ввода или вывода, то стандартные файлы Input и Output и все файлы, которым присвоено пустое имя, ссылаются на устройство CON. Вводимая с устройства CON информация является строчно - ориентированной. Символы считываются из буфера строки, а когда буфер становится пустым, вводится новая строка. При нажатии клавиши CTRL-Z генерируется символ конца файла (end-of-file), после которого функция eof будет возвращать значение True.

Устройства LРT1, LРT2, LРT3.

В качестве возможного построчного устройства печати допускается использование трех устройств печати. Если присоединено одно устройство печати, на него обычно ссылаются как на устройство LРT1. Для этого устройства можно также использовать синоним PRN. Построчное устройство печати - это устройство, предназначенное только для вывода. При любой попытке использовать процедуру Reset для открытия файла, связанного с одним из этих устройств, немедленно генерируется признак конца файла.

Примечание: Стандартный модуль Printer описывает текстовую файловую переменную с именем Lst и устанавливает ее связь с устройством LРT1. Чтобы обеспечить вывод какой-либо информации из вашей программы на устройство печати, включите в предложение uses в своей программе модуль Printer, а для вывода используйте процедуры Write(Lst, ...).

Устройства COM1 и COM2.

Устройствами коммуникационного порта являются два последовательных коммуникационных порта. Вместо COM1 можно использовать синоним AUX.

Устройство NUL.

Нулевое устройство игнорирует любую запись на него и немедленно генерирует признак конца файла при попытке считывания с этого устройства. Его следует использовать, если вы не хотите создавать отдельный файл, а в программе требуется указать имя входного или выходного файла.

Модуль CRT

Модуль Crt реализует ряд мощных программ, которые дают Вам полный контроль над возможностями Вашей машины, такими как управление режимами экрана, расширенные коды клавиатуры, цвета, окна и звук. Crt может быть использован только в программах, которые выполняются на IBM PC, AT, PS/2 и совместимых с ними. Программы, которые не используют модуль Crt посылают выходные данные на экран через DOS, что гораздо медленнее. С использованием модуля Crt, данные посылаются прямо в BIOS, или, для более быстрых операций, прямо в видеопамять.

Инициализационный код модуля Crt назначает текстовые файлы Input и Output на монитор, вместо стандартных файлов вводы и вывода DOS.

Окна.

Crt поддерживает простую, но мощную форму окон. Процедура Window позволяет Вам определить окно в любом месте экрана. Когда Вы пишете в такое окно, окно представлено, как если бы Вы использовали весь экран, оставляя часть экрана не тронутой. Другими словами, экран за пределами окна недоступен. Внутри окна строки могут быть вставлены и удалены, курсор переносится при достижении правого края и текст сдвигается вверх при достижении курсором нижней линии. Все экранные координаты, за исключением тех, которые используются для определения окна, задаются относительно текущего окна и экранные координаты (1,1) соответствуют верхнему левому углу экрана. Окном по умолчанию является весь экран. Также поддерживаются режимы для EGA (43 строки) и VGA (50 строк)

Специальные символы.

Когда идет запись в Output или в файл, который назначен на экран, следующие управляющие символы имеют специальное значение:

Символ

Имя

Описание

#7

Сигнал

Звуковой сигнал через внутренний громкоговоритель.

#8

Символ назад

Передвигает курсор на один символ назад. Если курсор уже на левой границе текущего окна, ничего не случается.

#10

Новая строка

Передвигает курсор на одну строку вниз. Если курсор уже внизу текущего окна, текст сдвигается на одну строку вверх.

#13

Возврат каретки

Возвращает курсор на левый край текущего окна.

Ввод строки.

Когда идет чтение из Input или из текстового файла, который назначает на экран, вводится одна строка входного текста за одну операцию. Строка запоминается во внутреннем буфере текстового файла и когда строка читается, этот буфер используется как входной источник. Когда буфер пуст, вводится новая строка.

Для того, чтобы проверить состояние клавиатуры и ввести отдельные символы под управлением программы, используйте функции KeyPressed и ReadKey.

Константы. Константы цветов текста.

Следующие константы используются в процедурах TextColor и TextBackground:

Константа

Значение

Black

0

Blue

1

Green

2

Cyan

3

Red

4

Magenta

5

Brown

6

LightGray

7

DarkGray

8

LightBlue

9

LightGreen

10

LightCyan

11

LightRed

12

LightMagenta

13

Yellow

14

White

15

Blink

128

Цвета представлены числами с 0 до 15 , для более легкого использования цветов можно использовать эти константы вместо чисел. В цветовых текстовых режимах цвет символов выбирается из 16 цветов и фоновый цвет из 8 цветов. Цвет символов может быть также выбран блинкующий.

Переменные. В Crt определены переменные:

Переменные

Тип

CheckBreak

Boolean

CheckEof

Boolean

CheckSnow

Boolean

DirectVideo

Boolean

LastMode

Word

TextAttr

Byte

WindMin

Word

WindMax

Word

CheckBreak.

Разрешает или запрещает проверки для Ctrl-Break.

var CheckBreak : Вoolean;

Когда CheckBreak в True, нажатие Ctrl-Break будет завершать программу во время ее очередного вывода на экран. Когда CheckBreak в False, нажатие Ctrl-Break не дает эффекта. По умолчанию CheakBreak в True.

CheckEof.

Разрешает или запрещает символ конца файла:

var CheckEof : Вoolean;

Когда CheckEof в True, символ конца файла будет генерироваться, если Вы нажмете Ctrl-Z во время чтения из файла, назначенного на экран. Когда CheckEof равна False, нажатие Ctrl-Z не дает эффекта. По умолчанию CheckEof в False.

CheckSnow.

Разрешает или запрещает "контроль снега" при запоминании символов прямо в видеопамяти.

var CheckSnow : Вoolean;

На большинстве типов CGA на экране будут появляться помехи ("снег") при запоминании символов в видеопамяти не во время обратного хода луча трубки терминала. Этого не случится на монохромных адаптерах или адаптерах типа EGA. Когда выбран цветной режим и CheckSnow в True, прямая запись в видеопамять будет производится только во время обратного хода луча. Если Вы работаете с новым исполнением CGA, Вы можете установить CheckSnow в False в начале Вашей программы и после каждого вызова TextMode. Это будет запрещать проверку на "снег", в результате чего скорость вывода значительно возрастает. CheckSnow не оказывает действие, если DirectVideo в False.

DirectVideo.

Разрешает и запрещает прямой доступ к памяти для Write и Writeln при выводе на экран.

var DirectVideo : Boolean;

Когда DirectVideo в True, Write и Writeln при выводе в файлы, назначенные на экран, будут запоминать символы в видеопамяти вместо вызова BIOS. Когда DirectVideo в False , все символы будут записываться через вызовы BIOS, что значительно медленнее. DirectVideo по умолчанию всегда в True. Если по каким-либо причинам, Вы хотите выводить символы через вызовы BIOS, установите DirectVideo в False в начале Вашей программы и после каждого вызова TextMode.

LastMode.

Каждый раз когда вызывается TextMode, текущий видеорежим запоминается в LastMode. Кроме того, LastMode инициализируется при запуске программы в текущий видеорежим.

var LastMode : Word;

TextAttr.

Содержит текущие атрибуты текста.

var TextAttr : Byte;

Атрибуты текста обычно устанавливаются через вызовы TextColor и TextBackground. Однако, Вы можете установить их прямым запоминанием значения в TextAttr. Информация о цвете кодируется в TextAttr следующим образом:

Биты

7

6

5

4

3

2

1

0

 

B

b

B

b

f

f

f

f

где ffff - 4 битовый цвет символа, bbb - 3 битовый цвет фона, В - бит установки блинкования (мигания). Если Вы используете константы цветов для создания значений TextAttr, помните, что цвет фона может быть выбран только из первых 8 цветов и что он должен быть умножен на 16 для установки его в правильную битовую позицию. Следующий пример выбирает блинкующие желтые символы на синем фоне:

TextAttr := Yellow + Blue * 16 + Blink;

WindMin и WindMax.

Содержат экранные координаты текущего окна.

var WindMin, WindMax : Word;

Эти переменные устанавливаются вызовом процедуры Window. WindMin определяет верхний левый угол и WindMax определяет нижний правый угол. Координата Х запомнена в младшем байте и координата Y запомнена в старшем байте. Например, Lo(WindMin) выдает координату Х левой границы и Hi(WindMax) выдает координату Y нижней границы окна. Верхний левый угол экрана соответствует (X,Y)=(0,0). Заметим, однако, что для координат, передаваемых в Window и GotoXY, верхний левый угол соответствует (1,1).

Процедуры и функции.

Функция

Описание

KeyPressed

Возвращает True, если на клавиатуре была нажата клавиша, и False в противном случае.

ReadKey

Читает символ с клавиатуры.

WhereX

Возвращает Х координату текущей позиции курсора относительно текущего окна. Х - горизонтальная позиция.

WhereY

Возвращает Y координату текущей позиции курсора относительно текущего окна. Y - вертикальная позиция.

Процедура

Описание

AssignCrt

Назначает текстовый файл на экран.

ClrEol

Удаляет все символы от текущей позиции курсора до конца строки без передвижения курсора.

ClrScr

Очищает экран и помещает курсор в верхний левый угол.

Delay

Задержка на указанное число миллисекунд.

DelLine

Удаляет строку на которой находится курсор и перемещает все строки ниже этой строки на строку вверх. Нижняя строка очищается.

GotoXY

Позиционирует курсор. Х - горизонтальная позиция и Y - вертикальная позиция.

HighVideo

Устанавливает высокую интенсивность символов.

InsLine

Вставляет пустую строку в позиции курсора.

LowVideo

Устанавливает низкую интенсивность символов.

NormVideo

Устанавливает нормальную интенсивность символов.

NoSound

Выключает внутренний громкоговоритель.

Sound

Включает внутренний громкоговоритель.

TextBackground

Устанавливает цвет фона.

TextColor

Устанавливает цвет символов.

TextMode

Устанавливает текстовый режим.

Window

Определяет текстовое окно на экране.

1)Функция без параметров KeyPressed возвращает true, если на клавиатуре была нажата любая символьная клавиша, и false в противном случае. Не задерживает выполнение программы.

2)Функция без параметров ReadKey возвращает символ нажатой клавиши без эхо повтора на экране. Приостанавливает выполнений программы до нажатия на любую клавишу.

3) Функции без параметров WhereX, WhereY возвращают

горизонтальную или вертикальную координату текущей позиции курсора относительно текущего окна.

4) Процедура без параметров CIrEol удаляет все символы оттекущей позиции курсора до конца строки без перемещения курсора.

5) Процедура без параметров DelLine удаляет строку, на которой находится курсор, и перемещает все строки ниже этой строки на строку вверх. Нижняя строка очищается.

6) Процедура без параметров ClrScr очищает экран и помещает курсор в верхний левый угол.

7) Процедура Delay приостанавливает работу программы на указанное число миллисекунд (t). DELAY(t);

8) Процедура GotoX,Y перемещает курсор в точку с заданными координатами X,Y текстового экрана или окна, если оно задано. GOTOXY(X,Y);

9) Процедура без параметров InsLine вставляет пустую строку в позицию курсора.

10)Процедуры без параметров HighVideo, LowVideo, NormVideo устанавливают высокую, низкую, нормальную яркость символов. 11 )Процедура Sound включает звуковой генератор с частотой HZ, заданной в герцах: SOUND(hz);

12)Процедура без параметров NoSound выключает звуковой генератор. Обязательная последовательность действий для включения звука: ...sound(.,.);delay(...);nosound;...

13)Процедуры TextColor, TextBackground устанавливают цвет символов и цвет фона в текстовом режиме. ТехtСоlоr(цвет); TextBackground(цвет);

14)Процедура Window определяет текстовое окно на экране:

Window(X1,Y1,X2,Y2); где Х1,У1,Х2,Y2-координаты левого верхнего угла и правого нижнего угла экрана 0<=X<=80,0<=Y<=25.

Графический режим.

Экран дисплея ПК представляет собой прямоугольное поле, состоящее из большого количества точек. Дисплей может работать в текстовом и графическом режимах. Но в отличие от текстового режима в графическом режиме имеется возможность изменять цвет каждой точки.

Чтобы сделать процесс графического программирования более эффективным, фирма Borland International разработала специализированную библиотеку Graph (в этом библиотечном модуле содержится 79 графических процедур, функций, различных стандартных констант и типов данных), набор драйверов, позволяющих работать с разными типами мониторов, и набор шрифтов для вывода на графический экран текстов разной величины и формы.

Аппаратная поддержка графики ПК обеспечивается двумя основными модулями: видеомонитором и видеоадаптером. Какой бы адаптер ни был установлен на компьютере, мы можем использовать один и тот же набор графических процедур и функций Турбо Паскаля благодаря тому, что их конечная настройка на конкретный адаптер осуществляется автоматически. Эту настройку выполняют графические драйверы.

Запуск и завершение работы в графической системе осуществляется следующим образом:

1. Подключить модуль Graph (библиотеку графических процедур): uses Graph;

2. Установить графический режим:

- описываем переменные, которые определяют графический драйвер и монитор:

var gd, gm: integer;

- задаем команду ПК для самовыбора значений переменных:

gd:=Detect;(значение gm после команды gd:=detect; определяется автоматически)

- инициализируем графический режим:

InitGraph( gd, gm,’ указывается путь к драйверу, чем подробнее, тем лучше’)

С этого момента все графические средства доступны пользователю.

3.  Завершить работу в графической системе: CloseGraph;

Для построения изображений на экране используется система координат. Отсчет начинается от верхнего левого угла экрана, который имеет координаты (0,0). Значение Х (столбец) увеличивается слева направо, значение Y (строка) увеличивается сверху вниз. Чтобы строить изображения, необходимо указывать точку начала вывода. В текстовых режимах эту точку указывает курсор, который присутствует на экране. В графических режимах видимого курсора нет, но есть невидимый текущий указатель CP (Current Pointer). Фактически это тот же курсор, но он невидим.