ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
КАФЕДРА С А П Р
И Г О Ш И Н А Л. В. Методические указания к выполнению лаборато...
6 downloads
193 Views
442KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
КАФЕДРА С А П Р
И Г О Ш И Н А Л. В. Методические указания к выполнению лабораторных работ по курсу "Алгоритмические языки и программирование"
Часть 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
Типовой пример Дан текстовый файл, содержащий записи следующей структуры: № рейса
Пункт отправления
Пункт назначения
День недели
Время отправления Час Мин 0..23 0..59
Цена билета
5 15 символов 15 симв. 1..7 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
11
Используя эти особенности можно очистить буфер ввода, задав в программе: Var symbol: char; While Keypressed do symbol:=Readkey; Следующий цикл организует процесс ожидания нажатия любой клавиши: Repeat . . . Until Keypressed; Можно организовать процесс ожидания нажатия определенных клавиш, например, цифровых,: от 0 до 9, а затем в зависимости от того какая была введена цифра, произвести определенные действия. Uses crt; Var sym: char; Begin Writeln(' Для выбора варианта нажмите клавишу от 0 до 9'); {Очиска буфера клавиатуры} While Keypressed do sym:=Readkey; Repeat sym := Readkey; Until (sym in ['0'..'9']); {Цикл закончится только в том случае, если будет нажата одна из цифровых клавиш} {Обработка кода нажатой клавиши} Case sym of '0': begin … end; '1': begin … end; '2': begin … end; ... '9': begin … end; End; {Case} End. При использовании процедуры Readkey в буфер клавиатуры помещаются расширенные коды нажатых клавиш. Если нажимается любая алфавитноцифровая клавиша, расширенный код совпадает с ASCII-кодом соответствующего символа. При нажатии функциональных клавиш F1…F10, клавиш управления курсором, клавиш Insert, Home, Delete, End, Page Up, Page Down в буфер помещается двухбайтная последовательность: сначала символ #0, а затем расширенный код клавиши. Таким образом, значение #0, возвращаемое функцией Readkey, используется для того, чтобы указать программе на генерацию расширенного кода. Получив это значение, программа должна еще раз обратиться к функции Readkey, чтобы прочитать расширенный код клавиши. Расширенные коды клавиш можно посмотреть в книгах, с описанием языка Турбо Паскаль [1,2], а можно воспользоваться простой программой, написанной на языке Турбо Паскаль. Программа завершается при нажатии клавиши Esc. Uses Crt; Var sym:char; Begin 11
12
Repeat sym:=Readkey; if sym <> #0 then Writeln(ord(sym)) else Writeln('0 ',ord(Readkey)); Until sym = #27; End. 2.1.2 Управление звуком В модуль Crt включены три процедуры, позволяющие запрограммировать последовательность звуков, что можно использовать для привлечения внимания в определенных ситуациях при выполнении программы. Процедура Sound заставляет динамик звучать с заданной частотой: Procedure Sound(N); N - выражение типа Word, определяющее частоту звука в герцах. После обращения к процедуре включается динамик и выключить его можно с помощью вызова процедуры без параметров Nosound. Процедура Delay(T) обеспечивает задержку работы программы на заданный интервал времени Т (в миллисекундах), где Т - выражение типа Word, Для генерации звукового сигнала обычно используется вызов описанных процедур по схеме Sound - Delay - Nosound. 2.1.3 Управление выводом на экран в текстовом режиме Используемое в ПК устройство визуального отображения информации дисплей состоит из монитора (или экрана) и блока управления - адаптера. Адаптер может работать в двух режимах: текстовом и графическом. Будем рассматривать возможности модуля Crt для адаптеров типа CGA, EGA, VGA, SVGA. В текстовом режиме можно задавать режимы, позволяющие изменять цвет и число строк экрана (25, 43, 50) и позиций в строке (40 или 80). Для задания одного из возможных текстовых режимов используется процедура: TextMode(Mode). Здесь Mode - код текстового режима, константа типа Word. В качестве Mode могут использоваться следующие константы, определенные в модуле Crt: Const BW40 = 0; {Черно-белый режим 40 х 25} Co40 = 1; {Цветной режим 40 х 25} BW80 = 2; {Черно-белый режим 80 х 25} Co80 = 3; {Цветной режим 80 х 25} Font8x8 = 256; {Используется для загружаемого шрифта в режиме 80 х 43 или 80 х 50 с адаптерами EGA или VGA} Код режима, установленного с помощью вызова процедуры Textmode, запоминается в глобальной переменной модуля Crt - LastMode (тип Word) и может использоваться для восстановления начального состояния экрана. 12
13
Процедура TextMode сбрасывает все предшествующие установки цвета и окон, очищает экран и переводит курсор в его левый верхний угол. В текстовом режиме можно открывать окна - области экрана, в которые можно выводить текстовую информацию. Для этого используется процедура Windows(X1, Y1, X2, Y2), где X1,Y1 - координаты верхнего левого угла окна; X2,Y2 - координаты нижнего правого угла окна. Левый верхний угол экрана имеет координаты (1,1). Сразу после вызова процедуры курсор помещается в левый верхний угол окна, а само окно очищается (заполняется цветом фона) после очистки экрана. Если какая либо из координат (X1, Y1, X2, Y2) выходит за границы экрана или не верно указана, то процедура не выполняется. В программе одновременно можно открыть несколько окон, координаты любого из окон задаются всегда в "абсолютных" координатах, т.е. относительно начала экрана. Очистка текущего окна или всего экрана осуществляется с помощью процедуры Clrscr. Для установки цвета фона (экрана) используется процедура TextBackGround(N), N - выражение типа Byte, задающее код цвета. Этот код удобно задавать с помощью констант, объявленных в модуле Crt: N от 0 до 7. Const Black = 0; { Черный} Blue = 1; { Синий} Green = 2; { Зеленый} Cyan = 3; { Голубой} Red = 4; { Красный} Magenta = 5; { Фиолетовый} Brown = 6; {Коричневый} LightGray = 7; { Светло-серый} Цвет фона изменится после того, как в программе будет использована процедура очистки экрана Clrscr (производится заполнение экрана или окна заданным цветом фона). Для задания цвета символов (пера) используется процедура TextColor(N). N от 0 до 15: первые 8 цветов те же, что используются для задания цвета фона. Остальные цвета задаются следующими константами: Const DarkGray = 8; {Темно-серый} LightBlue = 9; {Светло-синий} LightGreen = 10; {Светло-зеленый} LightCyan = 11; {Ярко-голубой} LightRed = 12; {Светло-красный} LightMagenta = 13; {Светло-фиолетовый} Yellow = 14; {Желтый} White = 15; {Белый} 13
14
Здесь же определена константа, которая задает режим мерцания символов: Blink = 128; Следует иметь в виду, что на некоторых типах дисплеев вместо мерцания символов (при задании вместе с цветом символов режима мерцания) изменяется цвет фона (он становится более ярким). Для восстановления исходных цветов символов и фона можно использовать процедуру NormVideo. Рассмотрим пример вывода информации в текстовом режиме с изменением цвета фона и символов. uses Crt; begin {Начало работы программы - исходные цвета} Writeln(' Начало работы программы - исходные цвета '); { Зеленые символы на черном фоне} TextColor(Green); TextBackground(Black); WriteLn(' Зеленые символы на черном фоне '); { Мерцающие красные символы на светло - сером фоне } TextColor(Red+Blink); TextBackground(LightGray); WriteLn(' Мерцающие красные символы на светло - сером фоне!'); { Желтые символы на синем фоне} TextColor(Yellow); TextBackground(Blue); WriteLn(' Желтые символы на синем фоне!'); NormVideo; {Возврат в нормальный режим цветовоспроизведения } WriteLn(' Возврат в нормальный режим цветовоспроизведения '); end. Можно также устанавливать режимы повышенной и пониженной яркости воспроизведения цвета на экране. Для этого используются две процедуры модуля Crt: HighVideo и LowVideo, задающие повышенную и пониженную яркость, соответственно. Следует отметить, что на практике различий между нормальным и пониженным режимами яркости не наблюдается. Следующая простая программа иллюстрирует использование процедур задания яркости. Uses crt; begin textcolor(blue); textbackground(black); write(' Демонстрация использования '); highvideo; write(' повышенной яркости '); lowvideo; writeln(' для выделения необходимой информации на экране'); readkey; end. Можно управлять цветом фона и символов, мерцанием и режимами яркости с помощью задания системной переменной TextAttr, определенной в модуле Crt. Тип этой переменной - byte и она может принимать значения от 0 до 255. Каждый из восьми битов этой переменной содержит определенную информацию: 14
15
7
6
5
4
Задает бит мерцания Задают цвет или яркости фона
3
2
1
0
Задают цвет символов
TextAttr:= C1+16*C2+128; или TextAttr:= C1+16*C2; C1 - цвет символов (от 0 до 15); С2 - цвет фона (от 0 до 7); +128 - задает мерцание или заносит в бит яркости 1, т.е. задает режим повышенной яркости. При выводе на экран можно перемещать курсор перед выводом в нужную позицию. Для этого используется процедура: GotoXY(X,Y), где Х - координата курсора по оси х - номер позиции в строке; Y - координата курсора по оси у - номер строки. Координаты курсора задаются относительно текущего окна или относительно начала координат экрана, если окна не открывались. Можно определить текущие координаты курсора на экране. Для этого используются функции, выдающие результат типа Byte: WhereX - выдает горизонтальную координату - номер позиции в строке; WhereY - выдает вертикальную координату - номер строки экрана; Следующий пример иллюстрирует использование процедур Window, GotoXY и функций WhereX и WhereY. Uses crt; Var x,y:byte; pred_mode:word; Begin clrscr; textbackground(7); {Установка цвета фона: 7 - светло-серый} textcolor(1); {Установка цвета символов: 1 - синий} { Включение звукового сигнала } sound(200); delay(500); nosound; {} window(10,5,70,20); { Установка размеров окна} clrscr; { Для появления окна его надо очистить} gotoxy(3,5); {Перемещение курсора в 3-ю позицию 5-й строки} write(' Координаты курсора в открытом окне'); x:=wherex;y:=wherey; { Определение координат курсора в окне} writeln('x=',x,' y=',y); {Вывод координат - сам курсор во время вывода его координат перемещается} readkey; pred_mode:= LastMode; {Сохранение кода режима} textmode(co40);{Установка нового текствого режима } window(5,8,35,18); {Задание координат окна} textbackground(3); {3 - Cyan} textcolor(14); {14 - Yellow} 15
16
clrscr; gotoxy(10,4); writeln(' Режим со40 - 40 х 25 '); readkey; normvideo; textmode(pred_mode); {Восстановление режима 80 х 25 - со80} clrscr; gotoxy(30,12); writeln(' Режим co80'); readkey; {Следующий цикл рисует множество окон различных размеров и цвета фона - цикл продолжается до нажатия клавиши } repeat X := Random(10); Y := Random(5); Window(X, Y, X + Random(70), Y + Random(20)); delay(200); TextBackground(Random(7)); { In random colors } ClrScr; until KeyPressed; {Восстановление стандартных установок текстового режима} textcolor(7);textbackground(0); window(1,1,80,25); clrscr; readkey; gotoXY(20,12); writeln(' Восстановлены стандартные установки'); readkey; End. В модуле Crt имеются еще три процедуры, которые могут оказаться полезными при разработке текстовых редакторов или прокрутки содержимого экрана вверх и вииз. ClrEOL - стирает часть строки от текущего положения курсора до правой границы окна (или экрана). Курсор при этом не меняет своих координат. InsLine - вставляет пустую строку и сдвигает строку с курсором и все расположенные под ней вниз на одну строку - самая нижняя исчезает с экрана. DelLine - удаляет строку в которой находится курсор и подтягивает вверх все нижерасположенные строки. Лабораторная работа № 3.2 (16) Разработка программ с использованием процедур и функций модуля CRT Цель работы: 1. Изучение процедур и функций модуля Crt. 2. Разработка программ с использованием модуля Crt. Варианты заданий Вариант 1 1. Открыть окно с координатами х1=10, y1=5, x2=70, y2=20. 2. Окрасить его в синий цвет. 16
17
3. Установить цвет символов - белый. 4. Вывести на экран фамилии и имена членов бригады, расположив информацию в центре окна. 5. Очистить текущее окно. 6. Установить режим TextMode(co40). 7. Открыть окно с координатами х1=8, y1=8, x2=36, y2=17. 8. Повторить пункты 2-5, заменив цвет фона на зеленый и символов на черный. 9. Восстановить текстовый режим TextMode(co80). 10. Переместить курсор в центр окна. 11. Вывести сообщение: "ПРОВЕРКА ЗВУКА". 12. Определить и вывести на экран координаты курсора. 13. Установить частоту звука 500 и длительность 250, а затем отключить звук 14. Восстановить цвета и режимы. Вставлять функцию Readkey во всех необходимых для контроля местах. Вариант 2 1. Открыть окно с координатами х1=6, y1=4, x2=72, y2=22. 2. Окрасить его в красный цвет. 3. Установить цвет символов - желтый. 4. Вывести на экран фамилии и имена членов бригады, расположив информацию в центре окна. 5. Очистить текущее окно. 6. Установить режим TextMode(co40). 7. Открыть окно с координатами х1=4, y1=4, x2=32, y2=19. 8. Повторить пункты 2-5, заменив цвет фона на синий и символов на белый. 9. Восстановить текстовый режим TextMode(co80). 10. Переместить курсор в центр окна. 11. Вывести сообщение: "ПРОВЕРКА КООРДИНАТ И ЗВУКА". 12. Определить и вывести на экран координаты курсора. 13. Установить частоту звука 800 и длительность 500, а затем отключить звук 14. Восстановить цвета и режимы. Вставлять функцию Readkey во всех необходимых для контроля местах. Вариант 3 1. Открыть окно с координатами х1=12, y1=3, x2=74, y2=21. 2. Окрасить его в зеленый цвет. 3. Установить цвет символов - черный. 4. Вывести на экран фамилии и имена членов бригады, расположив информацию в центре окна. 5. Очистить текущее окно. 6. Установить режим TextMode(co40). 7. Открыть окно с координатами х1=6, y1=3, x2=34, y2=22. 8. Повторить п.п. 2-5, заменив цвет фона на голубой и символов на красный. 17
18
9. Восстановить текстовый режим TextMode(co80). 10. Переместить курсор в центр окна. 11. Вывести сообщение: "ПРОВЕРКА ЗВУКА". 12. Определить и вывести на экран координаты курсора. 13. Установить частоту звука 100 и длительность 350, а затем отключить звук 14. Восстановить цвета и режимы. Вставлять функцию Readkey во всех необходимых для контроля местах. Вариант 4 1. Открыть окно с координатами х1=14, y1=5, x2=66, y2=20. 2. Окрасить его в серый цвет. 3. Установить цвет символов - сиреневый. 4. Вывести на экран фамилии и имена членов бригады, расположив информацию в центре окна. 5. Очистить текущее окно. 6. Установить режим TextMode(co40). 7. Открыть окно с координатами х1=5, y1=3, x2=33, y2=18. 8. Повторить пункты 2-5, заменив цвет фона на зеленый и символов на белый. 9. Восстановить текстовый режим TextMode(co80). 10. Переместить курсор в центр окна. 11. Вывести сообщение: "ПРОВЕРКА КООРДИНАТ И ЗВУКА". 12. Определить и вывести на экран координаты курсора. 13. Установить частоту звука 200 и длительность 450, а затем отключить звук 14. Восстановить цвета и режимы. Вставлять функцию Readkey во всех необходимых для контроля местах. Вариант 5 1. Открыть окно с координатами х1=7, y1=3, x2=74, y2=21. 2. Окрасить его в ceрый цвет. 3. Установить цвет символов - красный. 4. Вывести на экран фамилии и имена членов бригады, расположив информацию в центре окна. 5. Очистить текущее окно. 6. Установить режим TextMode(co40). 7. Открыть окно с координатами х1=5, y1=3, x2=35, y2=19. 8. Повторить пункты 2-5, изменив цвет фона на голубой и символов на желтый. 9. Восстановить текстовый режим TextMode(co80). 10. Переместить курсор в центр окна. 11. Вывести сообщение: "ПРОВЕРКА ЗВУКА И КООРДИНАТ". 12. Определить и вывести на экран координаты курсора. 13. Установить частоту звука 400 и длительность 450, а затем отключить звук 14. Восстановить цвета и режимы. Вставлять функцию Readkey во всех необходимых для контроля местах. 18
19
Вариант 6 1. Открыть окно с координатами х1=14, y1=3, x2=74, y2=22. 2. Окрасить его в синий цвет. 3. Установить цвет символов - желтый. 4. Вывести на экран фамилии и имена членов бригады, расположив информацию в центре окна. 5. Очистить текущее окно. 6. Установить режим TextMode(co40). 7. Открыть окно с координатами х1=2, y1=2, x2=38, y2=19. 8. Повторить пункты 2-5, изменив цвет фона на серый и символов на яркокрасный. 9. Восстановить текстовый режим TextMode(co80). 10. Переместить курсор в центр окна. 11. Вывести сообщение: "ПРОВЕРКА КООРДИНАТ И ЗВУКА". 12. Определить и вывести на экран координаты курсора. 13. Установить частоту звука 800 и длительность 450, а затем отключить звук 14. Восстановить цвета и режимы. Вставлять функцию Readkey во всех необходимых для контроля местах. Вариант 7 1. Открыть окно с координатами х1=7, y1=2, x2=74, y2=23. 2. Окрасить его в черный цвет. 3. Установить цвет символов - белый. 4. Вывести на экран фамилии и имена членов бригады, расположив информацию в центре окна. 5. Очистить текущее окно. 6. Установить режим TextMode(co40). 7. Открыть окно с координатами х1=8, y1=4, x2=34, y2=19. 8. Повторить пункты 2-5, изменив цвет фона на серый и символов на синий. 9. Восстановить текстовый режим TextMode(co80). 10. Переместить курсор в центр окна. 11. Вывести сообщение: "ПРОВЕРКА ЗВУКА". 12. Определить и вывести на экран координаты курсора. 13. Установить частоту звука 300 и длительность 550, а затем отключить звук 14. Восстановить цвета и режимы. Вставлять функцию Readkey во всех необходимых для контроля местах. Вариант 8 1. Открыть окно с координатами х1=2, y1=2, x2=78, y2=20. 2. Окрасить его в зеленый цвет. 3. Установить цвет символов - красный. 19
20
4. Вывести на экран фамилии и имена членов бригады, расположив информацию в центре окна. 5. Очистить текущее окно. 6. Установить режим TextMode(co40). 7. Открыть окно с координатами х1=6, y1=4, x2=34, y2=18. 8. Повторить пункты 2-5, изменив цвет фона на голубой и символов на синий. 9. Восстановить текстовый режим TextMode(co80). 10. Переместить курсор в центр окна. 11. Вывести сообщение: "ПРОВЕРКА ЗВУКА". 12. Определить и вывести на экран координаты курсора. 13. Установить частоту звука 150 и длительность 550, а затем отключить звук 14. Восстановить цвета и режимы. Вставлять функцию Readkey во всех необходимых для контроля местах. Вариант 9 1. Открыть окно с координатами х1=13, y1=3, x2=68, y2=20. 2. Окрасить его в серый цвет. 3. Установить цвет символов - черный. 4. Вывести на экран фамилии и имена членов бригады, расположив информацию в центре окна. 5. Очистить текущее окно. 6. Установить режим TextMode(co40). 7. Открыть окно с координатами х1=4, y1=4, x2=34, y2=22. 8. Повторить пункты 2-5, изменив цвет фона на зеленый и символов на черный. 9. Восстановить текстовый режим TextMode(co80). 10. Переместить курсор в центр окна. 11. Вывести сообщение: "ПРОВЕРКА ЗВУКА". 12. Определить и вывести на экран координаты курсора. 13. Установить частоту звука 250 и длительность 650, а затем отключить звук 14. Восстановить цвета и режимы. Вставлять функцию Readkey во всех необходимых для контроля местах. В а р и а н т 10 1. Открыть окно с координатами х1=9, y1=5, x2=75, y2=22. 2. Окрасить его в синий цвет. 3. Установить цвет символов - желтый. 4. Вывести на экран фамилии и имена членов бригады, расположив информацию в центре окна. 5. Очистить текущее окно. 6. Установить режим TextMode(co40). 7. Открыть окно с координатами х1=5, y1=3, x2=35, y2=19. 8. Повторить пункты 2-5, изменив цвет фона на серый и символов - желтый. 9. Восстановить текстовый режим TextMode(co80). 20
21
10. Переместить курсор в центр окна. 11. Вывести сообщение: "ПРОВЕРКА ЗВУКА". 12. Определить и вывести на экран координаты курсора. 13. Установить частоту звука 200 и длительность 750, а затем отключить звук 14. Восстановить цвета и режимы. Вставлять функцию Readkey во всех необходимых для контроля местах. В а р и а н т 11 1. Открыть окно с координатами х1=9, y1=7, x2=73, y2=22. 2. Окрасить его в коричневый цвет. 3. Установить цвет символов - белый. 4. Вывести на экран фамилии и имена членов бригады, расположив информацию в центре окна. 5. Очистить текущее окно. 6. Установить режим TextMode(co40). 7. Открыть окно с координатами х1=4, y1=3, x2=37, y2=21. 8. Повторить пункты 2-5, изменив цвет фона на красный и символов на желтый. 9. Восстановить текстовый режим TextMode(co80). 10. Переместить курсор в центр окна. 11. Вывести сообщение: "ПРОВЕРКА ЗВУКА". 12. Определить и вывести на экран координаты курсора. 13. Установить частоту звука 500 и длительность 550, а затем отключить звук 14. Восстановить цвета и режимы. Вставлять функцию Readkey во всех необходимых для контроля местах. В а р и а н т 12 1. Открыть окно с координатами х1=10, y1=3, x2=75, y2=22. 2. Окрасить его в сиреневый цвет. 3. Установить цвет символов - белый. 4. Вывести на экран фамилии и имена членов бригады, расположив информацию в центре окна. 5. Очистить текущее окно. 6. Установить режим TextMode(co40). 7. Открыть окно с координатами х1=5, y1=5, x2=38, y2=19. 8. Повторить пункты 2-5, изменив цвет фона на синий и символов на желтый. 9. Восстановить текстовый режим TextMode(co80). 10. Переместить курсор в центр окна. 11. Вывести сообщение: "ПРОВЕРКА ЗВУКА". 12. Определить и вывести на экран координаты курсора. 13. Установить частоту звука 700 и длительность 450, а затем отключить звук 14. Восстановить цвета и режимы. Вставлять функцию Readkey во всех необходимых для контроля местах. 21
22
В а р и а н т 13 1. Открыть окно с координатами х1=11, y1=4, x2=71, y2=22. 2. Окрасить его в зеленый цвет. 3. Установить цвет символов - черный. 4. Вывести на экран фамилии и имена членов бригады, расположив информацию в центре окна. 5. Очистить текущее окно. 6. Установить режим TextMode(co40). 7. Открыть окно с координатами х1=6, y1=1, x2=34, y2=12. 8. Повторить п.п. 2-5, заменив цвет фона на голубой и символов на красный. 9. Восстановить текстовый режим TextMode(co80). 10. Переместить курсор в центр окна. 11. Вывести сообщение: "ПРОВЕРКА ЗВУКА". 12. Определить и вывести на экран координаты курсора. 13. Установить частоту звука 1100 и длительность 350, а затем отключить звук 14. Восстановить цвета и режимы. Вставлять функцию Readkey во всех необходимых для контроля местах. В а р и а н т 14 1. Открыть окно с координатами х1=11, y1=5, x2=66, y2=23. 2. Окрасить его в серый цвет. 3. Установить цвет символов - сиреневый. 4. Вывести на экран фамилии и имена членов бригады, расположив информацию в центре окна. 5. Очистить текущее окно. 6. Установить режим TextMode(co40). 7. Открыть окно с координатами х1=4, y1=3, x2=33, y2=14. 8. Повторить пункты 2-5, заменив цвет фона на черный и символов на белый. 9. Восстановить текстовый режим TextMode(co80). 10. Переместить курсор в центр окна. 11. Вывести сообщение: "ПРОВЕРКА КООРДИНАТ И ЗВУКА". 12. Определить и вывести на экран координаты курсора. 13. Установить частоту звука 300 и длительность 250, а затем отключить звук 14. Восстановить цвета и режимы. Вставлять функцию Readkey во всех необходимых для контроля местах. В а р и а н т 15 1. Открыть окно с координатами х1=7, y1=3, x2=74, y2=21. 2. Окрасить его в ceрый цвет. 3. Установить цвет символов - красный. 4. Вывести на экран фамилии и имена членов бригады, расположив 22
23
информацию в центре окна. 5. Очистить текущее окно. 6. Установить режим TextMode(co40). 7. Открыть окно с координатами х1=5, y1=3, x2=35, y2=19. 8. Повторить пункты 2-5, изменив цвет фона на голубой и символов на желтый. 9. Восстановить текстовый режим TextMode(co80). 10. Переместить курсор в центр окна. 11. Вывести сообщение: "ПРОВЕРКА ЗВУКА И КООРДИНАТ". 12. Определить и вывести на экран координаты курсора. 13. Установить частоту звука 400 и длительность 450, а затем отключить звук 14. Восстановить цвета и режимы. Вставлять функцию Readkey во всех необходимых для контроля местах. В а р и а н т 16 1. Открыть окно с координатами х1=14, y1=3, x2=74, y2=22. 2. Окрасить его в синий цвет. 3. Установить цвет символов - желтый. 4. Вывести на экран фамилии и имена членов бригады, расположив информацию в центре окна. 5. Очистить текущее окно. 6. Установить режим TextMode(co40). 7. Открыть окно с координатами х1=2, y1=2, x2=38, y2=19. 8. Повторить пункты 2-5, изменив цвет фона на серый и символов на яркокрасный. 9. Восстановить текстовый режим TextMode(co80). 10. Переместить курсор в центр окна. 11. Вывести сообщение: "ПРОВЕРКА КООРДИНАТ И ЗВУКА". 12. Определить и вывести на экран координаты курсора. 13. Установить частоту звука 800 и длительность 450, а затем отключить звук 14. Восстановить цвета и режимы. Вставлять функцию Readkey во всех необходимых для контроля местах. В а р и а н т 17 1. Открыть окно с координатами х1=7, y1=2, x2=74, y2=23. 2. Окрасить его в черный цвет. 3. Установить цвет символов - белый. 4. Вывести на экран фамилии и имена членов бригады, расположив информацию в центре окна. 5. Очистить текущее окно. 6. Установить режим TextMode(co40). 7. Открыть окно с координатами х1=4, y1=4, x2=34, y2=19. 8. Повторить пункты 2-5, изменив цвет фона на серый и символов на синий. 9. Восстановить текстовый режим TextMode(co80). 23
24
10. Переместить курсор в центр окна. 11. Вывести сообщение: "ПРОВЕРКА ЗВУКА". 12. Определить и вывести на экран координаты курсора. 13. Установить частоту звука 300 и длительность 450, а затем отключить звук 14. Восстановить цвета и режимы. Вставлять функцию Readkey во всех необходимых для контроля местах. В а р и а н т 18 1. Открыть окно с координатами х1=2, y1=5, x2=78, y2=20. 2. Окрасить его в зеленый цвет. 3. Установить цвет символов - красный. 4. Вывести на экран фамилии и имена членов бригады, расположив информацию в центре окна. 5. Очистить текущее окно. 6. Установить режим TextMode(co40). 7. Открыть окно с координатами х1=6, y1=4, x2=38, y2=18. 8. Повторить пункты 2-5, изменив цвет фона на голубой и символов на синий. 9. Восстановить текстовый режим TextMode(co80). 10. Переместить курсор в центр окна. 11. Вывести сообщение: "ПРОВЕРКА ЗВУКА". 12. Определить и вывести на экран координаты курсора. 13. Установить частоту звука 150 и длительность 350, а затем отключить звук 14. Восстановить цвета и режимы. Вставлять функцию Readkey во всех необходимых для контроля местах. В а р и а н т 19 1. Открыть окно с координатами х1=3, y1=3, x2=78, y2=20. 2. Окрасить его в серый цвет. 3. Установить цвет символов - черный. 4. Вывести на экран фамилии и имена членов бригады, расположив информацию в центре окна. 5. Очистить текущее окно. 6. Установить режим TextMode(co40). 7. Открыть окно с координатами х1=4, y1=4, x2=36, y2=22. 8. Повторить пункты 2-5, изменив цвет фона на зеленый и символов на черный. 9. Восстановить текстовый режим TextMode(co80). 10. Переместить курсор в центр окна. 11. Вывести сообщение: " П Р О В Е Р К А З В У К А". 12. Определить и вывести на экран координаты курсора. 13. Установить частоту звука 350 и длительность 250, а затем отключить звук 14. Восстановить цвета и режимы. Вставлять функцию Readkey во всех необходимых для контроля местах. 24
25
В а р и а н т 20 1. Открыть окно с координатами х1=6, y1=4, x2=75, y2=22. 2. Окрасить его в синий цвет. 3. Установить цвет символов - желтый. 4. Вывести на экран фамилии и имена членов бригады, расположив информацию в центре окна. 5. Очистить текущее окно. 6. Установить режим TextMode(co40). 7. Открыть окно с координатами х1=5, y1=2, x2=38, y2=19. 8. Повторить пункты 2-5, изменив цвет фона на серый и символов - желтый. 9. Восстановить текстовый режим TextMode(co80). 10. Переместить курсор в центр окна. 11. Вывести сообщение: "ПРОВЕРКА ЗВУКА". 12. Определить и вывести на экран координаты курсора. 13. Установить частоту звука 200 и длительность 450, а затем отключить звук 14. Восстановить цвета и режимы. Вставлять функцию Readkey во всех необходимых для контроля местах. 2.2 Модуль GRAPH Модуль Graph - это библиотека графических подпрограмм, содержащая более 50 процедур и функций, предоставляющих программисту разнообразные средства управления экраном в графическом режиме. Стандартное состояние компьютера, в момент запуска программы на языке Турбо Паскаль, соответствует работе экрана в текстовом режиме. Любая программа, использующая графические средства, должна инициировать графический режим работы адаптера. Настройка графических средств на работу с конкретным адаптером достигается за счет подключения нужного графического драйвера. Драйвер - это специальная программа, осуществляющая управление каким - либо техническим средством компьютера. Графические драйверы разработаны фирмой Borland практически для всех типов адаптеров. Обычно они располагаются на диске в подкаталоге BGI (который, в свою очередь, входит в каталог с системой Тurbo Pascal - ТР или Borland Pascal - BP) в виде файлов с расширением bgi (Borland Graphics Interface - графический интерфейс фирмы Borland). Для адаптеров EGA, VGA, SVGA будем использовать графический драйвер egavga.bgi. Подробнее о типах адаптеров и соответствующих им драйверах можно ознакомиться в [1].
25
26
2.2.1 Инициализация и закрытие графического режима Инициализация графического режима адаптера производится с помощью процедуры InitGraph(Драйвер, Режим, Путь к драйверу); Драйвер - переменная типа Integer, определяет тип графического драйвера; Режим - переменная того же типа, задающая режим работы графического адаптера; Путь к драйверу - выражение типа String, содержащее путь к файлу драйверу. Для задания двух первых параметров в модуле Graph определены специальные константы, но проще всего использовать для указания типа драйвера константу с именем Detect, что позволяет не указывать режим. Путь к драйверу представляет собой последовательность, состоящую из имени диска и списка имен каталогов и подкаталогов, разделенных символом "\" и заключенную в апострофы, в которых находится файл драйвера. Например, для нашего ВЦ этот путь имеет вид: 'P:\BP\7.0\BGI'. Если скопировать файл egavga.bgi в текущий каталог (из которого вы вошли в среду Турбо Паскаль), то путь к файлу состоит из двух апострофов (''). Анализ правильности открытия графического режима, производится с помощью функции GraphResult. Она возвращает значение типа Integer. Если ошибок нет, то результат равен 0, в противном случае результатом будет отрицательное число, значение которого определяет тип ошибки. Приведем некоторые из них: -1 - не инициирован графический режим; -2 - не определен тип драйвера; -3 - не найден графический драйвер и т. д. (см []). Для определения типа ошибки можно использовать функцию GraphErrorMsg, которая выводит сообщение, соответствующее типу ошибки. Можно написать небольшую подпрограмму, позволяющую производить инициализацию графического режима с анализом типа ошибки. Procedure Init_Graph_Mode; Var Gr_Driver, Gr_Mode, Error_Code: Integer; Begin Gr_driver:= Detect; {Автоопределение драйвера и режима} InitGraph(Gr_Driver, Gr_mode, ''); {Инициализация графического режима - файл с дравером должен располагаться в текущем каталоге} Error_Code:= GraphResult; If Error_Code <> 0 then Begin Writeln(' Сообщение об ошибке:',GraphErrorMsg(Error_Code)); Halt; { Выход из программы} End {Ошибок не обнаружено} End; { Конец процедуры инициализации графического режима} 26
27
Закрытие текстового режима осуществляется с помощью вызова процедуры CloseGraph. Если в программе есть вызов процедуры InitGraph, то должен присутствовать соответствующий вызов процедуры CloseGraph. Эта процедура очищает экран и переводит дисплей в текстовый режим. В одной программе можно несколько раз выполнять инициализацию графического режима и его закрытие. Для очистки экрана в графическом режиме используется процедура ClearDevice. В процессе работы в графическом режиме можно перейти в текстовый режим и затем снова возвратиться в графический режим. Процедура RestoreCRTMode служит для перехода в текстовый режим (без явного закрытия графического режима). Для возврата назад в графический можно режим использовать функцию GetGraphMode, которая возвращает значение типа Integer соответствующее коду режима работы графического драйвера и процедуру SetGraphMode, которая устанавливает новый графический режим. Для возврата в графический режим после вызова процедуры RestoreCRTMode необходимо произвести вызов процедуры: SetGraphMode(GetGraphMode); Следующая простая программа иллюстрирует переход в текстовый режим и возврат в графический. Uses crt,graph; begin Init_Graph_Mode; {Используем процедуру описанную ранее} outtextxy(270,200,'This is graph mode'); readkey; RestoreCRTMode; gotoxy(30,12); writeln('This is text mode'); readkey; SetGraphMode(GetGraphMode); outtextxy(270,200,'Return in graph mode '); readkey; end. 2.2.2 Графический курсор, координаты экрана в графическом режиме Графический курсор или иначе "текущий указатель", в отличие от текстового курсора, невидим на экране. Для определения текущего положения графического курсора используются две функции, возвращающие результат типа integer: GetX - координата курсора по горизонтали, GetY - координата курсора по вертикали. Любая координата на графическом экране задается относительно левого верхнего угла. В свою очередь этот угол имеет координаты (0.0) - это минимальные координаты экрана. Максимальные координаты графического 27
28
экрана определяются с помощью двух функций: GetMaxX - по горизонтали и GetMaxY - по вертикали. Обе функции выдают результат типа Integer. Все координаты в графическом режиме задаются в пикселях и имеют тип Integer. Для перемещения графического курсора используются две процедуры: MoveTo(X,Y) - перемещение в точку с координатами X и Y; MoveRel(dx,dy) - перемещение курсора на dx - пикселей по горизонтали dy - пикселей по вертикали. Кроме того, курсор перемещается также во время выполнения некоторых процедур, например при рисовании линий, выводе текстовой информации. 2.2.3 Управление цветом пера и фона Различные адаптеры поддерживают разное количество цветов, выводимых одновременно на экран в графическом режиме. Но для всех драйверов фирмы Borland (т.е. BGI - драйверов) число цветов ограничено диапазоном от 0 до 15. Нумерация и имена констант, задающих цвета, такие же как в текстовом режиме. Максимальный номер цвета, воспринимаемый данным адаптером в текущем графическом режиме, может быть определен с помощью функции GetMaxColor, тип ее результата Word. На экране в графическом режиме различают цвет фона и цвет пера. Все процедуры, рисующие фигуры, линии, выводящие текст делают это цветом пера (кроме тех случаев, когда в этих процедурах есть явная установка цвета). Цвет пера устанавливается процедурой SetColor(Color), Color переменная типа Word, выбираемая из диапазона от 0 до GetMaxColor (для адаптера VGA от 0 до 15). Цвет фона устанавливается процедурой SetBkColor(Color), Color переменная типа Word, выбираемая из диапазона от 0 до GetMaxColor. При инициализации графики по умолчанию цвет фона равен 0 (черный Black), а цвет пера равен значению GetMaxColor ( для VGA равен 15 - White белый). Установка нового цвета фона немедленно изменяет цвет графического экрана. Это означает, что нельзя создать изображение два участка которого имели бы разный цвет фона. Для определения текущих значений цвета фона и пера используются функции GetBkColor и GetColor, выдающие результат типа Word. Следующая программа демонстрирует назначение цветов фона и пера. Uses graph; Var xmax,ymax:word; sc,scc,sx,sy:string; c,cc:word; {Здесь должна располагаться процедура инициализации графического режима} Procedure Ris; begin xmax:=getmaxx; ymax:=getmaxy; { Определение размеров экрана} 28
29
str(xmax,sx);str(ymax,sy); { Перевод числовых значений в строковые для вывода на экран в графическом режиме} outtextxy(5,5,'Размеры экрана = '+ sx + ' * ' + sy); { вывод сообщения} readkey; rectangle(100,150,350,200); { Рисование прямоугольника} c:=GetBkcolor; { Опрос цвета фона} cc:=GetColor; { Опрос цвета пера} str(c,sc); str(cc,scc); outtextxy(200,100,'Цвет фона = '+sc+' Цвет символов = '+scc); readkey; setbkcolor(7); { Установка нового цвета фона} setcolor(4); {Установка нового цвета пера} rectangle(400,150,550,200); c:=GetBkcolor; cc:=GetColor; str(c,sc); str(cc,scc); outtextxy(200,230,'Цвет фона = '+sc+' Цвет символов = '+scc); readkey; setbkcolor(0); setcolor(14); rectangle(100,250,550,300); c:=GetBkcolor; cc:=GetColor; str(c,sc); str(cc,scc); outtextxy(200,350,'Цвет фона = '+sc+' Цвет символов = '+scc); readkey; end; begin {main program} Init_Graph_Mode; {Используем процедуру инициализации из предыдущего примера} Ris; Closegraph; end. 2.2.4 Рисование точек и линий Для рисования точек используется процедура PutPixel(x, y, C); здесь x, y - координаты точки экрана, а С - её цвет. С - переменная типа Word. Функция GetPixel(x, y) - выдает номер цвета элемента графического изображения в точке с координатами х и y. Для вывода линий можно использовать одну из трех процедур: 1) Вывод отрезка заданного координатами начала и конца: Line(x1,y1,x2,y2); x1, y1, x2, y2 - координаты начала и конца отрезка, переменные типа integer. 2) Рисование линии от текущего указателя до точки с заданными координатами x и y: LineTo(x,y); 29
30
3) Рисование линии от текущей позиции длиной, определяемой заданием смещений по горизонтали и вертикали dx и dy: LineRel(dx,dy); Если координаты концов получаемых отрезков выходят за границы графического экрана (или окна), то часть отрезка обрезается, но текущий указатель переместиться в точку с координатами конца отрезка, даже если его не видно на экране. Для вычерчиваемых линий можно задать стиль (толщину и тип линии). Для задания стиля в модуле Graph определены тип и константы: Type LineSettingsType = Record LineStyle : Word; {Тип линии} Pattern : Word; {Шаблон типа} Thickness : Word; {Толщина линии} End; Const {Для значений поля LineStyle } Solidln = 0 { Сплошная линия} Dottedln = 1;{ Точечная линия} Centerln - 2; { Штрих-пунктирная линия} Dashedln = 3; {Пунктирная линия} UserBitln = 4 {Тип линий, определяемый пользователем - задается параметром Pattern - шаблон} {Для значений поля Thickness} NormWidth = 1; {Линия толщиной в 1 пиксель} ThickWidth = 3; {Линия толщиной в 3 пикселя} По умолчанию используется сплошная линия толщиной в 1 пиксель. Для установки нового стиля линий используется процедура: SetLineStyle(Тип линии, Шаблон, Толщина), где Тип линии выбирается из вышеописанных констант от 0 до 4 (или от Solidln до UserBitln); Шаблон берется равным 0, если параметр Тип линии любой, кроме 4 (UserBitln); Толщина - константа, равная 1 или 3. Например, для рисования толстой сплошной линии необходимо задать: SetLineStyle(0,0,3) или SetLineStyle(Solidln,0,ThickWidth). Пользователь может задать свой тип линии, отличный от типов заданных в модуле Graph. Для этого необходимо разработать свой шаблон и задать тип линии 4 (или UserBitln). Линия представляет собой совокупность отрезков, каждый из которых имеет длину 16 пикселей. Если длина линии не делится на 16 нацело, то последний отрезок обрезается. Можно задать свой шаблон как комбинацию из шестнадцати светящихся или погашенных пикселей. Его представляют как последовательность, состоящую из 0 и 1: 1 - светиться, 0 - погашено. Например, зададим свою пунктирную линию: 1111000011110000 - всего 16 бит или разрядов. Это двоичное представление, но в Турбо Паскале его необходимо перевести в шестнадцатеричную форму (это будет шестнадцатеричное число $F0F0), а затем подставить его вместо параметра, 30
31
задающего шаблон. Для задания тонкой линии по данному шаблону необходимо установить SetLineStyle(4,$F0F0,1) или SetLineStyle(UserBitln,$F0F0,NormWidln) Назначение стиля линий распространяется на действие всех процедур, выводящих на экран отрезки или фигуры, состоящие из отрезков линий. При выводе дуг учитывается только толщина, заданная в стиле линии. Для получения информации о текущем стиле линий используется процедура GetLineSetting(T_Line), где T_line - переменная типа LineSettingsType, запись поля которой задают тип, шаблон и толщину линий. Следующая программа выводит в правой половине экрана множество точек различного цвета, а в левой множество линий различного стиля и цвета. Uses crt,graph; Var xmax,ymax,xc,yc:word; {Здесь должна располагаться процедура инициализации графического режима} Procedure ris; var xc,yc,i,t:word; x1,x2,y1,y2,x,y:integer; begin randomize; { Обеспечение новой случайной последовательности при каждом новом запуске программы на выполнение} xmax:=getmaxx; ymax:=getmaxy; xc:=xmax div 2; yc:=ymax div 2; {Определение координат центра экрана} for i:=1 to 200 do begin x:=random(xc); y:=random(ymax); {Определение случайных координат точек} putpixel(x,y,random(15)); end; for i:=1 to 100 do begin t:=random(3); {Назначение толщины линий} if t=2 then t:=1; setlinestyle(random(3),0,t); {Назначения стиля линий} setcolor(random(getmaxcolor));{Назначение случайного цвета} {Определение координат концов отрезков линий} x1:=xc+random(xc); x2:=xc+random(xc); y1:=random(ymax); y2:=random(ymax); line(x1,y1,x2,y2); {рисование линии } end; readkey; end; begin Init_graph_Mode; Ris; Closegraph; end. 31
32
2.2.5 Рисование окружностей эллипсов и дуг Рисование окружности заданного радиуса R с центром, координаты которого задаются переменными X и Y: Circle(X,Y,R); X, Y - переменные типа Integer, а R - типа Word. Координаты должны выбираться из диапазона: 0 ≤ X ≤ GetMaxX; 0 ≤ Y ≤ GetMaxY. Рисование эллипса: Ellipse(X, Y, A1, A2 RX, RY); X , Y - координаты центра, переменные типа Integer; A1, A2 - начальный и конечный углы эллипса в градусах (от 0 до 360); RX, RY - размеры горизонтальной и вертикальной полуосей эллипса; A1, A2, RX, RY - переменные типа Word. Для изображения полного эллипса А1 = 0, А2=360. Кроме того, для изображения дуг используется процедура: ARC(X, Y, A1, A2, R); Первые четыре параметра как при рисовании эллипса, а R - радиус дуги, переменная типа Word. Процедура GetArcCoords (Coords) позволяет определить координаты центра, начала и конца дуги. Здесь Coords - переменная типа ArcCoordsType, в которой после обращения к данной процедуре содержатся эти координаты. Тип ArcCoordsType определен в модуле Graph: Type ArcCoordType = record X, Y : integer; { Координаты центра} Xstart, Ystart : integer; { Координаты начала дуги} Xend, Yend : integer; { Координаты конца дуги} End; Совместное использование последних процедур позволяют вычерчивать сопряжение прямых с помощью дуг. 2.2.6 Рисование прямоугольников, многоугольников и ломаных линий Для рисования прямоугольников используется процедура Rectangle(X1, Y1, X2, Y2); X1, Y1, X2, Y2 - координаты верхнего левого и нижнего правого углов прямоугольника, переменные типа Integer. Для рисования многоугольников с числом вершин не равным четырем, используется процедура DrawPoly(K, KoorXY); Если необходимо нарисовать многоугольник на N вершин или замкнутую ломаную линию, то необходимо задать параметр К = N+1 и задать координаты 32
33
(N+1) точек, причем координаты последней точки должны совпадать с координатами первой точки. При рисовании произвольной ломаной незамкнутой линии, задается N точек и столько же пар координат. KoorXY имеет предопределенный в модуле Graph тип PointType: Type PointType = Record X, Y: Integer; { координаты точки} End; Обычно набор точек реализуется как массив из записей PointType. Этот массив должен быть заполнен данными до его использования в процедуре рисования фигуры. Например, для рисования пятиугольника можно задать массив на 6 точек (записей) в виде типизированной константы: Type T_Mas = Array [1..6] of PointType; Const Mas_Koord : T_Mas = ((x=50;y=50),(x=200;y=50),(x=400;y=200), (x=250;y=350),(x=150;y=200),(x=50;y=50)); Begin {Инициализация графического режима} DrawPoly (6, Mas_Koord); ... End. Следующая программа демонстрирует процесс рисования различных фигур. Uses graph; Procedure Init_Graph_Mode; См. предыдущие программы procedure kontur; var dx,dy,dr:integer; color,i:word; begin color:=6; setcolor(color); dx:=0; dy:=0; { Рисование прямоугольников} for i:=1 to 5 do begin color:=color-1; dx:=dx+15; dy:=dy+10; rectangle(100-dx,100-dy,150+dx,160+dy); setcolor(color); end; readkey; { Рисование окружностей} color:=6; setcolor(color); dr:=0; 33
34
for i:=1 to 5 do begin color:=color-1; dr:=dr+10; circle(450,130,30+dr); setcolor(color); end; readkey; { Рисование эллипсов} color:=15; setcolor(color); dx:=0; dy:=0; for i:=1 to 5 do begin color:=color-1; dx:=dx+15; dy:=dy+10; ellipse(120,330,0,360,30+dx,20+dy); setcolor(color); end; readkey; { Рисование дуг} color:=15; setcolor(color); dr:=0; for i:=1 to 5 do begin color:=color-1; dr:=dr+15; arc(420,350,0,120,20+dr); setcolor(color); end; readkey; end; begin {Основная программа} Init_Graph_Mode; kontur; closegraph; end. Лабораторная работа № 3.3 (17) Разработка программ с использованием процедур и функций модуля Graph (часть 1) Цель работы: 1. Изучение процедур и функций модуля Graph. 2. Разработка программ с использованием модуля Graph. 34
35
Варианты заданий Вариант 1 1.Инициализацию графического режима организовать в виде отдельной процедуры с анализом GraphResult. 2. Определить размеры и центр экрана в графическом режиме. 3. Переместить курсор в точку с координатами (180,180) с помощью процедуры MoveTo и затем в точку (310,180) процедурой MoveRel. 4. Нарисовать в нижней, левой четверти экрана 150 точек, выбирая координаты и цвета случайным образом. 5. Очистить экран. 6. Нарисовать на экране множество линий разного стиля и цвета, используя все возможные процедуры. 7. Определить положение графического курсора. 8. Перейти в текстовый режим и вывести на экран координаты графического курсора и размеры экрана. Вернуться в графический режим. 9. Разделить экран на четыре равные части. 10. В верхней, левой четверти нарисовать три окружности, имеющие общий центр и радиусы 24, 28, 32. Линии окружностей должны быть разного цвета. 11. В правой верхней и левой нижней четвертях аналогично п.10 нарисовать эллипсы и дуги (радиусы и углы выбрать самостоятельно). 12. В оставшейся четверти нарисовать 5 прямоугольников, имеющих линии контура различных стилей и толщины, причем для самого внешнего контура шаблон разработать самостоятельно. 13. Очистить экран. 14. Нарисовать несколько многоугольников, линии контуров которых должны иметь различный цвет. 15. Закрыть графический режим. Примечание: перед выводом каждого нового изображения останавливать процесс решения для просмотра. Вариант 2 1. Инициализацию графического режима организовать в виде отдельной процедуры с анализом GraphResult. 2. Определить размеры и центр экрана в графическом режиме. 3. Переместить курсор в точку с координатами (50,150) с помощью процедуры MoveTo и затем в точку (350,200) процедурой MoveRel. 4. Нарисовать в верхней левой четверти экрана 200 точек, выбирая координаты и цвета случайным образом. 5. Очистить экран. 6. Нарисовать на экране множество линий разного стиля и цвета, используя все возможные процедуры рисования линий. 7. Определить положение графического курсора. 8. Перейти в текстовый режим и вывести на экран координаты графического курсора и размеры экрана. Вернуться в графический режим. 35
36
9. Разделить экран на четыре части: провести диагонали через центр экрана. 10. В верхней четверти нарисовать три окружности, имеющие общий центр и радиусы 25, 30, 35. Линии окружностей должны быть разного цвета. 11. В левой и нижней четверти, аналогично п.10, нарисовать эллипсы и дуги (радиусы и углы выбрать самостоятельно). 12. В оставшейся четверти нарисовать 5 прямоугольников, имеющих линии контура различных стилей и толщины, причем для самого внешнего контура шаблон разработать самостоятельно. 13. Очистить экран. 14. Нарисовать 5 треугольников, линии контуров которых должны иметь различный цвет. 15. Закрыть графический режим. Примечание: перед выводом каждого нового изображения останавливать процесс решения для просмотра. Вариант 3 1.Инициализацию графического режима организовать в виде отдельной процедуры с анализом GraphResult. 2. Определить размеры и центр экрана в графическом режиме. 3. Переместить курсор в точку с координатами (80,180) с помощью процедуры MoveTo и затем в точку (210,180) процедурой MoveRel. 4. Нарисовать в нижней, правой четверти экрана 100 точек, выбирая координаты и цвета случайным образом. 5. Очистить экран. 6. Нарисовать на экране множество линий разного стиля и цвета, используя все возможные процедуры. 7. Определить положение графического курсора. 8. Перейти в текстовый режим и вывести на экран координаты графического курсора и размеры экрана. Вернуться в графический режим. 9. Разделить экран на четыре равные части. 10. В верхней, левой четверти нарисовать три окружности, имеющие общий центр и радиусы 14, 26, 36. Линии окружностей должны быть разного цвета. 11. В правой верхней и левой нижней четвертях аналогично п.10 нарисовать эллипсы и дуги (радиусы и углы выбрать самостоятельно). 12. В оставшейся четверти нарисовать 5 прямоугольников, имеющих линии контура различных стилей и толщины, причем для самого внешнего контура шаблон разработать самостоятельно. 13. Очистить экран. 14. Нарисовать 3 пятиугольника, линии контуров которых должны иметь различный цвет. 15. Закрыть графический режим. Примечание: перед выводом каждого нового изображения останавливать процесс решения для просмотра. Вариант 4 36
37
1. Инициализацию графического режима организовать в виде отдельной процедуры с анализом GraphResult. 2. Определить размеры и центр экрана в графическом режиме. 3. Переместить курсор в точку с координатами (500,150) с помощью процедуры MoveTo и затем в точку (500,200) процедурой MoveRel. 4. Нарисовать в верхней левой четверти экрана 200 точек, выбирая координаты и цвета случайным образом. 5. Очистить экран. 6. Нарисовать на экране множество линий разного стиля и цвета, используя все возможные процедуры рисования линий. 7. Определить положение графического курсора. 8. Перейти в текстовый режим и вывести на экран координаты графического курсора и размеры экрана. Вернуться в графический режим. 9. Разделить экран на четыре части: провести диагонали через центр экрана. 10. В верхней четверти нарисовать три окружности, имеющие общий центр и радиусы 26, 32, 38. Линии окружностей должны быть разного цвета. 11. В левой и нижней четверти, аналогично п.10, нарисовать эллипсы и дуги (радиусы и углы выбрать самостоятельно). 12. В оставшейся четверти нарисовать 5 прямоугольников, имеющих линии контура различных стилей и толщины, причем для самого внешнего контура шаблон разработать самостоятельно. 13. Очистить экран. 14. Нарисовать два шестиугольника, линии контуров которых должны иметь различный цвет. 15. Закрыть графический режим. Примечание: перед выводом каждого нового изображения останавливать процесс решения для просмотра. Вариант 5 1.Инициализацию графического режима организовать в виде отдельной процедуры с анализом GraphResult. 2. Определить размеры и центр экрана в графическом режиме. 3. Переместить курсор в точку с координатами (380,380) с помощью процедуры MoveTo и затем в точку (310,380) процедурой MoveRel. 4. Нарисовать в нижней, левой четверти экрана 120 точек, выбирая координаты и цвета случайным образом. 5. Очистить экран. 6. Нарисовать на экране множество линий разного стиля и цвета, используя все возможные процедуры. 7. Определить положение графического курсора. 8. Перейти в текстовый режим и вывести на экран координаты графического курсора и размеры экрана. Вернуться в графический режим. 9. Разделить экран на четыре равные части. 10. В верхней, левой четверти нарисовать три окружности, имеющие общий центр и радиусы 34, 38, 42. Линии окружностей должны быть разного цвета. 37
38
11. В правой верхней и левой нижней четвертях аналогично п.10 нарисовать эллипсы и дуги (радиусы и углы выбрать самостоятельно). 12. В оставшейся четверти нарисовать 5 прямоугольников, имеющих линии контура различных стилей и толщины, причем для самого внешнего контура шаблон разработать самостоятельно. 13. Очистить экран. 14. Нарисовать треугольник и шестиугольник, линии контуров которых должны иметь различный цвет. 15. Закрыть графический режим. Примечание: перед выводом каждого нового изображения останавливать процесс решения для просмотра. Вариант 6 1. Инициализацию графического режима организовать в виде отдельной процедуры с анализом GraphResult. 2. Определить размеры и центр экрана в графическом режиме. 3. Переместить курсор в точку с координатами (450,50) с помощью процедуры MoveTo и затем в точку (450,200) процедурой MoveRel. 4. Нарисовать в верхней, левой четверти экрана 160 точек, выбирая координаты и цвета случайным образом. 5. Очистить экран. 6. Нарисовать на экране множество линий разного стиля и цвета, используя все возможные процедуры рисования линий. 7. Определить положение графического курсора. 8. Перейти в текстовый режим и вывести на экран координаты графического курсора и размеры экрана. Вернуться в графический режим. 9. Разделить экран на четыре части: провести диагонали через центр экрана. 10. В верхней четверти нарисовать три окружности, имеющие общий центр и радиусы 35, 40, 45. Линии окружностей должны быть разного цвета. 11. В левой и нижней четверти, аналогично п.10, нарисовать эллипсы и дуги (радиусы и углы выбрать самостоятельно). 12. В оставшейся четверти нарисовать 5 прямоугольников, имеющих линии контура различных стилей и толщины, причем для самого внешнего контура шаблон разработать самостоятельно. 13. Очистить экран. 14. Нарисовать пяти и шестиугольник, линии контуров которых должны иметь различный цвет. 15. Закрыть графический режим. Примечание: перед выводом каждого нового изображения останавливать процесс решения для просмотра. В модуле Graph предусмотрены процедуры рисования залитых фигур.
38
39
2.2.7 Задание типа заливки Под заливкой понимается заполнение площади, нарисованной фигуры некоторым рисунком и цветом. Для задания типа (шаблона) заливки используется процедура: SetFillStyle (Pattern, Color); Pattern - тип заливки, Color - цвет заливки (от 0 до 15), переменные типа Word. Значения переменной Pattern выбираются из констант, определенных в модуле Graph: Const EmptyFill = 0 { Сплошная заливка цветом фона} SolidFill = 1 { Сплошная заливка текущим (Color) цветом} LineFill = 2 { Заливка типа = = = } LtSlashFill = 3 { Заливка типа ///} SlashFill = 4 { Заливка жирными линиями типа ///} BkSlashFill = 5 { Заливка жирными линиями типа \\\} LtBkSlashFill = 6 { Заливка типа \\\} HatchFill = 7 { Заливка редкой штриховкой } XhatchFill = 8 { Заливка частой штриховкой } InterleaveFill = 9 {Заливка прерывистой линией} WideDotFill = 10 {Заливка редкими точками} CloseDotFill = 11 { Заливка частыми точками} UserFill = 12 { Заливка, определенная программистом} Если вы хотите определить свой тип (новый, отличный от 1-11 типов), то необходимо воспользоваться сначала процедурой SetFillPattern(Matr,Color), где Matr - переменная типа FillPatternType, определенного в модуле Graph: Type FillPatternType = array[1..8] of byte; Таким образом, Matr - это массив, его необходимо заполнить до использования, шестнадцатеричными значениями. Рассмотрим пример формирования нового типа (шаблона) заливки и соответствующего массива Matr. По аналогии с формированием шаблона для типа линии, каждый элемент массива представляет собой значение типа byte, каждый из восьми разрядов (бит) которого 0 или 1. Всего элементов 8. То есть мы имеем дело с матрицей 8 х 8. Заполним матрицу 0 и 1 аналогично клеткам шахматной доски и вместо черных клеток поставим 1, а белых - 0. Тогда матрица для нашего шаблона будет иметь вид: 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 39
40
Каждое двоичное число, записанное в одной строке матрицы, переведем в шестнадцатеричное представление, а затем заполним этими значениями массив Matr. 1 строка - 10101010 = $AA; 2 строка - 01010101 = $55. Все нечетные строки совпадают с первой, а четные со второй. Далее задаем: Const Matr: FillPatternType =($AA,$55, $AA,$55, $AA,$55, $AA,$55); Представленный шаблон программисты называют заливка 50%. Для определения текущего шаблона заливки используется процедура: GetFillSetting(FillType). Переменная FillType имеет тип FillSettingType, определенный в модуле Graph. Type FillSettingType = Record Pattern:word; { тип заливки или шаблон} Color : word; { текущий цвет} End; 2.2.8 Рисование залитых фигур После задания типа заливки можно рисовать залитые фигуры. FillEllipse (X, Y, Xrad, Yrad) - залитый эллипс. X, Y - координаты центра; Xrad, Yrad - радиусы полуосей. FillPoly(K, KoordXY) - рисование залитого замкнутого многоугольника. Параметры те же, что в процедуре DrawPoly; FloodFill(X, Y. CG) - заполнение любой замкнутой фигуры которой принадлежит точка с координатами (X, Y) и контур которой нарисован цветом CG. Заполнение производится в соответствии с установленным ранее типом заливки. Pieslice(X, Y, A1, A2, Rad) - рисование залитого кругового сектора с центром (X, Y), радиуса Rad. A1, A2 - начальный и конечный углы сектора. Sector(X, Y, A1, A2, Xrad, Yrad) - рисование залитого эллиптического сектора с центром (X, Y), радиусами полуосей Xrad, Yrad. A1, A2 - начальный и конечный углы сектора. Bar (X1, Y1, X2, Y2) - залитый прямоугольник. X1, Y1, X2, Y2 координаты верхнего левого и правого нижнего углов прямоугольника. Bar3D (X1, Y1, X2, Y2, D, Top) - рисует параллелепипед, лицевая сторона которого заливается по текущему шаблону; D - глубина параллелепипеда. Параметр Top задает режим отображения верхней плоскости параллелепипеда (True - отображать, False - не отображать). В модуле Graph определены две константы для задания параметра Top: Const TopOn = True; TopOff = False. 40
41
Далее приведен текст программы рисования залитых фигур. Использованы все стандартные типы заливки от 1 до 11. Uses crt,graph; Procedure Init_Graph_Mode; Procedure figure; begin Setfillstyle(1,3); bar(50,50,250,100); Setfillstyle(2,3); bar(50,150,250,200); readkey; setcolor(14); circle(350,130,50); Setfillstyle(3,4); floodfill(350,130,14); setcolor(4); circle(450,130,50); Setfillstyle(4,14); floodfill(450,130,4); setcolor(1); circle(550,130,50); Setfillstyle(5,15); floodfill(550,130,1); readkey; Setfillstyle(6,2); fillellipse(120,330,70,60); Setfillstyle(7,12); fillellipse(280,330,70,60); readkey; Setfillstyle(8,9); pieslice(420,350,0,120,60); Setfillstyle(9,11); Sector(520,350,0,120,60,70); readkey; cleardevice; setcolor(15); Setfillstyle(10,13); Bar3D(120,120,200,400,30,TopOn); Setfillstyle(11,10); Bar3D(320,120,400,400,30,TopOff); readkey; end; begin Init_Graph_Mode; figure; closegraph; end. При выводе графических изображений, кроме заливки (заполнения) используют понятие палитра. 2.2.9 Управление палитрой Максимальный набор цветов, одновременно поддерживаемых драйвером BGI называется палитрой. Для дисплея VGA максимальный набор цветов равен 16 (от 0 до 15). Это программные цвета. Первоначальное размещение цветов в палитрах EGA/VGA соответствует последовательности их описания константами от Black (0) до White (15). Каждому программному цвету присваивается "аппаратный" цвет. В адаптере VGA аппаратная палитра содержит 256 цветов. 41
42
Для управления соответствием между программными и аппаратными цветами в модуле Graph предусмотрено несколько процедур, функций, типов и констант. Для описания палитры используется константа и тип: Const MaxColors = 15; {Максимальный программный номер цвета} Type Palettetype = Record Size : byte; {Количество цветов в палитре} Colors : Array [0..MaxColors] of ShortInt; {Массив номеров цветов} End; Для определения палитры, которая устанавливается по умолчанию (сразу после инициализации графического режима) используется процедура: GetDefaultPalette ( Palette); Palette - переменная типа Palettetype. В ней содержится информация о количестве и последовательности цветов начальной палитры. Для определения текущей палитры используется процедура: GetPalette ( Palette); Функция GetPaletteSize возвращает значение типа Word, показывающее число цветов, входящих в текущую программную палитру. Следующий фрагмент программы позволяет вывести информацию о текущей палитре. Uses grt,graph; Var s:string[4]; Palette:Palettetype; K, color:word; begin {Инициализация графического режима} ... GetPalette(Palette); {Определение текущей палитры} Str(Palette.size,s); outtextxy(130,220,'В палитре ' + s + ' цветов'); outtextxy(130,240,' Вот эти цвета'); For k := 0 to Palette.size - 1 do {Вывод номеров цветов в палитре} begin str(Palette.Colors[k],s); { Задание цвета пера по номеру цвета из текущей палитры } setcolor(Palette.Colors[k]); outtextxy(30+k*25,260, s ); end; for Color := 0 to Palette.Size-1 do begin SetColor(palette.colors[Color]); {Вывод последовательности прямых линий различными цветами текущей палитры } 42
43
Line(30, Color * 12, 430, color * 12); end; readkey; Можно заменить один (любой) цвет в палитре на новый цвет с помощью процедуры: SetPalette(N, Color); N - номер цвета в палитре, переменная типа Word (от 0 до 15); Color - номер вновь устанавливаемого цвета, переменная типа ShortInt, т.е. она не может быть больше 127. Для замены нескольких цветов в текущей палитре можно использовать процедуру SetAllPalette(Palette), где параметр Palette можно описать следующим образом: Var Palette: Array[0..MaxColors] of ShortInt; По нулевому адресу в этот массив должно быть записано значение, равное количеству цветов в вновь устанавливаемой палитре. Остальные элементы массива - это вновь устанавливаемые цвета. Кроме того, можно вместо номера цвета заносить -1, что будет означать, что цвет, записанный на данном месте, не меняется. Uses graph; Var Mpalette:array[0..maxcolors]of shortint; s:string[4]; Palette:Palettetype; K, color, Nmax : word; begin { Инициализация графического режима} ... GetPalette(Palette); for Color := 0 to Palette.Size-1 do begin SetColor(palette.colors[Color]); Line(30, Color * 12, 430, color * 12); end; readkey; cleardevice; {Действие процедуры SetAllPalette} Nmax:=GetPaletteSize; Mpalette[0]:=Nmax; for k:=1 to Nmax do Mpalette[k]:=random(127); SetAllPalette(Mpalette); for Color := 0 to Palette.Size-1 do begin SetColor(palette.colors[Color]); Line(30, Color * 12, 430, color * 12); end; readkey; closegraph; end. Процедура SetRGBPalette(Color, RedVal, GreenVal, BlueVal) позволяет установить цветовую гамму, но только при работе с дисплеем IBM 8514 и адаптером VGA, использующим видеопамять объемом 256 Кбайт. 43
44
Здесь Color - переменная, задающая номер цвета (для адаптера VGA от 0 до 15); RedVal, GreenVal, BlueVal - выражения типа Integer, устанавливающие интенсивность соответственно красной, зеленой и синей составляющих цвета (в диапазоне от 0 до 256). Программа, демонстрирующая действие процедуры SetRGBPalette выводит на экран два залитых прямоугольник (синего и белого цвета), а затем, после нажатия любой клавиши, синий прямоугольник меняет окраску. Uses crt,graph; var grDriver,i: Integer; { Здесь должна быть процедура инициализация графического режима} begin Init_Graph_Mode; if grDriver in [IBM8514, VGA] then begin setfillstyle(1,1); {Установка сплошной заливки цветом 1 - синим} bar(100,100,200,400);{Рисование залитого синим, прямоугольника} setfillstyle(1,2); {Установка сплошной заливки цветом 2 - зеленым} bar(300,100,400,400);{Рисование залитого зеленым, прямоугольника} readkey; for i:=1 to 100 do begin {Выбор интенсивности составляющих -действует на синии фигуры} SetRGBPalette(1,Random(255),Random(255),Random(255)); end; closegraph; end else begin outtextxy(300,20,'Адаптер не тот'); readkey; end; end. 2.2.10 Вывод текста в графическом режиме В графическом режиме стандартными средствами вывести на экран можно только строковые константы или переменные. Поэтому при выводе числовых значений необходимо преобразовать их в строковое с помощью процедуры преобразования типов STR(chislo, stroka). Для вывода текстовых изображений (строк) можно использовать одну из двух процедур модуля Graph: OutText(Строка) или OutTextXY(X, Y, Строка); Первая из этих процедур выводит текстовую строку, начиная от текущего положения графического курсора, а вторая - с позиции, определяемой координатами (X, Y). 44
45
Текстовая информация, в графическом режиме, может быть выведена различными шрифтами, в горизонтальном и вертикальном направлении. Кроме того, можно задавать размер выводимых символов. Однако в стандартных шрифтах, разработанных фирмой Borland, отсутствуют шрифты для вывода кириллицы, что исключает вывод русскоязычных сообщений всеми шрифтами, точечного (шрифта по умолчанию, имеющего номер 0). Для вывода кириллицы другими шрифтами необходимо иметь дисковые файлы с русскоязычными шрифтами. Для задания стиля текстового вывода (шрифта, направления и размера) используется процедура: SetTextStyle (Font, Direct. Size); Font - код (номер) шрифта; Direct - направление ; Size - код размера. Для указания кода шрифта используются константы (от 0 до 10), причем первые пять имеют также мнемоническое изображение. Const DefaultFont = 0; { Точечный или матричный шрифт 8 х 8} TriplexFont = 1; { Утроенный, полужирный шрифт- триплекс } SmallFont = 2; { Уменьшенный шрифт - тонкое начертание} SansSerifFont = 3: { Прямой шрифт - книжная гарнитура} GothicFont = 4; { Готический шрифт} 5 - { Рукописный шрифт} 6 - { Одноштриховой шрифт, типа Courier} 7 - { Наклонный шрифт, типа Times Italic} 8 - { Шрифт типа Times Roman} 9 - { Шрифт увеличенного размера типа Courier} 10 - { Крупный двухштриховой шрифт} Все шрифты, кроме 0 (стандартного) - штриховые или векторные, их достоинство - простота масштабирования. Каждый из шрифтов, кроме 0, помещается в отдельном дисковом файле. Если вы хотите их использовать, то эти файлы необходимо скопировать в текущий каталог из подкаталога BGI, находящегося в каталоге с системой ТР. Имена файлов со шрифтами: 1 - trip.chr; 2 - litt.chr; 3 - sans.chr; 4 - goth.chr; 5 - scri.shr; 6 - simp.chr; 7 - tscr.chr; 8 - lcom.chr; 9 - euro.chr; 10 - bold.chr. Шрифт DefaultFont создается графическим драйвером в момент инициализации графического режима на основе анализа текстового шрифта. Поэтому, если ваш компьютер способен выводить кириллицу в текстовом режиме, то это будет возможно и графике. Выводимый текст может размещаться на экране в горизонтальной или вертикальной ориентации. Ориентация задается одной из двух констант: Const HorizDir = 0; { Горизонтальное направление - слева направо} VertDir = 1; { Вертикальное направление - снизу вверх} Размер шрифта задается величиной Size: 45
46
Size = от 1 до 32 для стандартного (0) шрифта и от 1 до 32 - для всех остальных. Если значение Size превышает максимально возможное, то Size устанавливается равным максимуму. Следующая программа демонстрирует вывод текста всеми шрифтами со сменой величины size от 1 до 5. Uses crt,graph; var s,ss:string; i,j,size:word; { Сюда поместить процедуру инициализации графического режима} begin Init_graph_Mode; { Вывод текста в горизонтальном направлении} size:=0; for j:=1 to 5 do begin size:=size+1; { Смена размера шрифта} str(size,ss); For i:=0 to 10 do Begin str(i,s); settextstyle(i,0,size); { Установка стиля шрифта} outtextxy(10,10+i*35,'This is Font:' + s +' size='+ss ); end; readkey; cleardevice; end; { Вывод текста в вертикальном направлении} size:=0; for j:=1 to 5 do begin size:=size+1; str(size,ss); For i:=0 to 10 do begin str(i,s); settextstyle(i,1,size); outtextxy(10+i*45,10,'This is Font:' + s + 'size='+ss ); end; readkey; cleardevice; end; closegraph; end. Кроме описанных основных процедур для вывода текста разработаны еще несколько вспомогательных процедур и функций. Желающие могут ознакомиться с ними в [1, 2]. 2.2.11 Окна и страницы в графическом режиме В графическом режиме, подобно текстовому, на экране можно открывать (устанавливать) прямоугольные окна. Для этого используется процедура SetViewPort(X1, Y1, X2, Y2, Clip); X1, Y1, X2, Y2 - координаты верхнего левого и правого нижнего углов; переменная Clip может принимать одно из двух значений: ClipOn = True или 46
47
ClipOff = False. В первом случае, содержимое экрана за пределами созданного окна отсекается (т.е. становится невидимым), а во втором - не отсекается. Для очистки созданного графического окна используется процедура ClearViewPort. Для определения координат текущего графического окна используется процедура GetViewSettings(ViewInfo), где ViewInfo - переменная типа ViewPortType, описанного в модуле Graph: Type ViewPortType = Record X1, Y1, X2, Y2 : Integer; Clip : Boolean; End; Некоторые адаптеры, в том числе VGA, EGA, поддерживают многостраничную работу. Нумерация страниц начинается с нулевой. Вывод производится на так называемую активную страницу. Процедура SetActivePage(Num) делает активной страницу с номером, задаваемым переменной типа word - Num. Если при инициализации вы используете автоопределение графического драйвера (detect), то устанавливается режим работы с максимально возможным номером. Для обеспечения работы с двумя страницами нужно уменьшить номер режима, воспользовавшись процедурой SetGraphMode(Gr_Mode-1). Gr_Mode - переменная, задающая режим в вызове процедуры InitGraph. Для просмотра какой-либо страницы необходимо сделать ее активной с помощью процедуры SetVisualPage(Num). Num - номер активной страницы. Пример работы с двумя страницами иллюстрирует следующая программа. В ней на страницу с номером 0 выводится залитый прямоугольник и сообщение о том, что это нулевая страница, а на первую страницу выводится залитый эллипс. Uses CRT, Graph; Var Gr_Driver, Gr_Mode : Integer; Xc, Yc :integer; Begin Gr_driver:=Detect; InitGraph(Gr_Driver, Gr_Mode, ''); SetGraphMode(Gr_Mode-1); {Уменьшение номера режима для обеспечения возможности доступа к нулевой странице} SetFillStyle(1,14); {Установка стиля заливки} Xc:= GetMaxX div 2; Yc:= GetMaxY div 2; {Координаты центра экрана} {Вывод на 0 страницу} Bar(Xc-200, Yc-90, Xc+200, Yc+90); Setcolor(1); OuttextXY(Xc-50,Yc,' Page 0 - Press enter'); SetActivePage(1); {Активизация страницы 1} {Вывод на 1 страницу} SetFillStyle(1,7); {Установка стиля заливки} FillEllipse(Xc, Yc, 200,100); OuttextXY(Xc-50,Yc,' Page 1 - Press enter'); 47
48
{Просмотр страниц} Readln; SetVisualPage(1); Readln; SetVisualPage(0); Readln; CloseGraph; End. 2.2.12 Сохранение и выдача изображений. Создание движущихся изображений Для того, чтобы заставить изображения перемещаться по экрану, необходимо: 1. Определить размер памяти для хранения этого изображения c помощью функции ImageSize(X1, Y1, X2, Y2), возвращающей результат типа Word. X1, Y1, X2, Y2 - координаты верхнего левого и нижнего правого углов прямоугольника, охватывающего это изображение. Например: Size:= ImageSize(x1,y1,x2,y2); 2. Определить адрес участка динамической памяти, где будет сохранено это прямоугольное изображение размером Size, с помощью процедуры GetMem(P,Size). P - переменная типа Pointer, содержащая определенный адрес. 3. Сохранить копию этого фрагмента в динамической памяти с помощью процедуры GetImage(X1, Y1, X2, Y2, P^). 4. Вывести сохраненное изображение на экран в заданном месте с помощью процедуры PutImage(Х, Y, P^, M). X, Y - координаты левого верхнего угла того места на экране, в которое необходимо поместить копию изображения. Копия изображения должна полностью помещаться на экране, иначе она не будет выведена и экран останется без изменений. М - способ копирования, определяющий способ взаимодействия вновь размещаемой копии с уже имеющимся на экране изображением. Переменная М может принимать значения следующих констант: Const NormalPut = 0; {Замена существующего изображения на копию} XorPut = 1; {Исключающее ИЛИ} OrPut = 2; {Объединительное ИЛИ} AndPut = 3; {Логическое И} NotPut = 4; {Инверсия изображения} Чаще всего для создания движущихся изображений на экране используют значения M, равные 0, 1 и 4. Следующая программа демонстрирует пример создания движущихся изображений. Uses crt,graph; Var Size,i:word; p:pointer; procedure init_graph; var grDriver: Integer; grMode: Integer; ErrCode:Integer; begin grDriver := Detect; 48
49
InitGraph(grDriver, grMode,''); ErrCode := GraphResult; if ErrCode <> grOk then Writeln('Ошибка инициализации графического режима:' , GraphErrorMsg(ErrCode)); end; begin init_graph; {Рисуем колобка} setbkcolor(7); setcolor(4); setfillstyle(1,15); circle(100,100,50); floodfill(101,101,4); setfillstyle(1,1); circle(80,80,10); circle(120,80,10); floodfill(80,80,4); floodfill(120,80,4); fillellipse(100,100,5,10); fillellipse(70,150,30,10); fillellipse(130,150,30,10); setfillstyle(1,12); fillellipse(100,130,20,10); {Определяем объем памяти, необходимый для хранения изображения} size:=ImageSize(35,45,165,165); GetMem(p,size); {Определение адреса начала участка в динамической области памяти, где будет храниться изображение} GetImage(35,45,165,165,p^); { Размещение копии изображения в динамической памяти } readkey; {Вывод движущегося изображения} for i:=0 to 225 do PutImage(35+i,45+i,p^,0); readkey; {Вывод движущегося изображения в 5 раз быстрее} for i:=1 to 45 do PutImage(35+i*5,45+i*5,p^,0); readkey; Closegraph; end. Лабораторная работа № 3.4 (18) Разработка программ с использованием процедур и функций модуля Graph (часть 2) Цель работы: 1. Изучение процедур и функций модуля Graph. 2. Разработка программ с использованием модуля Graph. Варианты заданий Вариант 1 1. Построить залитый прямоугольник с координатами х1 = 20, y1 = 20, 49
50
x2 = maxx-20, y2 = maxy-20, maxx, maxy - размеры экрана (тип заливки - 5, цвет красный). 2. Построить три одинаковых по высоте и различных по ширине и глубине параллелепипеда, c различными типами заливки и различным цветом. 3. На каждой из построенных фигур указать площадь, предварительно их вычислив. 4. Изменить цвет красный в палитре на цвет синий, используя процедуру SetPalette. 5. Определить и вывести в центр экрана сообщение о количестве цветов в палитре. Очистить экран. 6. Нарисовать залитые сектор, многоугольник, круг, подписать их названия, используя шрифты различного размера. 7. Очистить экран. 8. Разделить экран на две части, для чего провести диагональ из левого верхнего угла. 9. В верхней половине вывести текст "How do you do" различными шрифтами и разных размеров (начиная с самого большого) в горизонтальном направлении, а в нижней - в вертикальном. 10. Очистить экран. 11. Нарисовать изображение, движущееся из левого, верхнего угла экрана вертикально вниз.
Вариант 2 1. Построить залитый прямоугольник с координатами х1=25, y1=25, x2=maxx-25, y2=maxy-25, где maxx, maxy - размеры экрана (тип заливки 4, цвет - желтый). 2. Построить три одинаковых по высоте и различных по ширине и глубине параллелепипеда, закрашенных различными типами заливки и различным цветом. 3. На каждой из построенных фигур указать площадь, предварительно их вычислив. 4. Изменить цвет yеlloy в палитре на цвет blue, используя процедуру SetPalette. 50
51
5. Определить и вывести в центр экрана сообщение о количестве цветов в палитре. Очистить экран. 6. Нарисовать залитые сектор, многоугольник, круг, подписать их названия, используя шрифты различного размера. 7. Очистить экран. 8. Разделить экран на две части, для чего провести диагональ из правого верхнего угла. 9. В верхней половине вывести текст "Good bye" различными шрифтами и разных размеров (начиная с самого большого) в горизонтальном направлении, а нижней - в вертикальном. 10. Очистить экран. 11. Нарисовать изображение, движущееся из центра экрана в левый, верхний угол
Вариант 3 1. Построить залитый прямоугольник с координатами х1 = 40, y1 = 20, x2 = maxx-40, y2 = maxy-20, maxx, maxy - размеры экрана (тип заливки - 2, цвет зеленый). 2. Построить три одинаковых по высоте и различных по ширине и глубине параллелепипеда, c различными типами заливки и различным цветом. 3. На каждой из построенных фигур указать площадь, предварительно их вычислив. 4. Изменить цвет зеленый в палитре на цвет красный, используя процедуру SetPalette. 5. Определить и вывести в центр экрана сообщение о количестве цветов в палитре. Очистить экран. 6. Нарисовать залитые сектор, многоугольник, круг, подписать их названия, используя шрифты различного размера. 7. Очистить экран. 8. Разделить экран на две части, для чего провести диагональ из левого верхнего угла. 9. В верхней половине вывести текст "My name is Lena" различными шрифтами и разных размеров (начиная с самого большого) в горизонтальном направлении, а в нижней - в вертикальном. 51
52
10. Очистить экран. 11. Нарисовать изображение, движущееся из правого, верхнего угла экрана вертикально вниз
Вариант 4 1. Построить залитый прямоугольник с координатами х1 = 25, y1 = 10, x2 = maxx-25, y2 = maxy-10, maxx, maxy - размеры экрана (тип заливки - 3, цвет ярко-красный). 2. Построить три одинаковых по высоте и различных по ширине и глубине параллелепипеда, c различными типами заливки и различным цветом. 3. На каждой из построенных фигур указать площадь, предварительно их вычислив. 4. Изменить цвет ярко-красный в палитре на цвет голубой, используя процедуру SetPalette. 5. Определить и вывести в центр экрана сообщение о количестве цветов в палитре. Очистить экран. 6. Нарисовать залитые сектор, многоугольник, круг, подписать их названия, используя шрифты различного размера. 7. Очистить экран. 8. Разделить экран на две части, для чего провести диагональ из правого верхнего угла. 9. В верхней половине вывести текст "What is your name?" различными шрифтами и разных размеров (начиная с самого большого) в горизонтальном направлении, а в нижней - в вертикальном. 10. Очистить экран. 11. Нарисовать изображение, движущееся из левого, нижнего угла экрана вертикально вверх.
52
53
Вариант 5 1. Построить залитый прямоугольник с координатами х1 = 20, y1 = 20, x2 = maxx-20, y2 = maxy-20, maxx, maxy - размеры экрана (тип заливки - 5, цвет красный). 2. Построить три одинаковых по высоте и различных по ширине и глубине параллелепипеда, c различными типами заливки и различным цветом. 3. На каждой из построенных фигур указать площадь, предварительно их вычислив. 4. Изменить цвет красный в палитре на цвет синий, используя процедуру SetPalette. 5. Определить и вывести в центр экрана сообщение о количестве цветов в палитре. Очистить экран. 6. Нарисовать залитые сектор, многоугольник, круг, подписать их названия, используя шрифты различного размера. 7. Очистить экран. 8. Разделить экран на две части, для чего провести диагональ из левого верхнего угла. 9. В верхней половине вывести текст "How are you" различными шрифтами и разных размеров (начиная с самого большого) в горизонтальном направлении, а в нижней - в вертикальном. 10. Очистить экран. 11. Нарисовать изображение, движущееся из левого, верхнего угла экрана вертикально вниз.
Вариант 6 1. Построить залитый прямоугольник с координатами х1=25, y1=25, x2=maxx-25, y2=maxy-25, где maxx, maxy - размеры экрана (тип заливки 4, цвет - желтый). 2. Построить три одинаковых по высоте и различных по ширине и глубине параллелепипеда, закрашенных различными типами заливки и различным цветом. 3. На каждой из построенных фигур указать площадь, предварительно их вычислив. 53
54
4. Изменить цвет yеlloy в палитре на цвет blue, используя процедуру SetPalette. 5. Определить и вывести в центр экрана сообщение о количестве цветов в палитре. Очистить экран. 6. Нарисовать залитые сектор, многоугольник, круг, подписать их названия, используя шрифты различного размера. 7. Очистить экран. 8. Разделить экран на две части, для чего провести диагональ из правого верхнего угла. 9. В верхней половине вывести текст "Very Good" различными шрифтами и разных размеров (начиная с самого большого) в горизонтальном направлении, а нижней - в вертикальном. 10. Очистить экран. 11. Нарисовать изображение, движущееся из центра экрана в правый, верхний угол
Вариант 7 1. Построить залитый прямоугольник с координатами х1 = 40, y1 = 20, x2 = maxx-40, y2 = maxy-20, maxx, maxy - размеры экрана (тип заливки - 2, цвет зеленый). 2. Построить три одинаковых по высоте и различных по ширине и глубине параллелепипеда, c различными типами заливки и различным цветом. 3. На каждой из построенных фигур указать площадь, предварительно их вычислив. 4. Изменить цвет зеленый в палитре на цвет красный, используя процедуру SetPalette. 5. Определить и вывести в центр экрана сообщение о количестве цветов в палитре. Очистить экран. 6. Нарисовать залитые сектор, многоугольник, круг, подписать их названия, используя шрифты различного размера. 7. Очистить экран. 8. Разделить экран на две части, для чего провести диагональ из левого верхнего угла. 9. В верхней половине вывести текст "My name is Alex" различными шрифтами и разных размеров (начиная с самого большого) в горизонтальном 54
55
направлении, а в нижней - в вертикальном. 10. Очистить экран. 11. Нарисовать изображение, движущееся из правого, нижнего угла экрана вертикально вверх.
Вариант 8 1. Построить залитый прямоугольник с координатами х1 = 25, y1 = 10, x2 = maxx-25, y2 = maxy-10, maxx, maxy - размеры экрана (тип заливки - 3, цвет ярко-красный). 2. Построить три одинаковых по высоте и различных по ширине и глубине параллелепипеда, c различными типами заливки и различным цветом. 3. На каждой из построенных фигур указать площадь, предварительно их вычислив. 4. Изменить цвет ярко-красный в палитре на цвет голубой, используя процедуру SetPalette. 5. Определить и вывести в центр экрана сообщение о количестве цветов в палитре. Очистить экран. 6. Нарисовать залитые сектор, многоугольник, круг, подписать их названия, используя шрифты различного размера. 7. Очистить экран. 8. Разделить экран на две части, для чего провести диагональ из правого верхнего угла. 9. В верхней половине вывести текст "What is your name?" различными шрифтами и разных размеров (начиная с самого большого) в горизонтальном направлении, а в нижней - в вертикальном. 10. Очистить экран. 11. Нарисовать изображение, движущееся из левого, нижнего угла экрана в центр.
55
56
Вариант 9 1. Построить залитый прямоугольник с координатами х1 = 50, y1 = 30, x2 = maxx-50, y2 = maxy-30, maxx, maxy - размеры экрана (тип заливки - 2, цвет зеленый). 2. Построить три одинаковых по высоте и различных по ширине и глубине параллелепипеда, c различными типами заливки и различным цветом. 3. На каждой из построенных фигур указать площадь, предварительно их вычислив. 4. Изменить цвет зеленый в палитре на цвет красный, используя процедуру SetPalette. 5. Определить и вывести в центр экрана сообщение о количестве цветов в палитре. Очистить экран. 6. Нарисовать залитые сектор, многоугольник, круг, подписать их названия, используя шрифты различного размера. 7. Очистить экран. 8. Разделить экран на две части, для чего провести диагональ из левого верхнего угла. 9. В верхней половине вывести текст "My name is …" различными шрифтами и разных размеров (начиная с самого большого) в горизонтальном направлении, а в нижней - в вертикальном. 10. Очистить экран. 11. Нарисовать изображение, движущееся из правого, верхнего угла экрана вертикально вниз.
56