
Технологии обработки информации(лекции) / Модули_лаб.работы
.pdfПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
КАФЕДРА С А П Р
И Г О Ш И Н А Л. В.
Методические указания к выполнению лабораторных работ
по курсу "Алгоритмические языки и программирование"
Часть 3
Модули в Турбо Паскале
Пенза 2000
2
Содержание
1. Разработка модулей
1.1Интерфейсная часть или секция связи
1.2Исполняемая часть или секция реализации
1.3Инициирующая часть или секция инициализации
1.4Компиляция модулей
Лабораторная работа № 3.1 (15) Разработка программ с использованием модулей
2.Стандартные модули Турбо Паскаля
2.1Модуль CRT
2.1.1Управление клавиатурой
2.1.2Управление звуком
2.1.3Управление выводом на экран в текстовом режиме
Лабораторная работа № 3.2 (16) Разработка программ с использованием процедур и функций модуля CRT
2.2 Модуль GRAPH
2.2.1Инициализация и закрытие графического режима
2.2.2Графический курсор, координаты экрана в графическом режиме
2.2.3Управление цветом пера и фона
2.2.4Рисование точек и линий
2.2.5Рисование окружностей эллипсов и дуг
2.2.6Рисование прямоугольников, многоугольников и ломаных линий Лабораторная работа № 3.3 (17) Разработка программ с использованием процедур и функций модуля Graph (часть 1)
2.2.7Задание типа заливки
2.2.8Рисование залитых фигур
2.2.9Управление палитрой
2.2.10Вывод текста в графическом режиме
2.2.11Окна и страницы в графическом режиме
2.2.12Сохранение и выдача изображений. Создание движущихся изображений
Лабораторная работа № 3.4 (18) Разработка программ с использованием процедур и функций модуля Graph (часть 2)
Лабораторная работа №3.5 (19) Разработка меню программы
2
3
1. Разработка модулей
При разработке больших и сложных программных систем в среде Турбо Паскаля может возникнуть ситуация, когда выделяемого программе сегмента памяти (64 Кбайт), недостаточно для компиляции программы. В этом случае удобно использовать так называемый модульный подход к разработке программ (модульное программирование), заключающийся в разбиении программы на отдельные конструктивно и функционально-законченные части, называемые модулями. Использование модулей, кроме того, целесообразно для создания собственных библиотек программ (процедур и функций), а также для разделения работы между отдельными программистами в группе.
Для реализации концепции модульного программирования в Турбо Паскале (ТП) используются структурные единицы - модули, обозначаемые ключевым словом Unit . Важной особенностью модулей является то, что компилятор размещает программный код каждого модуля в отдельном сегменте памяти, размер которого не превышает 64 Кбайта.
Модули имеют следующую структуру:
UNIT <Имя модуля>; |
- Заголовок модуля |
INTERFACE |
- Заголовок интерфейсной части |
< Интерфейсная часть или секция связи > |
|
IMPLEMENTATION |
- Заголовок исполняемой части |
< Исполняемая часть или секция реализации >
BEGIN
< Инициирующая часть или секция инициализации >
END.
<Имя модуля> служит для организации связи этого модуля с главной программой и другими модулями. Кроме того, для возможности правильного функционирования модуля в среде ТП, имя модуля должно совпадать с именем файла, в котором находится исходный текст модуля, имеющий расширение .PAS.
Например, пусть модуль имеет имя WORK, тогда его заголовок будет иметь
вид:
UNIT WORK;
Файл, в котором располагается исходный текст модуля на языке ТП, должен иметь имя WORK.PAS. После трансляции модуля результат будет записан в файл WORK.TPU.
Связь между модулями и программами, использующими эти модули, устанавливается с помощью директивы USES, в которой перечисляются присоединяемые модули.
Так, для того, чтобы присоединить модуль с именем WORK необходимо в программах (или других модулях), которые будут использовать WORK, задать в первой строке директиву:
USES WORK;
Если присоединяемых модулей несколько, то они перечисляются в директиве USES через запятую.
3
4
Модули сами могут использовать другие модули. В этом случае внутри них, в частях INTERFACE и/или IMPLEMENTATION, сразу после заголовков должна находиться директива USES.
1.1 Интерфейсная часть или секция связи
Эта часть всегда начинается с ключевого слова INTERFACE.
Вэтой части содержится описание всех глобальных объектов модуля (констант, типов, переменных и подпрограмм), которые должны быть доступны основной программе и/или другим модулям.
Вэтом разделе при объявлении подпрограмм (процедур или функций) указываются только их заголовки.
Например, создадим модуль с именем SORT, который будет содержать несколько процедур, каждая из которых реализует один из алгоритмов сортировки массива, состоящего из N целых чисел. Пусть массив имеет имя MAS, а его размер не превышает 10000 чисел. Тогда интерфейсная часть будет иметь вид:
Unit SORT; Interface Uses CRT;
Const Dl_MAS=10000;
Type TMAS=array[1..DlMAS] of integer; Var MAS:TMAS; N:integer;
Procedure SORT_EXCHANGE; {обменная сортировка} Procedure SORT_CHOICE; {сортировка выбором} Procedure SORT_QUICK; {быстрая сортировка}
Теперь, если в основной программе написать директиву: Uses SORT, то в ней станут доступны константа Dl_MAS, тип TMAS, массив с именем MAS, переменная N и три процедуры: SORT_EXCHANGЕ, SORT_CHOICЕ и
SORT_QUICK.
При этом необходимо помнить, что все константы и переменные, объявленные в интерфейсной части модулей, наряду с глобальными константами и переменными использующей их программы, помещаются компилятором ТП в общий сегмент данных, размер которого не должен превышать 64 Кбайта.
1.2 Исполняемая часть или секция реализации
Эта часть всегда начинается с ключевого слова IMPLEMENTATION. Она содержит описания всех подпрограмм, заголовки которых объявлены в интерфейсной части модуля. Кроме того, здесь могут объявляться локальные для модуля объекты: типы, константы, переменные, а также метки, если они используются в секции инициализации.
При описании подпрограмм, заголовки которых приведены в интерфейсной части, необходимо снова набрать соответствующий заголовок процедуры или функции, а формальные параметры, если они есть, можно уже не указывать.
4
5
1.3 Инициирующая часть или секция инициализации
Завершает описание модуля секция инициализации. Она может отсутствовать вместе с начинающим ее ключевым словом BEGIN и тогда она состоит из одного обязательного слова END. (с точкой). Она может быть пустой: в этом случае присутствует ключевое слово Begin и сразу за ним следует End. (с точкой). И, наконец в ней после ключевого слова Begin могут размещаться исполняемые операторы: обычно задаются начальные значения переменных, открываются файлы и т.п. Последним ставится ключевое слово End с точкой.
1.4 Компиляция модулей
После разработки текста модуля, он должен быть откомпилирован и помещен в файл с расширением tpu. Для компиляции модулей в ТП определены три режима: Compile, Make и Build (см. пункт основного меню ТП - Compile).
Compile - компилирует программу или модуль, который загружен в данный момент в активное окно редактора. Если в этом модуле (или программе) содержаться обращения к нестандартным модулям пользователя (в директиве Uses), то последние уже должны быть предварительно откомпилированы, и храниться на диске в текущем каталоге в виде файлов с расширением .TPU. Эта опция вызывается непосредственно из редактора ТП нажатием Alt-F9.
Make - в этом режиме компилятор проверяет наличие TPUфайлов для каждого объявленного модуля и если какой-либо из файлов не обнаружен, система ищет одноименный файл с расширением PAS (с исходным текстом модуля). Если такой файл есть, то осуществляется его компиляция. Кроме того, в этом режиме система контролирует все изменения, сделанные в исходных текстах модулей, и осуществляет перекомпиляцию всех измененных модулей перед компиляцией основной программы.
Build - в этом режиме осуществляется предварительная компиляция всех подключаемых модулей, независимого от того существуют ли для них соответствующие TPUфайлы и вносились или нет изменения в тексты исходных модулей.
Подключение модулей к основной программе и их возможная компиляция осуществляется в порядке их объявления в директиве Uses.
Лабораторная работа № 3.1 (15)
Разработка программ с использованием модулей
Цель работы:
1.Разработка структуры программы с использованием модулей
2.Разработка и компиляция модулей, подключение разработанных модулей
5

6
Типовой пример
Дан текстовый файл, содержащий записи следующей структуры:
№ рейса |
Пункт |
Пункт |
День |
Время |
|
Цена |
|
отправления |
назначения |
недели |
отправления |
билета |
|
|
|
|
|
Час |
Мин |
|
5 |
15 символов |
15 симв. |
1..7 |
0..23 |
0..59 |
Real |
символов |
|
|
|
|
|
|
1)Ввести заданный список из файла в массив записей.
2)Вывести список на экран.
3)Упорядочить список по возрастанию номеров рейсов одним из алгоритмов сортировки (предусмотреть возможность выбора алгоритма). Процедуры сортировки оформить в виде модуля.
4)Вывести упорядоченный список на экран.
Структурная схема программы может иметь вид:
|
|
|
|
|
|
|
|
|
|
2 |
|
|
|
|
|
||||
|
|
|
|
|
|
|
Выбор |
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
алгоритма |
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
сортировки |
|
|
|
|
|
|
|
|
|
|
||
|
Начало |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Процедура |
|
|
|
|
Процедура |
|
|
|
|
|
Процедура |
|
||||||
|
ввода данных |
|
|
|
|
сортировки |
|
|
|
|
|
обменной |
|
||||||
|
из файла в |
|
|
|
|
выбором |
|
|
|
|
|
сортировки |
|
||||||
|
массив |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
записей |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Процедура |
|
|
|
|
|
|
|
Процедура |
|
|
|
|||||||
|
вывода |
|
|
|
|
|
|
|
вывода |
|
|
|
|||||||
|
массива |
|
|
|
|
|
|
|
упорядоченного |
|
|
|
|||||||
|
записей на |
|
|
|
|
|
|
|
массива записей |
|
|
|
|||||||
|
экран |
|
|
|
|
|
|
|
на экран |
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Конец
6
7
Разработка модуля
Включим в разрабатываемый модуль с именем SORT две процедуры сортировки: обменной сортировки с именем Sort_Exchange и сортировки выбором - Sort_Choose. Все остальные пояснения см. в комментариях.
Unit SORT; {Заголовок модуля}
Interface { Секция связи}
Type |
|
T_Time = record |
{Описание типа для задания времени} |
Hour: 0..23; |
|
Min: 0..59; |
|
end; |
|
T_zap = record |
{Описание типа для одной записи списка} |
nom: string[5];
potpr, pnazn: string[15]; day: 1..7;
time: T_Time; price: real; end;
Var Spis: array[1..1000]of T_zap; {Описание списка - массива из записей} Kol_Zap: word; { Число записей в файле и списке}
Procedure Sort_Exchange; { Описание заголовков процедур модуля} Procedure Sort_Choose;
Implementation {Секция реализации}
Procedure Sort_Exchange; {Процедура обменной сортировки} Var
i: word; Z: T_Zap;
Key: boolean; {Ключ - признак обмена}
Begin
Repeat {Цикл проверок очередности} Key:=false;
For i:=1 to Kol_Zap-1 do
If Spis[i].nom > Spis[i+1].nom then Begin {Обмен записей} Z:=Spis[i];
Spis[i]:=Spis[i+1];
Spis[i+1]:=Z;
Key:=True;
End;
Until Key=False; {Цикл заканчивается в том случае, если ни одна пара записей не переставлялась}
End;
Procedure Sort_Choose; {Процедура сортировки выбором} Var i, j, imin: word; nomr: string[5]; Z: T_Zap;
7
8
Begin
For i:=1 to Kol_Zap-1 do Begin
nomr:=Spis[i].nom; imin:=i; For j:=i+1 to Kol_Zap do
If Spis[j].nom < nomr then begin
nomr:=Spis[j].nom;
imin:=j;
end;
{Обмен целыми записями} Z:=Spis[i]; Spis[i]:=Spis[imin]; Spis[imin]:=z;
End;
End;
End. {Конец модуля}
Сохраняем созданный исходный текст модуля в файле с именем Sort.pas. Затем компилируем его, в результате на диске создается файл Sort.tpu.
Разработка программы, использующей модуль Sort
Включим в программу две процедуры: процедуру ввода списка из текстового файла в массив записей с именем INPUT_SPIS и вывода списка на экран с именем OUT_SPIS.
Uses crt, sort; {Подключение стандартного и разработанного модулей } Var
nom_alg:byte; {переменная для выбора номера алгоритма} Procedure INPUT_SPIS;
Var
F: text; Name_file: string; i: word;
Begin
Writeln(' Введите имя файла со списком'); Readln(Name_file);
Kol_Zap:=0; i:=0; Assign(f,Name_file); Reset(f);
While not eof(f) do Begin i:=i+1;
With Spis[i] do
{ Чтение очередной записи из текстового файла по полям} Readln(f,nom, potpr, pnazn, day,time.hour,time.min,price);
End;
8
9
Kol_zap:=i; {Считанное число записей} Close(f);
End;
Procedure OUT_SPIS; Var i:word;
Begin
Writeln(' № рейса Пункт отправл. Пункт назн. День Время Цена'); For i:=1 to Kol_Zap do
With Spis[i] do
Writeln(' ',nom,' ', potpr,' ', pnazn,' ', day,' ',time.hour,' ',time.min,' ',price); End;
BEGIN {main program} INPUT_SPIS;
Writeln(' Исходный список'); OUT_SPIS;
Writeln(' Введите номер алгоритма сортировки: 1 или 2'); Readln(nom_alg);
If nom_alg = 1 then SORT_EXCHANGE Else SORT_CHOOSE;
Writeln(' Упорядоченный список'); OUT_SPIS;
Readkey;
END.
Варианты заданий
Структуру данных в каждом из вариантов взять из лабораторной работы № 12 или 14. Все остальные пункты задания совпадают с типовым примером.
2. Стандартные модули Турбо Паскаля
В интегрированной |
среде |
ТП |
имеется 8 стандартных |
модулей, |
используемых при работе |
в MS-DOS. |
Они содержат большое |
количество |
полезных процедур и функций, а также описание констант, типов и переменных.
Имена этих модулей: System, Crt, Dos, Graph, Overlay, Graph3, Turbo3, Printer.
Модули Graph, Graph3, Turbo3 выделены в отдельные TPU-файлы, а остальные входят в состав библиотечного файла TURBO.TPL.
Модуль System подключается к любой программе автоматически. Остальные модули подключаются с помощью указания имени соответствующего модуля в директиве Uses.
Модуль System включает в себя целый комплекс математических процедур и функций и процедур и функций преобразования типов, большинство из которых описаны в разделах 2, 13 и др. (часть 1).
9
10
Модуль Printer делает доступным вывод текстов на матричный принтер. В нем определяется файловая переменная LST типа TEXT, которая связывается с логическим устройством PRN. После подключения этого модуля может быть выполнена, например, такая программа:
Uses Printer; |
|
Begin |
Writeln (LST, ' Турбо Паскаль'); |
End.
Модуль CRT содержит описание констант, типов, переменных, процедур и функций, обеспечивающих возможность управлять текстовым режимом работы экрана, а также управлять звуком и чтением с клавиатуры.
Модуль GRAPH содержит описание констант, типов, переменных, процедур и функций, обеспечивающих возможность управлять графическим режимом работы экрана.
Модуль DOS открывает доступ к средствам MS-DOS.
Модуль OVERLAY необходим при разработке больших программ с перекрытием, когда недостаточно основной памяти.
Два оставшихся модуля - TURBO3 и GRAPH3 введены для совместимости с ранней версией 3.0 системы Турбо Паскаль.
2.1Модуль CRT
2.1.1Управление клавиатурой
Впроцессе работы программы, при нажатии на клавиши, соответствующие этим клавишам коды помещаются в буфер клавиатуры, из которого они затем считываются процедурами Read/Readln и функцией Readkey. Когда программа стартует, буфер обычно пуст. Если вы нажимаете какие-либо клавиши, кроме
Shift, Ctrl, Alt, Caps Lock, Scroll Lock, Num Lock, F11, F12, Pause/Break, в буфер заносится код этой клавиши.
Если в программе необходимо проанализировать этот код и в зависимости от него произвести какие-либо действия, то, чтобы быть уверенным, что будет обработан код нужной клавиши, нужно быть уверенным в том, что буфер пуст. Для анализа содержимого буфера клавиатуры в модуле Crt содержится функция опроса: Keypressed. Эта функция возвращает значение True, если в буфере есть хотя бы один символ, и False, если буфер пуст.
Очистить буфер или считать из него записанные коды клавиш можно с помощью функции Readkey, которая возвращает своим результатом один символ (значение типа Char). Причем, необходимо иметь в виду, что:
1)полученные функцией символы не отображаются на экране (в отличие от ввода
спомощью процедур Read / Readln);
2)режим работы Readkey зависит от состояния буфера ввода: если в нем есть символы, то первый из них вынимается и удаляется, а если буфер пуст, то работа программы приостанавливается до тех пор, пока не будет нажата какаялибо клавиша, генерирующая символьный код.
10