WriteLn(‘Введите фамилию');
Readln(fff);
key;=false; {устанавливаем признак «запись не найдена»}
ReSet(f); {открываем файл для чтения}
while (not EOF(f)) and (not key) do {пока не обнаружен конец
файла и не найдена запись}
begin
Read(f, fb); {читаем запись из файла}
if fb.ff = fff then {если фамилии совпадают, то}
begin {выводим данные}
WriteLn(‘Дата: ‘, fb.year,f b. Month:3, fb. Day:3);
key:=true; {устанавливаем признак «запись найдена»}
end;
end;
If not key then {если признак не установлен} WriteLn('Hem данных ‘) ;
Close(f); {закрываем файл}
Readln;
end.
Программы, написанные Вами и оформленные в виде готовых к употреблению процедур и функций, можно применять в других программах. Основная концепция такого подхода заключается в объединении своих процедур и функций в собственные библиотеки, которые могут подключаться к разрабатываемым программным продуктам.
Таким образом мы подошли к понятию модуля Unit. До сих пор Вы имели дело с встроенными модулями. Теперь Вы научитесь подключать к программе библиотеки, которые были созданы Вами.
Использование модулей считается прогрессивным подходом в программировании, т.к. модуль компилируется независимо от программы, а поэтому время компиляции для больших программ может существенно сократиться, что очень важно при отладке программ.
Модуль (Unit) – программная единица, текст которой компилируется независимо. Модуль включает в себя определения констант, типов данных, переменных, процедур и функций, доступных для использования в вызывающих программах. Однако внутренняя структура модуля скрыта от пользователя.
Подключение модулей к основной программе происходит в предложении
Uses …
Стандартные модули Паскаля
SYSTEM – подключается к любой программе автоматически без предложения Uses и содержит стандартные функции, процедуры, типы данных.
DOS – библиотека организации взаимодействия с операционной системой
MS DOS - содержит описание процедур и функций, обеспечивающих
обращение к функциям операционной системы..
PRINTER – делает доступным вывод текстов на матричный принтер.
OVERLAY – для организации памяти с перекрытиями.
TURBO3, GRAPH3 – предназначены для версии 3 и выделены в отдельные файлы с расширением tpu, тогда как остальные модули входят в библиотеку TURBO.TPL.
Поставляемые вместе с описанными модули ТигЬоЗ, Printer, Graph3,
Overlay устарели и практически не используются.
CRT – содержит константы, функции, процедуры, типы данных для управления текстовым режимом монитора, клавиатурой, динамиком.
GRAPH - содержит константы, функции, процедуры, типы данных для управления графическим режимом монитора.
Модуль можно разделить на несколько разделов:
заголовок,
интерфейсная часть,
реализационная часть,
инициализационная часть.
Unit <Имя модуля>; {Заголовок модуля}
Interface {Интерфейсная часть}
Uses<список подключаемых модулей>;
Const<описания констант, определенных в данном модуле и доступных для других модулей>;
Type<описания типов, определенных в данном модуле и доступных для других модулей>;
Var<описания переменных, определенных в данном модуле и доступных для других модулей>;
Procedure<Заголовки процедур, определенных в данном модуле и доступных для других модулей>;
Function<Заголовки функций, определенных в данном модуле и доступных для других модулей>;
Заголовок модуля
Заголовок модуля мало чем отличается от заголовка программы. В модуле вместо зарезервированного слова Program используется слово Unit. Здесь же могут присутствовать директивы компилятору, дающие общие установки для всего модуля. При выборе имени модуля необходимо учитывать одну особенность: имя модуля должно совпадать с именем дискового файла, в котором он хранится, а значит имя модуля не может состоять более чем из 8 символов. А также не забывайте, что имя не должно совпадать с именами объектов (процедур, функций и др.).
Интерфейсная часть
В этой части описываются все константы, типы данных и переменных, процедуры и функции, доступные в этом модуле для использования внешними программами.
Интерфейсная часть модуля несет всю информацию, необходимую для использования процедур и функций, определенных в модуле.
Указав в операторе Uses имена уже существующих готовых модулей, можно сделать их доступными для использования. Аналогично здесь описываются доступные извне и необходимые для описанных процедур и функций определения типов данных, констант и переменных.
Все процедуры и функции, доступные для общего пользования и определенные в данном модуле, должны быть описаны в интерфейсной части только своей строкой-заголовком с указанием типов параметров. Сам текст программы этих процедур и функций находится (с дубликатом их заголовка) в реализационной части.
Примечание. Интерфейсная часть может быть пуста.
Implementatoin {Реализационная часть}
Uses<список подключаемых модулей>;
Const<описания констант, определенных в данном модуле и недоступных для других модулей>;
Type<описания типов, определенных в данном модуле и недоступных для других модулей>;
Var<описания переменных, определенных в данном модуле и недоступных для других модулей>;
Procedure<реализация процедур, определенных в данном модуле и доступных для других модулей>;
Function<реализация функций, определенных в данном модуле и доступных для других модулей>;
Procedure<реализация процедур, определенных в данном модуле и недоступных для других модулей>;
Function<реализация функций, определенных в данном модуле и недоступных для других модулей>;
{Инициализационная часть}
Begin<Слово Begin необходимо, если имеются операторы в следующей части программы>
<часть модуля, исполняемая при его подключении (необязательна)>
End.
Пример 1
Unit cmplx;
interface
type comp=record
re,im: real
end;
procedure addc(x,y: comp; var z: comp);
procedure mulc(x,y: comp; var z: comp);
……………………………………………………….
Теперь, если в основной программе включить предложение
Uses cmplx;
то станут доступными тип comp и процедуры addc, mulc
Реализационная часть
Реализационная часть – это часть, в которой определяются процедуры и функции. Точно так же, как и внутри обычной программы, Вы можете определить здесь глобальные (для модуля) переменные, типы данных и константы наряду с определением процедур и функций. Определенные здесь типы данных и структуры данных недоступны извне и могут использоваться для своих нужд только программами, входящими в реализационную часть.
Реализационная часть также может быть пустой.
Продолжение примера 1
………………………………………………
Implementation
procedure addc;
begin
z.re:= x.re + y.re;
z.im:= x.im + y.im;
end;
procedure mulc;
………………………….
end;
end. {в этом модуле нет инициализационной части}
Инициализационная часть
Инициализационная часть представляет собой основной блок модуля. Приведенные в ней операторы выполняются первыми, т.е. они выполняются перед операторами основного блока главной программы, в которую включен данный модуль.
Пример 2
Unit FileText;
interface
procedure print(s: string); {только заголовок}
Implementation
var f: text;
procedure print;
begin
writeln(f, s);
end;
begin {начало инициализационной части}
assign(f, name);
rewrite(f);
end.
Пример 3 Разработать модуль, содержащий подпрограмму суммирования элементов массива.
Разбиваем текст программы примера 3 на две части: подпрограмму
размещаем в модуле, а тестирующую программу оставляем в качестве основной программы. Так как все структурные типы параметров должны быть предварительно объявлены, описываем тип массива в модуле.
{Модуль должен размещаться в файле Summa.pas}
Unit Summa;
Interface {объявление внешних ресурсов}
Туре mas=array[1..10] of integer;
Function sum(b:mas;n:integer):integer;
Implementation
Function sum; {описание функции}
Var s: integer; i: integer;
begin s:=0;
for i:=1 to n do s:= s+b[i];
sum:=s;
end;
End.
Программа использует из модуля два ресурса: описание типа mas для
объявления массива А и функцию Sum.
Program ex;
Uses Summa; {указание используемого модуля}
Var a:mas; {используем ресурс mas}
i,n: integer;
Begin
readln(n);
for i:=1 to n do read (a [i]);
ReadLn;
WriteLn('Cyмма=‘, sum(a,n)); {используем ресурс sum}
Readln;
End.
Компиляция модулей
Режим Compile - все упоминаемые в предложении Uses модули должны быть откомпилированы и помещены в файлы вида <имя>.tpu
Режим Make - система проверяет наличие tpu-файла для каждого объявленного в предложении Uses модуля. Если этого файла нет, то система пытается отыскать файл <имя>.pas, найдя его компилирует.
Режим Build - система сразу ищет файлы <имя>.pas и компилирует.
Модуль CRT
Библиотека модуля CRT содержит константы, типы данных, процедуры и функции, предназначенные для:
Управления текстовым экраном
а) формирования окна;
б) управления положением курсора;
в) определения цветом символов и фона
2. Управления клавиатурой
Управления динамиком.
В текстовом режиме программист имеет доступ ко всему экрану. Экран при этом поделен на строки и столбцы. На пересечении строки и столбца находится область, в которою возможен вывод одного знака. Такие области получили название знакоместо. Обычно программа на Паскале использует тот же текстовый режим, что и MS DOS, т.е. режим, при котором на экране
выделяется 25 строк и 80 столбцов или 43 строки и 80 столбцов.
Каждому знакоместу экрана в специальной памяти, называемой видеобуфером,
соответствует 2 байта, в которых хранится информация о высвечиваемом
символе:
код символа по таблице ASCII, которому соответствует матрица изображения
символа в специальной таблице знакогенератора;
байт-атрибут, в котором хранится информация о цвеет символа и цвете фона данного знакоместа.
Каждая точка высвечивается цветом символа или цветом фона
знакоместа, которому она принадлежит. Информация о знакоместе выбирается из видеобуфера. Таким образом, если изменить информацию в видеобуфере, то изменится и изображение на экране.
Цвета в текстовом режиме формируются следующим образом: три бита
управляют включением и выключением трех основных цветов (красного, зеленого и cинего - RGB) и один бит – яркостью .
Управления текстовым экраном
Управление экраном с помощью ресурсов модуля CRT базируется на понятии «окно».
Окно - часть экрана прямоугольной формы. Верхний левый угол экрана соответствует координате (1,1). Минимальный размер текстового окна - один столбец на одну строку.
В режиме на 25 строк по умолчанию определено окно (1,1,80,25), а в режиме на 43 строки - окно (1,1,80,43), соответствующие всему экрану.
В момент получения программой управления весь экран считается окном 25x80 знакомест (или 43х80).
Программист может определять на экране новые окна и управлять как цветом символов и фона окна, так и размещением информации в окне.
Вывод информации в текстовом режиме осуществляется стандартными процедурами Write и WriteLn текущими цветом символа и цветом фона.
При выводе четыре символа интерпретируются особым образом:
#7 - звуковой сигнал;
#8 - перемещение курсора влево на один символ;
#10 - перемещение курсора на строку вниз (если курсор находился в последней строке, то содержимое экран «прокручивается» на строку вверх);
#13 - перемещение курсора в начало текущей строки.
Процедуры начинают вывод с того места, где стоит курсор. Координаты курсора определяются относительно верхнего левого угла текущего окна .
Для управления окнами и размещения в них информации модуль CRT содержит следующие процедуры и функции.
1. Процедура Window(x1, у1, х2, y2:word) - определяет на экране окно.
Местоположение и размеры окна определяются координатами верхнего левого (х1, у1) и нижнего правого (х2, у2) углов прямоугольника. Координаты текущего окна модуль CRT хранит в специальных переменных: WindMin, WindMax: word. Обращение к процедуре Window игнорируется, если какая-либо из координат выходит за границы экрана или если нарушается одно из условий: Х2>Х1 и Y2>Y1
1≤x1
После объявления окна курсор устанавливается в верхний левый угол окна и весь вывод осуществляется в заданном окне.
2. Процедура TextColor(color:byte) - устанавливает текущий цвет вывода символов в окне.
3. Процедура TextBackGround(color:byte) - устанавливает текущий цвет
фона окна.
Цвета для процедур TextColor и TextBackGround можно задавать, используя специальные константы модуля crt:
Black = 0; {черный} DarkGrey = 8; {темно-серый}
Blue = 1; {синий} LightBlue = 9; {светло-синий}
Green=2; {зеленый} LightGreen = 10; {светло-зеленый}
Cyan = 3; {голубой} LightCyan = 11 ; {светло-голубой}
Red=4; {красный} LightRed-12; {розовый}
Magenta = 5; {фиолетовый} LightMagenta = 13; {сиреневый}
Brown = 6; {коричневый} Yellow = 14; {желтый}
LightGrey =7; {светло-серый} White = 15; {белый}
Blink =128; {мерцание}
4. Процедура ClrScr - очищает окно, выводя в него пробелы с текущим
атрибутом. После этого курсор устанавливается в верхний левый угол окна. Если окно не установлено, то очищается весь экран. Эту процедуру обычно используют после определения окна и атрибута его символов, чтобы обозначить окно на экране.
5. Функция WhereX : word - возвращает координату х текущего положения курсора в окне.
6. Функция WhereY : word - возвращает координату у текущего положения курсора в окне.
7. Процедура GotoXY(x,y:word) - перемещает курсор на знакоместо с координатами x и у.
Модуль CRT содержит также процедуры, работающие с текущей строкой (строкой, в которой стоит курсор).
8. Процедура DelLine - удаляет текущую строку.
9. Процедура InsLine - вставляет строку, сдвигая остальные строки
вниз.
10. Процедура ClrEol - стирает часть строки справа от курсора.
11. Процедура Textmode(mode:word) – устанавливает нужный текстовый режим, mode=3 возвращает нормальный режим (цветной, 80х25).
12. Процедура HighVideo – устанавливает повышенную яркость символов
13. Процедура LowVideo - устанавливает пониженную яркость символов.
14. Процедура NormVideo устанавливает нормальную яркость символов.
Текущие цвета символа и фона в виде байта атрибута хранятся в переменной TextAttr:word, Текущий цвет фона из этой переменной определяется как (TextAttr div 16) mod 8, a текущий цвет символа как TextAttr mod 16.
Пример 1
Uses CRT
var k: Byte;
begin
for k := 1 to 15 do
begin {Выводим 15 сообщений различными цветами}
TextColor(k); WriteLn('Цвет ', k)
end;
TextColor(White+Blink); {Белые мигающие символы}
WriteLn('Мерцание символов');
{Восстанавливаем стандартный цвет}
Textmode(3); WriteLn ; Readln
end.
Многие процедуры и функции модуля Crt зависят от текущего окна, включая ClrEol, ClrScr, DelLine, GotoXY, InsLine, WhereX, WhereY, Read, Readln, Write, Writeln.
Управление клавиатурой
Модуль CRT содержит специальные функции управления клавиатурой, которые позволяют работать с расширенными кодами.
1. Функция KeyPressed: boolean - возвращает true, если нажата любая клавиша, false - если буфер BIOS клавиатуры пуст; функция не извлекает символы из буфера, не ожидает ввода. Пример оператора ожидания нажатия любой клавиши: Repeat until keypressed.
2. Функция ReadKey:char - извлекает очередной код из буфера BIOS клавиатуры и возвращает его как результат операции, ожидает ввода, но не высвечивает вводимого символа.
Пример 2
uses Crt;
var
X, Y: Byte;
begin
TextBackground (Black);
ClrScr; {Очищаем экран}
repeat
X := Random (80) - 1;
Y := Random (25) - 1;
Window(X, Y, X+Random (10), Y+Random (8));
TextBackground (Random (16));
{изображение производится в случайных окнах с использованием случайных цветов}
ClrScr;
until KeyPressed; {действие повторяется, пока не нажата клавиша}
end.
3 Управление динамиком
Модуль CRT также содержит процедуры, обеспечивающие управление динамиком.
1. Процедура Sound (f:word) - генерирует звук указанной частоты в Гц.
Для справки, основной гамме соответствуют следующие частоты: нота «до» основной октавы - 330 Гц, далее - 349 Гц, 370 Гц, 392 Гц, 415 Гц, 440 Гц, 466 Гц, 494 Гц, 523 Гц, 554 Гц, 588 Гц, 622 Гц и, наконец, нота «до» следующей октавы - 660 Гц. Частоты нот других октав кратны частотам основной.
2. Процедура NoSound - выключает динамик.
3. Процедура Delay (t:word) - обеспечивает задержку на заданный интервал времени, мс.
Поскольку к настоящему моменту времени быстродействие компьютеров существенно возросло и изменились некоторые принципы их построения, процедура Delay не всегда обеспечивает корректную задержку.
Пример 3. Разработать программу проигрывания основной октавы.
Проигрывание гаммы осуществляется включением и выключением динамика с разными частотами.
Program gamma;
Uses Crt;
Const f: array[1..13] of word = (330, 349, 370, 392, 415, 440,
466, 494, 523, 554, 588, 622, 660);
Var i:byte;
Begin
for i:=1 to 13 do
begin
Sound(f[i]);
Delay(1000); {задержка }
NoSound;
end;
End.
Пример 4. Рассмотрим пример программы, предназначенной для организации меню в текстовом режиме. Будем располагать пункты меню вертикально (т.е. будем использовать вертикальное меню). Для выбора пункта в вертикальном меню естественно использовать клавиши ↑ и ↓ (коды 72 и 80), для выполнение выбранного пункта меню – клавишу “enter” (код 13), для окончания работы с программой – клавишу “esc” (код 27). Будем использовать три окна: первое окно – окно меню, второе окно – окно сопровождение задачи, третье окно – окно подсказки.
Пусть меню содержит следующие занумерованные пункты :
1.Ввод
2.Решение
3.Выдача результатов
4.Конец работы,
которые размещены в первом окне, например, в следующих строках: 1-й пункт ---- во второй строке окна,
2-й пункт ---- в четвёртой строке окна,
3-й пункт ---- в шестой строке окна,
4-й пункт ---- в восьмой строке окна.
Перемещение по пунктам меню с помощью клавиш ↑↓ организуем циклически, для этого создадим процедуры Up и DOWN и для задания окна процедуру - WIN, а также MENU, Procrun :
Procedure UP; {Передвижение вверх по меню}
Begin
y:=wherey-2;
if y<2 then y:=8
End;
Procedure DOWN; {Передвижение вниз по меню}
Begin
y:=wherey+2;
if y>8 then y:=2
End;
Procedure win(x1, y1, x2, y2, paper, ink: byte);
{процедура изображения окна с заданными координатами (x1,y1) и (x2,y2) левого верхнего и правого нижнего углов окна, с заданным цветом фона – paper и цветом символов - ink}
Begin
Textcolor(ink); Textbackground(paper); Window(x1,y1,x2,y2); Clrscr
End;
procedure Menu; {процедура вывода меню}
begin
win(10,4,30,14,green,black);
gotoxy(2,2); writeln(‘1 – Ввод’);
gotoxy(2,4); writeln(‘2 – Решение‘);
gotoxy(2,6); writeln(‘3 – Вывод результатов‘);
gotoxy(2,8); writeln(‘4 – Конец работы‘)
end;
С помощью процедуры Procrun будет осуществляться связь процесса – “задача” с окном сопровождения – окном 2:
ввод исходных данных,
выполнение вычислений (например, требуется вычислить V по формуле: V = U*U ) и
выдачу результатов.
Видим, что сама задача (выполнение вычислений) в этом примере тривиальна.
Procedure Procrun;
Var switch : byte;
Begin
Switch :=wherey div 2;{определение пункта меню по у – коорд.};
Win(40, 4, 70, 14, blue, black);
Case switch of
1 : begin {ввод исходных данных} write(‘u=>…’); readln(u) End;
2 : begin {выполнение вычислений} writeln(‘идёт счёт’); v:=u*u; writeln(’счёт окончен’) End;
3 : begin {выдача результатов} ;writeln(‘результаты счёта’); writeln(‘u=’,u:8:3,’ v=’,v:10:5) End;
4 : begin writeln(‘решение задачи окончено’); delay(5000); c:=#27 end
end ;{case}
Menu;
end;{proc}
Процедура Procrun после выполнения выбранного действия возвращает “процесс” в окно 1 (в меню) для выбора очередного пункта меню или для окончания работы.
Приведём текст программы:
Uses CRT;
Var c : char;{код нажатой клавиши}
X,y : integer;{координаты внутри окна} U,v : real;{переменные задачи}
{описание процедур Up, DOWN, Win, Procrun } …
{основная програма}
begin
win(1,1,80,25,red,black); win(10,23,75,24,yellow,black); {окно подсказки}
writeln(‘стрелки ↑↓ - для выбора пункта меню’);
write(‘enter, esc - выполнение выбранного пункта и выход’);
Menu;
Y:=2;
Repeat
Gotoxy(2,y); C:=readkey;
If c=#0 then { ↑↓ } Begin C:=readkey;
Case c of { ↑ }
#72:UP;{изменить y координату} { ↓ }
#80:Down;
end {case} end else if c=#13 then { enter}
Procrun
until c=#27 { esc}
end.
Управление экраном в графическом режиме
В графическом режиме программист получает возможность управлять
каждой точкой (пикселем) экрана. Координаты точки определяются относительно верхнего левого угла. Каждая точка экрана при этом может высвечиваться одним из доступных цветов. Информация о цвете точки хранится в видеобуфере.
Количество цветов зависит от количества бит, отведенных в видеобуфере
под одну точку. Рассмотрим основные варианты.
1. «1 точка - 1 бит» - монохромный режим: каждая точка высвечивается
либо основным цветом, если в видеобуфере для точки записана 1, либо
цветом фона, если в видеобуфере записан 0.
2. «1 точка - 2 бита» - режим с двумя трехцветными палитрами:
Палитра 0: Палитра1:
01-зеленый; 01-светло-голубой;
10 - красный; 10 - сиреневый;
11 - коричневый. 11 - белый.
Если в буфере записана комбинация 00, то точка высвечивается цветом фона.
3. «1 точка - 4 бита» - режим, использующий 16-цветную палитру. В
этом режиме в отличие от предыдущих в видеобуфер заносится не цвет точки, а номер регистра палитры, в котором записан нужный цвет.
Для записи цвета используется 6 бит по схеме RGBrgb, причем первые
три бита кодируют 2/3 яркости цвета, а вторые три бита - оставшуюся 1/3 яркости.
Так, максимально яркий красный цвет будет кодироваться двумя единицами в первом и четвертом битах:
R G В r g b
0 0 1 0 0
Таким образом, каждый цвет имеет четыре градации яркости: 0, 1/3, 2/3, 1, что позволяет кодировать 4^3 = 64 варианта цвета. На экране в этом режиме одновременно может присутствовать не более 16 цветов, так как имеется всего 16 регистров палитры.
4. «1 точка - 8 бит» - режим, использующий палитру на 256 цветов. В
этом режиме используется та же идея записи кода цвета не в видеобуфер, а в регистры палитры, что и в предыдущем режиме, но используется 256 регистров палитры, в которых под запись цвета используется 18 бит. Из этих 18 бит под кодирование яркости каждого цвета используется 6 бит, обеспечивая 64 градации яркости каждого цвета. Таким образом, на экране можно одновременно видеть 256 цветов из 64^3 = 262144 возможных.
Количество точек на экране, набор возможных цветов и количество
страниц изображения, которые могут одновременно храниться в памяти, зависят от используемых технических средств (типа монитора и блока управления монитором - адаптера) и режимов их работы.
Для каждого типа оборудования, существовавшего на момент разработки среды программирования, среда программирования Turbo Pascal 7.0 включает свою программу управления дисплеем - драйвер, которая обеспечивает работу в нескольких доступных режимах, различающихся количеством точек на экране и количеством страниц, информация о которых может храниться в видеобуфере.
Драйвер – это специальная программа, которая управляет техническими средствами компьютера. Для всех существующих типов адаптеров фирма Borland разработала графические драйверы (они имеют расширение .bgi и находятся на диске в одноименном подкаталоге).
Необходимые процедуры и функции для работы с графикой собраны стандартном модуле – Graph (более 80 процедур, функций, типов, констант).
I. Процедуры и функции переключения режимов управления экраном.
Модуль Graph содержит средства, обеспечивающие различные варианты
переключения текстового и графического режимов.
1. Процедура InitGraph(Var driver, mode:integer; path:string) – переключает экран в графический режим. При вызове процедуры следует объявить специальные переменные, куда занести константу драйвера и константу режима, и указать эти переменные в качестве параметров процедуры. Существует возможность запросить автоматическое определение драйвера и режима: для этого необходимо вместо константы драйвера в переменную, используемую в качестве параметра, записать константу detect = 0.
Целая переменная mode задает режим работы графического адаптера. Многие адаптеры могут работать в нескольких режимах.
Например, переменная Mode в момент обращения к InitGraph может иметь одно из следующих значений для адаптера VGA: VGALo =0; VGAMed = 1; VGAHi = 2;
Параметр path должен описывать путь, определяющий местоположение
файла, который содержит требуемый драйвер (обычно все драйверы находятся в подкаталоге BGI основного каталога среды Turbo Pascal). Если драйвер находится в текущем каталоге, то в качестве параметра передается пустая строка - ".
Для нашего графического режима обычно значение максимальной координаты X равно 640 пикселям, а Y– 480 пикселям.
2. Функция GraphResult: integer - возвращает номер ошибки, обнаруженной при инициализации графического режима.
3. Функция GraphErrorMSG(ErrNum:integer):string - позволяет по номеру
ошибки определить ее причину.
Полностью инициализация графического режима может быть выполнена следующим образом:
Var driver,mode,error: integer;
Begin
driver: =detect; {или driver: =0;}
InitGraph (driver, mode, 'd: \BP \BGI');
error: =GraphResult;
If error <>0 then {если обнаружены ошибки}
begin
WriteLn('Ошибка инициализации графического режима',
GraphErrorMSG(error));
Halt(1); {аварийное завершение программы}
end;
{работа в графическом режиме}...
4. Процедура CloseGraph - завершает работу в графическом режиме:
выгружает драйвер и восстанавливает текстовый режим. Если завершить
программу, не выходя из графического режима, то нормальная работа MS
DOS нарушается, так как MS DOS функционирует в текстовом режиме.
5. Процедура RestoreCrtMode - осуществляет временный возврат в текстовый режим с сохранением графического изображения в видеобуфере.
6. Процедура SetGraphMode(mode:integer) - осуществляет возврат в
графический режим после временного выхода, осуществленного процедурой RestoreCrtMode.
7. Функция GetGraphMode:integer - возвращает номер активного графического режима.
Таким образом, временный выход в текстовый режим обычно оформляется
следующим образом:
RestoreCrtMode; {переход в текстовый режим}
... {выполнение обработки в текстовом режиме}
SetGraphMode(GetGraphMode); {возврат в графический режим}
II. Процедуры и функции управления цветом. Модуль Graph содержит
специальные процедуры и функции управления цветом изображения.
1. Процедура SetBkColor(Color:word) - устанавливает новый цвет фона.
При инициализации графического режима видеобуфер очищается (обнуляется). При этом все точки оказываются связаны с 0 регистром палитры, который и считается регистром, хранящим цвет фона. Процедура SetBkCoIor записывает в 0 регистр палитры цвет, указанный в параметре Color.
2. Процедура SetColor(ColorNum:word) - объявляет цвет в регистре с
номером ColorNum текущим цветом рисования.
III. Процедуры и функции управления типом, толщиной линии и видом штриховки. Модуль Graph содержит средства, позволяющие управлять типом и толщиной линии, а также образцом закраски замкнутых контуров.
1. Процедура SetLineStyle(style, pattern, thickness: word) - устанавливает
стиль style или образец pattern линии и ее толщину thickness.
Для установки стиля используют следующие константы:
SolidLn=0; {сплошная} DottedLn=l; {точечная}
CenterLn=2; {штрихпунктирная} DashedLn=3; {пунктирная}
UserBitLn=4; {определенная программистом в образце}
Если указаны стили 0..3, то образец игнорируется. Если установлен
стиль 4, то вид линии определяется образцом.
Толщину линии можно установить одинарной и тройной, соответствующие
константы выглядят следующим образом:
NormWidth=l; {нормальная толщина линии}
ThickWidth=3; {тройная толщина линии }
2. Процедура SetFillStyle(fillstyle, color: word) - устанавливает образец
fillstyle и цвет color штриховки замкнутых контуров. Для определения образцов штриховки можно использовать следующие константы:
EmptyFill=0; {без штриховки - прозрачный контур}
SolidFill=1; {сплошная заливка}
LineFill=2; { горизонтальные линии}
LtSlashFill=3; {//// тонкие линии}
SlashFiU=4; {\\\\ - толстые линии}
BkSlashFill=5; {\\\\ - толстые линии}
LtBkSlashFill=6; {////- тонкие линии}
HatchFill=7; {-f+++ - клетка горизонтальная}
и т.д.
3. Процедура FloodFill(x, у, color: word) - закрашивает текущим образцом
и цветом закраски, установленными процедурой SetFiIlStyle, область,
ограниченную контуром цвета color, внутри которой находится точка с координатами (х,у). Если контур не замкнут, то будет закрашен весь экран
IV. Процедуры и функции рисования точек и линий, фигур
Модуль Graph предоставляет программисту большой набор процедур и функций, рисующих различные примитивы (простейшие фигуры, размеры и местоположение которых определяются параметрами).
1. Процедура PutPixel(x, у, color: word) - рисует точку цветом, определенным color, в точке экрана с координатами (x, у).
2. Функция GetPixel(x,y:word):word – возвращает цвет точки с указанными координатами.
3. Функция MoveTo(x,y:word):word- задает положение текущей точки -
точки, используемой в качестве исходной при рисовании линий или выводе
текста.
4. Процедура MoveRel(dx,dy:word) - задает положение текущей точки
относительно ее предыдущего положения.
5. Функции GetX:word и GetY:word- возвращают соответственно координаты x и у текущей точки.
6. Функции GetMaxX:word и GetMaxY:word - возвращают соответственно
максимальные размеры экрана в точках для текущего режима.
7. Процедура Line(x1,y1,x2,y2:word) - рисует линию из точки (х1,у1) в точку (х2,у2).
8. Процедура LineTo(x,y:word) - рисует линию из текущей точки в точку (х,у).
9. Процедура LineRel(dXydy:word) - рисует линию из текущей точки в точку, отстоящую от текущей на dx, dy.
10. Процедура Rectangle(xl,yl,x2,y2:word) - рисует прямоугольник по координатам левого верхнего и правого нижнего углов.
11. Процедура Bar(xlyyl,x2,y2:word) - рисует заштрихованный прямоугольник с заданными координатами текущим цветом и закрашивает его текущим образцом закраски.
12. Процедура Bar3D(xl,yl,x2,y2, depth:word; top: boolean) - рисует параллелепипед, у которого: размер передней грани определяется координатами х1, у 1, х2, у2; глубина depth обычно задается равной 25% ширины, а параметр top определяет, рисовать ли верхнюю грань (да, если true, и нет, если false). Верхнюю грань не рисуют, если необходимо изобразить несколько параллелепипедов, стоящих друг на друге. Передняя грань закрашивается текущим образцом и цветом закраски.
13. Процедура DrawPoly(numPoints:word; var PolyPoints) - рисует ломаную линию. Первый параметр определяет количество вершин ломаной, а второй - координаты этих вершин в массиве элементов специального типа PointType:
Type PointType = record
x,y:word;
end;...
Например:
Var MP:array[1..5] of PointType; {объявление массива координат точек}
DrawPoly(5,MP); {рисуем ломаную линию}
14. Процедура FillPoly (numPoints:word; Var PolyPoints) - рисует закрашенный многоугольник с указанными вершинами.
15. Процедура Circle (х, у, radius:word) - рисует окружность заданного
радиуса radius с центром в точке (х, у).
16. Процедура Arc(х,у, stangle, endangle, radius: word) - рисует дугу окружности указанного радиуса radius от угла stangle до угла endangle. Углы отсчитываются от положительного направления оси абсцисс против часовой стрелки и указываются в градусах.
17. Процедура Pieslice (х, у, stangle, endangle, radius:word) - рисует заштрихованный сектор или окружность (если конечный угол равен начальному). Углы отсчитываются от положительного направления оси абсцисс против часовой стрелки и указываются в градусах.
18. Процедура Ellipse (х, у, stangle, endangle, radiusX, radiusY: word) -
рисует эллипс или его дугу.
19. Процедура Sector (х, у, stangle, endangle, radiusX, radiusY: word) -
рисует заштрихованный эллипс или его сектор.
20. Процедура FillEllipse (х, у, radiusX, radiusY: word) - рисует заштрихованный эллипс.
V. Процедуры и функции управления текстом. Текст в графическом режиме может быть выведен процедурами Write и WriteLn, но при этом управление выполняется аналогично текстовому режиму. Специально для работы с текстом в графическом режиме модуль Graph предлагает следующие процедуры и функции.
1. Процедура SetTextStyle(font,direction,charsize:word) - устанавливает
текущий шрифт font, направление вывода строки direction и размер шрифта charsize.
Для установки шрифта используют специальные константы:
DefaultFont=0; {обычный}
TriplexFont=1; {полужирн ы й}
SmallFont=2; {мел кий}
SanserifFont=3; {прямой}
GothicFont=4; {готический}
Направление вывода может быть либо горизонтальным, либо вертикальным: HorizDir=0; {горизонтальное направление}
VertDir=l; {вертикальное направление}
Размер шрифта указывается значением, на которое необходимо умножить
исходный размер шрифта (8x8 точек). Таким образом, шрифт можно
увеличивать в целое число раз.
2. Процедура SetTextJustify(goriz, vert :word) - устанавливает способ выравнивания для горизонтального goriz и вертикального vert направлений вывода. Способ выравнивания определяется относительно некоторой точки с помощью специальных констант:
LeftText=0; {точка слева от текста}
CenterText=1; {точка по центру текста при горизонтальном направлении
вывода}
RightText=2; {точка справа от текста}
BottomText=0; {точка под текстом}
CenterText=1; {точка по центру текста при вертикальном направлении
вывода}
TopText=2; {точка над текстом}
3. Процедура OutText (st:string) - выводит строку, выравнивая ее заданным способом относительно текущей точки.
4. Процедура OutTextXY(x,y:word; st: string) - выводит строку st, выравнивая ее в соответствии с установленными режимами вертикального и горизонтального выравнивания относительно точки (х, у).
Пример 1. Приведем пример программы, при выполнении которой создается интересный визуальный эффект путем заполнения экрана множеством точек различных цветов.
Uses Crt, Graph;
Var Driver, Mode : integer; Color: word; X,Y:word;
Procedure GrInit;
Begin
Driver:= Detect; {автораспознанание драйвера} InitGraph(Driver, Mode,'');
If GraphResult<>0 then Begin Writeln ('Ошибка инициализации!');
Writeln ('Работа программы прервана'); Halt (1) {остановить выполнение программы с кодом завершения — 1}
End; End;
Begin GrInit;
Color: =0; Randomize;
Repeat
{выберем случайным образом координаты точки}
X: = Random(GetMaxX); Y: = Random(GetMaxY);
PutPixel(X,Y,Color); {вывод точки} Inc(Color); {изменение цвета}
{проверим, не превышает ли значение цвета максимального значения, которое определяет функция GetMaxColor}
If Color = GetMaxColor Then Color: =0;
Until KeyPressed; {повторять до нажатия любой клавиши}
ClearDevice;
CloseGraph
End.
Пример 2 Будильник.
program Budil;
uses graph;
var grDriver:integer; grMode:integer;
Begin
grDriver:=Detect; InitGraph(grDriver,grMode,'');
{Смена цвета фона}
SetBkColor(14);
{Смена цвета линии}
SetColor(5);
{Рисование окружности}
Circle(250,180,60); Circle(270,180,60);
Circle(210,235,7); Circle(310,235,7);
Circle(260,180,7); Circle(260,115,10);
SetColor(9);
{Рисование линий}
Line(260,180,260,140); Line(260,180,270,150);
Circle(260,230,5); Circle(260,125,5);
Circle(230,180,5); Circle(290,180,5);
readln;
End.
Пример 3. Прогрaмма рисует 5 концентрических окружностей в центре экрaнa.
Program Krug2;
Uses Graph;
Var Gd, Gm, rad,xc,yc:integer;
begin Gd:=Detect; { функция InitGraph должнa выполнить } { aвтоопределение типa мониторa (Gd) и его } { мaксимaльного рaзрешения (Gm)} InitGraph(Gd,Gm,''); { инициaлизaция грaфического режимa }
if GraphResult <> 0 then { в случaе ошибки инициaлизaции } begin Writeln('Ошибкa инициaлизaции грaфического режимa');
Writeln('В кaтaлоге прогрaммы должен присутствовaть дрaйвер egavga.bgi'); Writeln('или укaжите путь к нему в IniGraph(Gd,Gm,<путь>)'); Halt(1); end;
Case Gd of { aнaлизируем тип дисплея } { и вычисляем координaты центрa экрaнa }
9: begin { VGA монитор } xc:=(640-1) div 2; yc:=(480-1) div 2; end;
3: begin { EGA монитор } xc:=(640-1) div 2; yc:=(350-1) div 2; end; end;
for rad:=1 to 5 do Circle(xc, yc, rad*20); { рисуем окружности } Readln; CloseGraph; { возврaт в текстовый режим }
end.
Пример 4. Программа выводит десять вложенных друг в друга прямоугольников, после чего циклически меняет цвет фона. Для выхода из программы достаточно нажать на любую клавишу.
Uses Graph, CRT;
const NC: array [0..15] of String [12] = ('Black', 'Blue', 'Green', 'Cyan‘ ,'Red', 'Magenta',
' Brown', 'LightGray‘ ,'DarkGray', 'LightBlue', 'LightGreen’,'LightCyan1,'LightRed',
'LightMagenta‘ ,'Yellow', 'White');
var d, r, e, k, color, dx, dy: Integer;
Begin {Инициируем графику}
d := Detect; InitGraph(d, r, ' ') ;
e := GraphResult; if e <> grOK then WriteLn(GraphErrorMsg(e))
else begin {Выводим текст в центре экрана}
OutTextXY(200,GetMaxY div 2 ,'BACKGROUND COLOR');
dx := GetMaxX div 30; {Приращение длины}
dy := GetMaxY div 25; {Приращение высоты}
for k := 0 to 9 do{Выводим 10 прямоугольников}
Rectangle(k*dx,k*dy,GetMaxX-k*dx,GetMaxY-k*dy);
color := black; {Начальный цвет фона}
repeat {Цикл смены фона}
SetBkColor(color) ; SetFillStyle(0,Color);
Bar(345,GetMaxY div 2, 440 , GetMaxY div 2+8);
OutTextXY(345,GetMaxY div 2,NC[color]); delay(1000); inc(color);
if color > White then color := Black until KeyPressed;
if ReadKey=#0 then k := ord(ReadKey);
CloseGraph end
end.
Построение графика элементарных функций
Пусть дана некоторая функция у = f(х). Рассмотрим прямоугольную область координатной плоскости, которая определяется значениями:
xMin ≤ x ≤ xMax; yMin ≤ y ≤ yMax;
Эту область назовём областью функции, а координаты (х, у) — мировыми координатами. Графиком функции f(х) является некоторое конечное множество точек (хk,уk), уk = f(xk), k=1, ..., n из области функции.
Выделим на экране компьютера прямоугольную область, которую будем называть окном, в котором поместим точечный график функции. В графическом режиме экран имеет другую систему координат U и V.
Шаг 1. Определим исходные данные uMin, uMax, vMin, vMax, xMin, xMax, yMin, уМах, а также количество точек n=uMax — uMin и шаг изменения х xStep=(xMax — xMin)/n.
Шаг 2. Нарисуем рамку, обрамляющую окно (это будет прямоугольник, левый верхний угол которого имеет координаты (uMin, vMin), а правый нижний угол — (uMax, vMax).
Шаг 3. Вычислим кооэффициенты сжатия рх и ру по формулам .
Шаг 4. Нарисуем оси координат.
Шаг 5. Строим график функции y = f(x) из n точек, преобразовывая х в u, а у в v.
uses Graph;
Const uMin=50; uMax=600; vMin=50; vMax=450;
{Окно графика функции}
Var grDriver: integer;
grMode: integer;
xStep:real; {Шаг по х}
n, k: integer; {Число точек графика}
x,y,px,py:real;
xMin, yMin,yMax, xMax:real;{Область функции}
Procedure Grlnit;
Begin
grDriver:=Detect;
InitGraph(grDriver,grMode,'');
IF GraphResult<>0 then
begin
Writeln('Ошибка инициализации!');
writeln('Работа программы прервана');
Halt(1)
end
End;
Function xScr(x: real):integer;
{Преобразование координаты х в u}
begin
xScr:=Round((x-xMin)*px+uMin);
end;
Function yScr(y:real):integer;
{Преобразование координаты y в v}
begin
yScr:=Round((y-yMax)*py+vMin);
end;
Function f(x:real):real;
{Вид функции}
begin
f:=X*X-5*X+6;
end;
Begin
{Ввод исходных значений области функции}
write('xMin='); readln(xMin);
write('xMax='); readln(xMax);
write('yMin='); readln(yMin);
write('yMax='); readln(yMax);
px:=(uMax-uMin)/(xMax-xMin);
py:=-(vMax-vMin)/(yMax-yMin);
Grlnit;
{Построение рамки прямоугольника}
SetLineStyle(0,0,3);
Rectangle(uMin,vMin,uMax,vMax);
{Построение осей координат}
SetLineStyle(0,0,1);
If (xMin<0) and (xMax>0) then
Line (xScr(0),vMin,xScr(0),vMax);
If(yMin<0) and(yMax>0) then
Line(uMin,yScr(0),uMax,yScr(0));
{Определение количества точек графика}
n:=uMax-uMin;
{Вычисление шага}
xStep:=(xMax-xMin)/n;
x:=xMin;
{Вывод графика в виде n точек желтого цвета, преобразовывая при этом х в u, у в v}
for k:=1 to n do
begin
y:=f(x);
if(y> yMin) and (y
Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:
Email: Нажмите что бы посмотреть