Лекция_Информатика_12Б.ppt
- Количество слайдов: 59
КЕМЕРОВСКИЙ ИНСТИТУТ (филиал) РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ ТОРГОВО-ЭКОНОМИЧЕСКИЙ УНИВЕРСИТЕТ КАФЕДРА ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ И ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ Информатика и программирование Лебедева Т. Ф.
4 Программирование алгоритмов обработки сложных данных 33 Пример 3. Разработать программу, которая создает файл, содержащий список фамилий и дат рождения. Осуществить поиск в этом файле даты рождения по заданной фамилии. Program ex 1; Type fam = record {тип запись «сведения о сотрудниках» } ff: string[20]; {фамилия} year: word; {год рождения} month: 1. . 12; {месяц рождения} day: 1. . 31 {день рождения} end; Var f: file of fam; {файловая переменная «файл сотрудников» } fb: fam; п , i: integer; fff: string; key: boolean; Begin Assign(f, ‘a. dat'); {связываем файловую переменную с файлом} Re. Write(f); {открываем файл для записи} Write. Ln(‘Введите данные или CTRL-Z’); while not EOF do {цикл, пока не введено CTRL-Z} begin Read. Ln(fb. ff); Read. Ln(b. year, fb. month, fb. day); {вводим данные по полям} Write(f, fb); {заносим запись в файл как один компонент} end; Close(f); {закрываем файл}
4 Программирование алгоритмов обработки сложных данных 34 Write. Ln(‘Введите фамилию'); Readln(fff); key: =false; {устанавливаем признак «запись не найдена» } Re. Set(f); {открываем файл для чтения} while (not EOF(f)) and (not key) do {пока не обнаружен конец файла и не найдена запись} begin Read(f, fb); {читаем запись из файла} if fb. ff = fff then {если фамилии совпадают, то} begin {выводим данные} Write. Ln(‘Дата: ‘, fb. year, f b. Month: 3, fb. Day: 3); key: =true; {устанавливаем признак «запись найдена» } end; If not key then {если признак не установлен} Write. Ln('Hem данных ‘) ; Close(f); {закрываем файл} Readln; end.
5 Модульный принцип построения программ 35 Программы, написанные Вами и оформленные в виде готовых к употреблению процедур и функций, можно применять в других программах. Основная концепция такого подхода заключается в объединении своих процедур и функций в собственные библиотеки, которые могут подключаться к разрабатываемым программным продуктам. Таким образом мы подошли к понятию модуля Unit. До сих пор Вы имели дело с встроенными модулями. Теперь Вы научитесь подключать к программе библиотеки, которые были созданы Вами. Использование модулей считается прогрессивным подходом в программировании, т. к. модуль компилируется независимо от программы, а поэтому время компиляции для больших программ может существенно сократиться, что очень важно при отладке программ. Модуль (Unit) – программная единица, текст которой компилируется независимо. Модуль включает в себя определения констант, типов данных, переменных, процедур и функций, доступных для использования в вызывающих программах. Однако внутренняя структура модуля скрыта от пользователя.
5 Модульный принцип построения программ 36 Стандартные модули Паскаля SYSTEM – подключается к любой программе автоматически без предложения Uses и содержит стандартные функции, процедуры, типы данных. DOS – библиотека организации взаимодействия с операционной системой MS DOS - содержит описание процедур и функций, обеспечивающих обращение к функциям операционной системы. . PRINTER – делает доступным вывод текстов на матричный принтер. OVERLAY – для организации памяти с перекрытиями. TURBO 3, GRAPH 3 – предназначены для версии 3 и выделены в отдельные файлы с расширением tpu, тогда как остальные модули входят в библиотеку TURBO. TPL. Поставляемые вместе с описанными модули Тиг. Ьо. З, Printer, Graph 3, Overlay устарели и практически не используются. CRT – содержит константы, функции, процедуры, типы
5 Модульный принцип построения программ 37 Модуль можно разделить на несколько разделов: • заголовок, • интерфейсная часть, • реализационная часть, • инициализационная часть. Unit <Имя модуля>; {Заголовок модуля} Interface {Интерфейсная часть} Uses <список подключаемых модулей>; Const <описания констант, определенных в данном модуле и доступных для других модулей>; Type <описания типов, определенных в данном модуле и доступных для других модулей>; Var <описания переменных, определенных в данном модуле и доступных для других модулей>; Procedure <Заголовки процедур, определенных в данном модуле и доступных для других модулей>; Function <Заголовки функций, определенных в данном модуле и доступных для других модулей>;
5 Модульный принцип построения программ 37 Заголовок модуля мало чем отличается от заголовка программы. В модуле вместо зарезервированного слова Program используется слово Unit. Здесь же могут присутствовать директивы компилятору, дающие общие установки для всего модуля. При выборе имени модуля необходимо учитывать одну особенность: имя модуля должно совпадать с именем дискового файла, в котором он хранится, а значит имя модуля не может состоять более, чем из 8 символов. А также не забывайте, что имя не должно совпадать с именами объектов (процедур, функций и др. ). Интерфейсная часть В этой части описываются все константы, типы данных и переменных, процедуры и функции, доступные в этом модуле для использования внешними программами. Интерфейсная часть модуля несет всю информацию, необходимую для использования процедур и функций, определенных в модуле. Указав в операторе Uses имена уже существующих готовых модулей, можно сделать их доступными для использования. Аналогично здесь описываются доступные извне и необходимые для описанных процедур и функций определения типов данных, констант и переменных. Все процедуры и функции, доступные для общего пользования и определенные в данном модуле, должны быть описаны в интерфейсной части только своей строкой-заголовком с указанием
5 Модульный принцип построения программ 38 Пример 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
5 Модульный принцип построения программ 38 Implementatoin {Реализационная часть} Uses<список подключаемых модулей>; Const<описания констант, определенных в данном модуле и недоступных для других модулей>; Type <описания типов, определенных в данном модуле и недоступных для других модулей>; Var <описания переменных, определенных в данном модуле и недоступных для других модулей>; Procedure <реализация процедур, определенных в данном модуле и доступных для других модулей>; Function <реализация функций, определенных в данном модуле и доступных для других модулей>; Procedure <реализация процедур, определенных в данном модуле и недоступных для других модулей>; Function <реализация функций, определенных в данном модуле и недоступных для других модулей>; {Инициализационная часть} Begin <Слово Begin необходимо, если имеются операторы в следующей части программы> <часть модуля, исполняемая при его подключении (необязательна)> End.
5 Модульный принцип построения программ 39 Реализационная часть – это часть, в которой определяются процедуры и функции. Точно так же, как и внутри обычной программы, Вы можете определить здесь глобальные (для модуля) переменные, типы данных и константы наряду с определением процедур и функций. Определенные здесь типы данных и структуры данных недоступны извне и могут использоваться для своих нужд только программами, входящими в реализационную часть. Реализационная часть также может быть пустой. Продолжение примера 1 ……………………… Implementation procedure addc; begin z. re: = x. re + y. re; z. im: = x. im + y. im; end; procedure mulc; ……………. end; end. {в этом модуле нет инициализационной части} Инициализационная часть представляет собой основной блок модуля. Приведенные в ней операторы выполняются первыми, т. е. они выполняются перед операторами основного блока главной программы,
5 Модульный принцип построения программ 40 Пример 2 Unit File. Text; interface procedure print(s: string); {только заголовок} Implementation var f: text; procedure print; begin writeln(f, s); end; begin {начало инициализационной части} assign(f, name); rewrite(f); end.
5 Модульный принцип построения программ 41 Пример 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.
5 Модульный принцип построения программ 42 Программа использует из модуля два ресурса: описание типа 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]); Read. Ln; Write. Ln('Cyмма=‘, sum(a, n)); {используем ресурс sum} Readln; End.
5 Модульный принцип построения программ 43 Компиляция модулей Режим Compile - все упоминаемые в предложении Uses модули должны быть откомпилированы и помещены в файлы вида <имя>. tpu Режим Make - система проверяет наличие tpu-файла для каждого объявленного в предложении Uses модуля. Если этого файла нет, то система пытается отыскать файл <имя>. pas, найдя его компилирует. Режим Build - система сразу ищет файлы <имя>. pas и компилирует.
5 Модульный принцип построения программ 44 1. Модуль CRT Библиотека модуля CRT содержит константы, типы данных, процедуры и функции, предназначенные для: 1. Управления текстовым экраном а) формирования окна; б) управления положением курсора; в) определения цветом символов и фона 2. Управления клавиатурой 3. Управления динамиком. В текстовом режиме программист имеет доступ ко всему экрану. Экран при этом поделен на строки и столбцы. На пересечении строки и столбца находится область, в которою возможен вывод одного знака. Такие области получили название знакоместо. Обычно программа на Паскале использует тот же текстовый режим, что и MS DOS, т. е. режим, при котором на экране выделяется 25 строк и 80 столбцов или 43 строки и 80 столбцов.
5 Модульный принцип построения программ 45 Управления текстовым экраном Каждому знакоместу экрана в специальной памяти, называемой видеобуфером, соответствует 2 байта, в которых хранится информация о высвечиваемом символе: q код символа по таблице ASCII, которому соответствует матрица изображения q символа в специальной таблице знакогенератора; q байт-атрибут, в котором хранится информация о цвеет символа и цвете фона данного знакоместа. Каждая точка высвечивается цветом символа или цветом фона знакоместа, которому она принадлежит. Информация о знакоместе выбирается из видеобуфера. Таким образом, если изменить информацию в видеобуфере, то изменится и изображение на экране. Цвета в текстовом режиме формируются следующим образом: три бита управляют включением и выключением трех основных
5 Модульный принцип построения программ 46 Управление экраном с помощью ресурсов модуля CRT базируется на понятии «окно» . Окно - часть экрана прямоугольной формы. Верхний левый угол экрана соответствует координате (1, 1). Минимальный размер текстового окна - один столбец на одну строку. В режиме на 25 строк по умолчанию определено окно (1, 1, 80, 25), а в режиме на 43 строки - окно (1, 1, 80, 43), соответствующие всему экрану. В момент получения программой управления весь экран считается окном 25 x 80 знакомест (или 43 х80). Программист может определять на экране новые окна и управлять как цветом символов и фона окна, так и размещением информации в окне. Вывод информации в текстовом режиме осуществляется стандартными процедурами Write. Ln текущими цветом символа и цветом фона.
5 Модульный принцип построения программ 47 При выводе четыре символа интерпретируются особым образом: #7 - звуковой сигнал; #8 - перемещение курсора влево на один символ; #10 - перемещение курсора на строку вниз (если курсор находился в последней строке, то содержимое экран «прокручивается» на строку вверх); #13 - перемещение курсора в начало текущей строки. Процедуры начинают вывод с того места, где стоит курсор. Координаты курсора определяются относительно верхнего левого угла текущего окна. Для управления окнами и размещения в них информации модуль CRT содержит следующие процедуры и функции. 1. Процедура Window(x 1, у1, х2, y 2: word) - определяет на экране окно. Местоположение и размеры окна определяются координатами верхнего левого (х1, у1) и нижнего правого (х2, у2) углов прямоугольника. Координаты текущего окна модуль CRT хранит в специальных переменных: Wind. Min, Wind. Max:
5 Модульный принцип построения программ 48 После объявления окна курсор устанавливается в верхний левый угол окна и весь вывод осуществляется в заданном окне. 2. Процедура Text. Color(color: byte) - устанавливает текущий цвет вывода символов в окне. 3. Процедура Text. Back. Ground(color: byte) - устанавливает текущий цвет фона окна. Цвета для процедур Text. Color и Text. Back. Ground можно задавать, используя специальные константы модуля crt: Black = 0; {черный} Dark. Grey = 8; {темно-серый} Blue = 1; {синий} Light. Blue = 9; {светло-синий} Green=2; {зеленый} Light. Green = 10; {светлозеленый} Cyan = 3; {голубой} Light. Cyan = 11 ; {светлоголубой} Red=4; {красный} Light. Red-12; {розовый} Magenta = 5; {фиолетовый} Light. Magenta = 13; {сиреневый} Brown = 6; {коричневый} Yellow = 14; {желтый}
5 Модульный принцип построения программ 49 4. Процедура Clr. Scr - очищает окно, выводя в него пробелы с текущим атрибутом. После этого курсор устанавливается в верхний левый угол окна. Если окно не установлено, то очищается весь экран. Эту процедуру обычно используют после определения окна и атрибута его символов, чтобы обозначить окно на экране. 5. Функция Where. X : word - возвращает координату х текущего положения курсора в окне. 6. Функция Where. Y : word - возвращает координату у текущего положения курсора в окне. 7. Процедура Goto. XY(x, y: word) - перемещает курсор на знакоместо с координатами x и у. Модуль CRT содержит также процедуры, работающие с текущей строкой (строкой, в которой стоит курсор). 8. Процедура Del. Line - удаляет текущую строку. 9. Процедура Ins. Line - вставляет строку, сдвигая остальные строки вниз.
5 Модульный принцип построения программ 50 11. Процедура Textmode(mode: word) – устанавливает нужный текстовый режим, mode=3 возвращает нормальный режим (цветной, 80 х25). 12. Процедура High. Video – устанавливает повышенную яркость символов 13. Процедура Low. Video - устанавливает пониженную яркость символов. 14. Процедура Norm. Video устанавливает нормальную яркость символов. Текущие цвета символа и фона в виде байта атрибута хранятся в переменной Text. Attr: word, Текущий цвет фона из этой переменной определяется как (Text. Attr div 16) mod 8, a текущий цвет символа как Text. Attr mod 16. Пример 1 Uses CRT var k: Byte; begin for k : = 1 to 15 do begin {Выводим 15 сообщений различными цветами} Text. Color(k); Write. Ln('Цвет ', k) end;
5 Модульный принцип построения программ 51 Многие процедуры и функции модуля Crt зависят от текущего окна, включая Clr. Eol, Clr. Scr, Del. Line, Goto. XY, Ins. Line, Where. X, Where. Y, Readln, Writeln. 2 Управление клавиатурой Модуль CRT содержит специальные функции управления клавиатурой, которые позволяют работать с расширенными кодами. 1. Функция Key. Pressed: boolean - возвращает true, если нажата любая клавиша, false - если буфер BIOS клавиатуры пуст; функция не извлекает символы из буфера, не ожидает ввода. Пример оператора ожидания нажатия любой клавиши: Repeat until keypressed. 2. Функция Read. Key: char - извлекает очередной код из буфера BIOS клавиатуры и возвращает его как результат операции, ожидает ввода, но не
5 Модульный принцип построения программ 52 Пример 2 uses Crt; var X, Y: Byte; begin Text. Background (Black); Clr. Scr; {Очищаем экран} repeat X : = Random (80) - 1; Y : = Random (25) - 1; Window(X, Y, X+Random (10), Y+Random (8)); Text. Background (Random (16)); {изображение производится в случайных окнах с использованием случайных цветов} Clr. Scr; until Key. Pressed; {действие повторяется, пока не нажата клавиша} end.
5 Модульный принцип построения программ 53 3 Управление динамиком Модуль CRT также содержит процедуры, обеспечивающие управление динамиком. 1. Процедура Sound (f: word) - генерирует звук указанной частоты в Гц. Для справки, основной гамме соответствуют следующие частоты: нота «до» основной октавы - 330 Гц, далее - 349 Гц, 370 Гц, 392 Гц, 415 Гц, 440 Гц, 466 Гц, 494 Гц, 523 Гц, 554 Гц, 588 Гц, 622 Гц и, наконец, нота «до» следующей октавы - 660 Гц. Частоты нот других октав кратны частотам основной. 2. Процедура No. Sound - выключает динамик. 3. Процедура Delay (t: word) - обеспечивает задержку на заданный интервал времени, мс. Поскольку к настоящему моменту времени быстродействие компьютеров существенно возросло и изменились некоторые принципы их построения, процедура Delay не всегда обеспечивает корректную задержку.
5 Модульный принцип построения программ 54 Пример 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); {задержка } No. Sound; end; End.
5 Модульный принцип построения программ 55 Пример 4. Рассмотрим пример программы, предназначенной для организации меню в текстовом режиме. Будем располагать пункты меню вертикально (т. е. будем использовать вертикальное меню). Для выбора пункта в вертикальном меню естественно использовать клавиши ↑ и ↓ (коды 72 и 80), для выполнение выбранного пункта меню – клавишу “enter” (код 13), для окончания работы с программой – клавишу “esc” (код 27). Будем использовать три окна: первое окно – окно меню, второе окно – окно сопровождение задачи, третье окно – окно подсказки. Пусть меню содержит следующие занумерованные пункты : 1. Ввод 2. Решение 3. Выдача результатов 4. Конец работы, которые размещены в первом окне, например, в следующих строках: 1 -й пункт ---- во второй строке окна, 2 -й пункт ---- в четвёртой строке окна, 3 -й пункт ---- в шестой строке окна, 4 -й пункт ---- в восьмой строке окна.
5 Модульный принцип построения программ 56 Перемещение по пунктам меню с помощью клавиш ↑↓ организуем циклически, для этого создадим процедуры 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(x 1, y 1, x 2, y 2, paper, ink: byte); {процедура изображения окна с заданными координатами (x 1, y 1) и (x 2, y 2) левого верхнего и правого нижнего углов окна, с заданным цветом фона – paper и цветом символов - ink} Begin Textcolor(ink); Textbackground(paper);
5 Модульный принцип построения программ 57 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: qввод исходных данных, qвыполнение вычислений (например, требуется вычислить V по формуле: V = U*U ) и qвыдачу результатов. Видим, что сама задача (выполнение вычислений) в этом примере тривиальна.
5 Модульный принцип построения программ 58 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 ; {case} Menu; end; {proc} Процедура Procrun после выполнения выбранного действия
5 Модульный принцип построения программ 59 Приведём текст программы: 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
5 Модульный принцип построения программ 60 Управление экраном в графическом режиме В графическом режиме программист получает возможность управлять каждой точкой (пикселем) экрана. Координаты точки определяются относительно верхнего левого угла. Каждая точка экрана при этом может высвечиваться одним из доступных цветов. Информация о цвете точки хранится в видеобуфере. Количество цветов зависит от количества бит, отведенных в видеобуфере под одну точку. Рассмотрим основные варианты. 1. « 1 точка - 1 бит» - монохромный режим: каждая точка высвечивается либо основным цветом, если в видеобуфере для точки записана 1, либо цветом фона, если в видеобуфере записан 0. 2. « 1 точка - 2 бита» - режим с двумя трехцветными палитрами: Палитра 0: Палитра 1: 01 -зеленый; 01 -светло-голубой;
5 Модульный принцип построения программ 61 3. « 1 точка - 4 бита» - режим, использующий 16 -цветную палитру. В этом режиме в отличие от предыдущих в видеобуфер заносится не цвет точки, а номер регистра палитры, в котором записан нужный цвет. Для записи цвета используется 6 бит по схеме RGBrgb, причем первые три бита кодируют 2/3 яркости цвета, а вторые три бита - оставшуюся 1/3 яркости. Так, максимально яркий красный цвет будет кодироваться двумя единицами в первом и четвертом битах: R G В r g b 1 0 0 Таким образом, каждый цвет имеет четыре градации яркости: 0, 1/3, 2/3, 1, что позволяет кодировать 4^3 = 64 варианта цвета. На экране в этом режиме одновременно может присутствовать не более 16 цветов, так как имеется всего 16 регистров палитры.
5 Модульный принцип построения программ 62 4. « 1 точка - 8 бит» - режим, использующий палитру на 256 цветов. В этом режиме используется та же идея записи кода цвета не в видеобуфер, а в регистры палитры, что и в предыдущем режиме, но используется 256 регистров палитры, в которых под запись цвета используется 18 бит. Из этих 18 бит под кодирование яркости каждого цвета используется 6 бит, обеспечивая 64 градации яркости каждого цвета. Таким образом, на экране можно одновременно видеть 256 цветов из 64^3 = 262144 возможных. Количество точек на экране, набор возможных цветов и количество страниц изображения, которые могут одновременно храниться в памяти, зависят от используемых технических средств (типа монитора и блока управления монитором - адаптера) и режимов их работы. Для каждого типа оборудования, существовавшего на момент разработки среды программирования, среда программирования Turbo Pascal 7. 0 включает свою программу
5 Модульный принцип построения программ 63 Драйвер – это специальная программа, которая управляет техническими средствами компьютера. Для всех существующих типов адаптеров фирма Borland разработала графические драйверы (они имеют расширение . bgi и находятся на диске в одноименном подкаталоге). Необходимые процедуры и функции для работы с графикой собраны стандартном модуле – Graph (более 80 процедур, функций, типов, констант). I. Процедуры и функции переключения режимов управления экраном. Модуль Graph содержит средства, обеспечивающие различные варианты переключения текстового и графического режимов. 1. Процедура Init. Graph(Var driver, mode: integer; path: string) – переключает экран в графический режим. При вызове процедуры следует объявить специальные переменные, куда занести константу драйвера и константу режима, и указать эти переменные в качестве параметров процедуры. Существует возможность запросить автоматическое
5 Модульный принцип построения программ 64 Целая переменная mode задает режим работы графического адаптера. Многие адаптеры могут работать в нескольких режимах. Например, переменная Mode в момент обращения к Init. Graph может иметь одно из следующих значений для адаптера VGA: VGALo =0; VGAMed = 1; VGAHi = 2; Параметр path должен описывать путь, определяющий местоположение файла, который содержит требуемый драйвер (обычно все драйверы находятся в подкаталоге BGI основного каталога среды Turbo Pascal). Если драйвер находится в текущем каталоге, то в качестве параметра передается пустая строка - ". Для нашего графического режима обычно значение максимальной координаты X равно 640 пикселям, а Y– 480 пикселям. 2. Функция Graph. Result: integer - возвращает номер ошибки, обнаруженной при инициализации графического режима.
Чтобы точно строить изображение на экране, Вам нужно сначала нарисовать, как это должно выглядеть на бумаге. Для этого начертите в x тетради систему координат графического режима.
5 Модульный принцип построения программ 66 Полностью инициализация графического режима может быть выполнена следующим образом: Var driver, mode, error: integer; Begin driver: =detect; {или driver: =0; } Init. Graph (driver, mode, 'd: BP BGI'); error: =Graph. Result; If error <>0 then {если обнаружены ошибки} begin Write. Ln('Ошибка инициализации графического режима', Graph. Error. MSG(error)); Halt(1); {аварийное завершение программы} end; {работа в графическом режиме}. . .
5 Модульный принцип построения программ 67 4. Процедура Close. Graph - завершает работу в графическом режиме: выгружает драйвер и восстанавливает текстовый режим. Если завершить программу, не выходя из графического режима, то нормальная работа MS DOS нарушается, так как MS DOS функционирует в текстовом режиме. 5. Процедура Restore. Crt. Mode - осуществляет временный возврат в текстовый режим с сохранением графического изображения в видеобуфере. 6. Процедура Set. Graph. Mode(mode: integer) - осуществляет возврат в графический режим после временного выхода, осуществленного процедурой Restore. Crt. Mode. 7. Функция Get. Graph. Mode: integer - возвращает номер активного графического режима. Таким образом, временный выход в текстовый режим обычно оформляется
5 Модульный принцип построения программ 68 II. Процедуры и функции управления цветом. Модуль Graph содержит специальные процедуры и функции управления цветом изображения. 1. Процедура Set. Bk. Color(Color: word) - устанавливает новый цвет фона. При инициализации графического режима видеобуфер очищается (обнуляется). При этом все точки оказываются связаны с 0 регистром палитры, который и считается регистром, хранящим цвет фона. Процедура Set. Bk. Co. Ior записывает в 0 регистр палитры цвет, указанный в параметре Color. 2. Процедура Set. Color(Color. Num: word) - объявляет цвет в регистре с номером Color. Num текущим цветом рисования. III. Процедуры и функции управления типом, толщиной линии и видом штриховки. Модуль Graph содержит средства, позволяющие управлять типом и толщиной линии, а также образцом закраски замкнутых контуров. 1. Процедура Set. Line. Style(style, pattern, thickness: word) -
5 Модульный принцип построения программ 69 Если указаны стили 0. . 3, то образец игнорируется. Если установлен стиль 4, то вид линии определяется образцом. Толщину линии можно установить одинарной и тройной, соответствующие константы выглядят следующим образом: Norm. Width=l; {нормальная толщина линии} Thick. Width=3; {тройная толщина линии } 2. Процедура Set. Fill. Style(fillstyle, color: word) - устанавливает образец fillstyle и цвет color штриховки замкнутых контуров. Для определения образцов штриховки можно использовать следующие константы: Empty. Fill=0; {без штриховки - прозрачный контур} Solid. Fill=1; {сплошная заливка} Line. Fill=2; { горизонтальные линии} Lt. Slash. Fill=3; {//// тонкие линии} Slash. Fi. U=4; {\\ - толстые линии} Bk. Slash. Fill=5; {\\ - толстые линии}
5 Модульный принцип построения программ 70 3. Процедура Flood. Fill(x, у, color: word) - закрашивает текущим образцом и цветом закраски, установленными процедурой Set. Fi. Il. Style, область, ограниченную контуром цвета color, внутри которой находится точка с координатами (х, у). Если контур не замкнут, то будет закрашен весь экран IV. Процедуры и функции рисования точек и линий, фигур Модуль Graph предоставляет программисту большой набор процедур и функций, рисующих различные примитивы (простейшие фигуры, размеры и местоположение которых определяются параметрами). 1. Процедура Put. Pixel(x, у, color: word) - рисует точку цветом, определенным color, в точке экрана с координатами (x, у). 2. Функция Get. Pixel(x, y: word): word – возвращает цвет точки с указанными координатами. 3. Функция Move. To(x, y: word): word- задает положение текущей точки, используемой в качестве исходной при рисовании
5 Модульный принцип построения программ 71 6. Функции Get. Max. X: word и Get. Max. Y: word - возвращают соответственно максимальные размеры экрана в точках для текущего режима. 7. Процедура Line(x 1, y 1, x 2, y 2: word) - рисует линию из точки (х1, у1) в точку (х2, у2). 8. Процедура Line. To(x, y: word) - рисует линию из текущей точки в точку (х, у). 9. Процедура Line. Rel(d. Xydy: word) - рисует линию из текущей точки в точку, отстоящую от текущей на dx, dy. 10. Процедура Rectangle(xl, yl, x 2, y 2: word) - рисует прямоугольник по координатам левого верхнего и правого нижнего углов. 11. Процедура Bar(xlyyl, x 2, y 2: word) - рисует заштрихованный прямоугольник с заданными координатами текущим цветом и закрашивает его текущим образцом закраски. 12. Процедура Bar 3 D(xl, yl, x 2, y 2, depth: word; top: boolean) - рисует параллелепипед, у которого: размер передней грани определяется координатами х1, у 1, х2, у2; глубина depth обычно задается равной 25% ширины, а параметр top определяет, рисовать ли верхнюю грань (да, если true, и нет,
Bar 3 D (x 1, y 1, x 2, y 2, Depth, Top), где переменные X 1, X 2, Y 1, Y 2 типа Integer, Depth типа Word, а Top типа Boolean – рисуется параллелепипед, закрашенный текущим стилем и цветом. Здесь переменные X 1, X 2, Y 1, Y 2 являются координатами левого верхнего и правого нижнего углов передней грани, Depth – ширина боковой грани (отсчитываются по горизонтали), Top – признак включения верхней грани: Top. Оn = true – верхняя грань изображается, Top. Оff = false – верхняя грань не изображается.
5 Модульный принцип построения программ 73 13. Процедура Draw. Poly(num. Points: word; var Poly. Points) - рисует ломаную линию. Первый параметр определяет количество вершин ломаной, а второй - координаты этих вершин в массиве элементов специального типа Point. Type: Type Point. Type = record x, y: word; end; . . . Например: Var MP: array[1. . 5] of Point. Type; {объявление массива координат точек} Draw. Poly(5, MP); {рисуем ломаную линию} 14. Процедура Fill. Poly (num. Points: word; Var Poly. Points) - рисует закрашенный многоугольник с указанными вершинами. 15. Процедура Circle (х, у, radius: word) - рисует окружность заданного радиуса radius с центром в точке (х, у). 16. Процедура Arc(х, у, stangle, endangle, radius: word) - рисует дугу окружности указанного радиуса radius от угла stangle до угла endangle. Углы отсчитываются от положительного направления оси абсцисс против часовой
5 Модульный принцип построения программ 74 17. Процедура Pieslice (х, у, stangle, endangle, radius: word) - рисует заштрихованный сектор или окружность (если конечный угол равен начальному). Углы отсчитываются от положительного направления оси абсцисс против часовой стрелки и указываются в градусах. 18. Процедура Ellipse (х, у, stangle, endangle, radius. X, radius. Y: word) рисует эллипс или его дугу. 19. Процедура Sector (х, у, stangle, endangle, radius. X, radius. Y: word) рисует заштрихованный эллипс или его сектор. 20. Процедура Fill. Ellipse (х, у, radius. X, radius. Y: word) - рисует заштрихованный эллипс.
Например, чтобы начертить дугу (смотри рисунок) от окружности радиуса 50 пикселей и координатами центра (100, 230) надо набрать команду: Arc (100, 230, 45, 135, 50)
5 Модульный принцип построения программ 76 V. Процедуры и функции управления текстом. Текст в графическом режиме может быть выведен процедурами Write. Ln, но при этом управление выполняется аналогично текстовому режиму. Специально для работы с текстом в графическом режиме модуль Graph предлагает следующие процедуры и функции. 1. Процедура Set. Text. Style(font, direction, charsize: word) - устанавливает текущий шрифт font, направление вывода строки direction и размер шрифта charsize. Для установки шрифта используют специальные константы: Default. Font=0; {обычный} Triplex. Font=1; {полужирн ы й} Small. Font=2; {мел кий} Sanserif. Font=3; {прямой} Gothic. Font=4; {готический} Направление вывода может быть либо горизонтальным, либо вертикальным: Horiz. Dir=0; {горизонтальное направление} Vert. Dir=l; {вертикальное направление} Размер шрифта указывается значением, на которое
5 Модульный принцип построения программ 77 2. Процедура Set. Text. Justify(goriz, vert : word) - устанавливает способ выравнивания для горизонтального goriz и вертикального vert направлений вывода. Способ выравнивания определяется относительно некоторой точки с помощью специальных констант: Left. Text=0; {точка слева от текста} Center. Text=1; {точка по центру текста при горизонтальном направлении вывода} Right. Text=2; {точка справа от текста} Bottom. Text=0; {точка под текстом} Center. Text=1; {точка по центру текста при вертикальном направлении вывода} Top. Text=2; {точка над текстом} 3. Процедура Out. Text (st: string) - выводит строку, выравнивая ее заданным способом относительно текущей точки. 4. Процедура Out. Text. XY(x, y: word; st: string) - выводит строку
5 Модульный принцип построения программ 78 Пример 1. Приведем пример программы, при выполнении которой создается интересный визуальный эффект путем заполнения экрана множеством точек различных цветов. Uses Crt, Graph; Var Driver, Mode : integer; Color: word; X, Y: word; Procedure Gr. Init; Begin Driver: = Detect; {автораспознанание драйвера} Init. Graph(Driver, Mode, ''); If Graph. Result<>0 then Begin Writeln ('Ошибка инициализации!'); Writeln ('Работа программы прервана'); Halt (1) {остановить выполнение программы с кодом завершения — 1} End; Begin Gr. Init; Color: =0; Randomize; Repeat {выберем случайным образом координаты точки} X: = Random(Get. Max. X); Y: = Random(Get. Max. Y); Put. Pixel(X, Y, Color); {вывод точки} Inc(Color); {изменение цвета} {проверим, не превышает ли значение цвета максимального значения, которое определяет функция Get. Max. Color} If Color = Get. Max. Color Then Color: =0; Until Key. Pressed; {повторять до нажатия любой клавиши} Clear. Device; Close. Graph End.
5 Модульный принцип построения программ 79 Пример 2 Будильник. program Budil; uses graph; var gr. Driver: integer; gr. Mode: integer; Begin gr. Driver: =Detect; Init. Graph(gr. Driver, gr. Mode, ''); {Смена цвета фона} Set. Bk. Color(14); {Смена цвета линии} Set. Color(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); Set. Color(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.
5 Модульный принцип построения программ 80 Пример 3. Прогрaмма рисует 5 концентрических окружностей в центре экрaнa. Program Krug 2; Uses Graph; Var Gd, Gm, rad, xc, yc: integer; begin Gd: =Detect; { функция Init. Graph должнa выполнить } { aвтоопределение типa мониторa (Gd) и его } { мaксимaльного рaзрешения (Gm)} Init. Graph(Gd, Gm, ''); { инициaлизaция грaфического режимa } if Graph. Result <> 0 then { в случaе ошибки инициaлизaции } begin Writeln('Ошибкa инициaлизaции грaфического режимa'); Writeln('В кaтaлоге прогрaммы должен присутствовaть дрaйвер egavga. bgi'); Writeln('или укaжите путь к нему в Ini. Graph(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; for rad: =1 to 5 do Circle(xc, yc, rad*20); { рисуем окружности } Readln; Close. Graph; { возврaт в текстовый режим }
5 Модульный принцип построения программ 81 Пример 4. Программа выводит десять вложенных друг в друга прямоугольников, после чего циклически меняет цвет фона. Для выхода из программы достаточно нажать на любую клавишу. Uses Graph, CRT; const NC: array [0. . 15] of String [12] = ('Black', 'Blue', 'Green', 'Cyan‘ , 'Red', 'Magenta', ' Brown', 'Light. Gray‘ , 'Dark. Gray', 'Light. Blue', 'Light. Green’, 'Light. Cyan 1, 'Light. Red', 'Light. Magenta‘ , 'Yellow', 'White'); var d, r, e, k, color, dx, dy: Integer; Begin {Инициируем графику} d : = Detect; Init. Graph(d, r, ' ') ; e : = Graph. Result; if e <> gr. OK then Write. Ln(Graph. Error. Msg(e)) else begin {Выводим текст в центре экрана} Out. Text. XY(200, Get. Max. Y div 2 , 'BACKGROUND COLOR'); dx : = Get. Max. X div 30; {Приращение длины} dy : = Get. Max. Y div 25; {Приращение высоты} for k : = 0 to 9 do{Выводим 10 прямоугольников} Rectangle(k*dx, k*dy, Get. Max. X-k*dx, Get. Max. Y-k*dy); color : = black; {Начальный цвет фона} repeat {Цикл смены фона} Set. Bk. Color(color) ; Set. Fill. Style(0, Color); Bar(345, Get. Max. Y div 2, 440 , Get. Max. Y div 2+8); Out. Text. XY(345, Get. Max. Y div 2, NC[color]); delay(1000); inc(color); if color > White then color : = Black until Key. Pressed;
5 Модульный принцип построения программ 82 Построение графика элементарных функций Пусть дана некоторая функция у = f(х). Рассмотрим прямоугольную область координатной плоскости, которая определяется значениями: x. Min ≤ x. Max; y. Min ≤ y. Max; Эту область назовём областью функции, а координаты (х, у) — мировыми координатами. Графиком функции f(х) является некоторое конечное множество точек (хk, уk), уk = f(xk), k=1, . . . , n из области функции. Выделим на экране компьютера прямоугольную область, которую будем называть окном, в котором поместим точечный график функции. В графическом режиме экран имеет другую систему координат U и V. Шаг 1. Определим исходные данные u. Min, u. Max, v. Min, v. Max, x. Min, x. Max, y. Min, у. Мах, а также количество точек n=u. Max — u. Min и шаг изменения х x. Step=(x. Max — x. Min)/n. Шаг 2. Нарисуем рамку, обрамляющую окно (это будет прямоугольник, левый верхний угол которого имеет координаты (u. Min, v. Min), а правый нижний угол — (u. Max,
Приведем программу построения графика функции y=х2 — 5 х + 6, используя следующие исходные данные: x. Min= — 2; y. Min= — 2; x. Max = 10; у. Мах=10.
5 Модульный принцип построения программ 84 uses Graph; Const u. Min=50; u. Max=600; v. Min=50; v. Max=450; {Окно графика функции} Var gr. Driver: integer; gr. Mode: integer; x. Step: real; {Шаг по х} n, k: integer; {Число точек графика} x, y, px, py: real; x. Min, y. Max, x. Max: real; {Область функции} Procedure Grlnit; Begin gr. Driver: =Detect; Init. Graph(gr. Driver, gr. Mode, ''); IF Graph. Result<>0 then begin Writeln('Ошибка инициализации!'); writeln('Работа программы прервана'); Halt(1) end
5 Модульный принцип построения программ 85 Function x. Scr(x: real): integer; {Преобразование координаты х в u} begin x. Scr: =Round((x-x. Min)*px+u. Min); end; Function y. Scr(y: real): integer; {Преобразование координаты y в v} begin y. Scr: =Round((y-y. Max)*py+v. Min); end; Function f(x: real): real; {Вид функции} begin f: =X*X-5*X+6; end;
5 Модульный принцип построения программ 86 Begin {Ввод исходных значений области функции} write('x. Min='); readln(x. Min); write('x. Max='); readln(x. Max); write('y. Min='); readln(y. Min); write('y. Max='); readln(y. Max); px: =(u. Max-u. Min)/(x. Max-x. Min); py: =-(v. Max-v. Min)/(y. Max-y. Min); Grlnit; {Построение рамки прямоугольника} Set. Line. Style(0, 0, 3); Rectangle(u. Min, v. Min, u. Max, v. Max); {Построение осей координат} Set. Line. Style(0, 0, 1); If (x. Min<0) and (x. Max>0) then Line (x. Scr(0), v. Min, x. Scr(0), v. Max); If(y. Min<0) and(y. Max>0) then Line(u. Min, y. Scr(0), u. Max, y. Scr(0));
5 Модульный принцип построения программ 87 {Определение количества точек графика} n: =u. Max-u. Min; {Вычисление шага} x. Step: =(x. Max-x. Min)/n; x: =x. Min; {Вывод графика в виде n точек желтого цвета, преобразовывая при этом х в u, у в v} for k: =1 to n do begin y: =f(x); if(y> y. Min) and (y
Вопросы?


