Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
65
Добавлен:
18.05.2015
Размер:
452.43 Кб
Скачать

ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

КАФЕДРА С А П Р

И Г О Ш И Н А Л. В.

Методические указания к выполнению лабораторных работ

по курсу "Алгоритмические языки и программирование"

Часть 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