Скачать презентацию КЕМЕРОВСКИЙ ИНСТИТУТ (филиал) РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ ТОРГОВО-ЭКОНОМИЧЕСКИЙ УНИВЕРСИТЕТ КАФЕДРА Скачать презентацию КЕМЕРОВСКИЙ ИНСТИТУТ (филиал) РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ ТОРГОВО-ЭКОНОМИЧЕСКИЙ УНИВЕРСИТЕТ КАФЕДРА

Лекция_Информатика_12Б.ppt

  • Количество слайдов: 59

КЕМЕРОВСКИЙ ИНСТИТУТ (филиал) РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ ТОРГОВО-ЭКОНОМИЧЕСКИЙ УНИВЕРСИТЕТ КАФЕДРА ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ И ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ Информатика КЕМЕРОВСКИЙ ИНСТИТУТ (филиал) РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ ТОРГОВО-ЭКОНОМИЧЕСКИЙ УНИВЕРСИТЕТ КАФЕДРА ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ И ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ Информатика и программирование Лебедева Т. Ф.

 4 Программирование алгоритмов обработки сложных данных 33 Пример 3. Разработать программу, которая создает 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; 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 Программы, написанные Вами и оформленные в виде 5 Модульный принцип построения программ 35 Программы, написанные Вами и оформленные в виде готовых к употреблению процедур и функций, можно применять в других программах. Основная концепция такого подхода заключается в объединении своих процедур и функций в собственные библиотеки, которые могут подключаться к разрабатываемым программным продуктам. Таким образом мы подошли к понятию модуля Unit. До сих пор Вы имели дело с встроенными модулями. Теперь Вы научитесь подключать к программе библиотеки, которые были созданы Вами. Использование модулей считается прогрессивным подходом в программировании, т. к. модуль компилируется независимо от программы, а поэтому время компиляции для больших программ может существенно сократиться, что очень важно при отладке программ. Модуль (Unit) – программная единица, текст которой компилируется независимо. Модуль включает в себя определения констант, типов данных, переменных, процедур и функций, доступных для использования в вызывающих программах. Однако внутренняя структура модуля скрыта от пользователя.

 5 Модульный принцип построения программ 36 Стандартные модули Паскаля SYSTEM – подключается к 5 Модульный принцип построения программ 36 Стандартные модули Паскаля SYSTEM – подключается к любой программе автоматически без предложения Uses и содержит стандартные функции, процедуры, типы данных. DOS – библиотека организации взаимодействия с операционной системой MS DOS - содержит описание процедур и функций, обеспечивающих обращение к функциям операционной системы. . PRINTER – делает доступным вывод текстов на матричный принтер. OVERLAY – для организации памяти с перекрытиями. TURBO 3, GRAPH 3 – предназначены для версии 3 и выделены в отдельные файлы с расширением tpu, тогда как остальные модули входят в библиотеку TURBO. TPL. Поставляемые вместе с описанными модули Тиг. Ьо. З, Printer, Graph 3, Overlay устарели и практически не используются. CRT – содержит константы, функции, процедуры, типы

 5 Модульный принцип построения программ 37 Модуль можно разделить на несколько разделов: • 5 Модульный принцип построения программ 37 Модуль можно разделить на несколько разделов: • заголовок, • интерфейсная часть, • реализационная часть, • инициализационная часть. Unit <Имя модуля>; {Заголовок модуля} Interface {Интерфейсная часть} Uses <список подключаемых модулей>; Const <описания констант, определенных в данном модуле и доступных для других модулей>; Type <описания типов, определенных в данном модуле и доступных для других модулей>; Var <описания переменных, определенных в данном модуле и доступных для других модулей>; Procedure <Заголовки процедур, определенных в данном модуле и доступных для других модулей>; Function <Заголовки функций, определенных в данном модуле и доступных для других модулей>;

 5 Модульный принцип построения программ 37 Заголовок модуля мало чем отличается от заголовка 5 Модульный принцип построения программ 37 Заголовок модуля мало чем отличается от заголовка программы. В модуле вместо зарезервированного слова Program используется слово Unit. Здесь же могут присутствовать директивы компилятору, дающие общие установки для всего модуля. При выборе имени модуля необходимо учитывать одну особенность: имя модуля должно совпадать с именем дискового файла, в котором он хранится, а значит имя модуля не может состоять более, чем из 8 символов. А также не забывайте, что имя не должно совпадать с именами объектов (процедур, функций и др. ). Интерфейсная часть В этой части описываются все константы, типы данных и переменных, процедуры и функции, доступные в этом модуле для использования внешними программами. Интерфейсная часть модуля несет всю информацию, необходимую для использования процедур и функций, определенных в модуле. Указав в операторе Uses имена уже существующих готовых модулей, можно сделать их доступными для использования. Аналогично здесь описываются доступные извне и необходимые для описанных процедур и функций определения типов данных, констант и переменных. Все процедуры и функции, доступные для общего пользования и определенные в данном модуле, должны быть описаны в интерфейсной части только своей строкой-заголовком с указанием

 5 Модульный принцип построения программ 38 Пример 1 Unit cmplx; interface type comp=record 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<описания 5 Модульный принцип построения программ 38 Implementatoin {Реализационная часть} Uses<список подключаемых модулей>; Const<описания констант, определенных в данном модуле и недоступных для других модулей>; Type <описания типов, определенных в данном модуле и недоступных для других модулей>; Var <описания переменных, определенных в данном модуле и недоступных для других модулей>; Procedure <реализация процедур, определенных в данном модуле и доступных для других модулей>; Function <реализация функций, определенных в данном модуле и доступных для других модулей>; Procedure <реализация процедур, определенных в данном модуле и недоступных для других модулей>; Function <реализация функций, определенных в данном модуле и недоступных для других модулей>; {Инициализационная часть} Begin <Слово Begin необходимо, если имеются операторы в следующей части программы> <часть модуля, исполняемая при его подключении (необязательна)> End.

 5 Модульный принцип построения программ 39 Реализационная часть – это часть, в которой 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 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 Разработать модуль, содержащий подпрограмму суммирования 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 Программа использует из модуля два ресурса: описание 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 - все упоминаемые 5 Модульный принцип построения программ 43 Компиляция модулей Режим Compile - все упоминаемые в предложении Uses модули должны быть откомпилированы и помещены в файлы вида <имя>. tpu Режим Make - система проверяет наличие tpu-файла для каждого объявленного в предложении Uses модуля. Если этого файла нет, то система пытается отыскать файл <имя>. pas, найдя его компилирует. Режим Build - система сразу ищет файлы <имя>. pas и компилирует.

 5 Модульный принцип построения программ 44 1. Модуль CRT Библиотека модуля CRT содержит 5 Модульный принцип построения программ 44 1. Модуль CRT Библиотека модуля CRT содержит константы, типы данных, процедуры и функции, предназначенные для: 1. Управления текстовым экраном а) формирования окна; б) управления положением курсора; в) определения цветом символов и фона 2. Управления клавиатурой 3. Управления динамиком. В текстовом режиме программист имеет доступ ко всему экрану. Экран при этом поделен на строки и столбцы. На пересечении строки и столбца находится область, в которою возможен вывод одного знака. Такие области получили название знакоместо. Обычно программа на Паскале использует тот же текстовый режим, что и MS DOS, т. е. режим, при котором на экране выделяется 25 строк и 80 столбцов или 43 строки и 80 столбцов.

 5 Модульный принцип построения программ 45 Управления текстовым экраном Каждому знакоместу экрана в 5 Модульный принцип построения программ 45 Управления текстовым экраном Каждому знакоместу экрана в специальной памяти, называемой видеобуфером, соответствует 2 байта, в которых хранится информация о высвечиваемом символе: q код символа по таблице ASCII, которому соответствует матрица изображения q символа в специальной таблице знакогенератора; q байт-атрибут, в котором хранится информация о цвеет символа и цвете фона данного знакоместа. Каждая точка высвечивается цветом символа или цветом фона знакоместа, которому она принадлежит. Информация о знакоместе выбирается из видеобуфера. Таким образом, если изменить информацию в видеобуфере, то изменится и изображение на экране. Цвета в текстовом режиме формируются следующим образом: три бита управляют включением и выключением трех основных

 5 Модульный принцип построения программ 46 Управление экраном с помощью ресурсов модуля CRT 5 Модульный принцип построения программ 46 Управление экраном с помощью ресурсов модуля CRT базируется на понятии «окно» . Окно - часть экрана прямоугольной формы. Верхний левый угол экрана соответствует координате (1, 1). Минимальный размер текстового окна - один столбец на одну строку. В режиме на 25 строк по умолчанию определено окно (1, 1, 80, 25), а в режиме на 43 строки - окно (1, 1, 80, 43), соответствующие всему экрану. В момент получения программой управления весь экран считается окном 25 x 80 знакомест (или 43 х80). Программист может определять на экране новые окна и управлять как цветом символов и фона окна, так и размещением информации в окне. Вывод информации в текстовом режиме осуществляется стандартными процедурами Write. Ln текущими цветом символа и цветом фона.

 5 Модульный принцип построения программ 47 При выводе четыре символа интерпретируются особым образом: 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 После объявления окна курсор устанавливается в верхний 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 Модульный принцип построения программ 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) – устанавливает нужный 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 зависят 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: 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 также содержит 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. Разработать программу проигрывания основной октавы. 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. Рассмотрим пример программы, предназначенной для 5 Модульный принцип построения программ 55 Пример 4. Рассмотрим пример программы, предназначенной для организации меню в текстовом режиме. Будем располагать пункты меню вертикально (т. е. будем использовать вертикальное меню). Для выбора пункта в вертикальном меню естественно использовать клавиши ↑ и ↓ (коды 72 и 80), для выполнение выбранного пункта меню – клавишу “enter” (код 13), для окончания работы с программой – клавишу “esc” (код 27). Будем использовать три окна: первое окно – окно меню, второе окно – окно сопровождение задачи, третье окно – окно подсказки. Пусть меню содержит следующие занумерованные пункты : 1. Ввод 2. Решение 3. Выдача результатов 4. Конец работы, которые размещены в первом окне, например, в следующих строках: 1 -й пункт ---- во второй строке окна, 2 -й пункт ---- в четвёртой строке окна, 3 -й пункт ---- в шестой строке окна, 4 -й пункт ---- в восьмой строке окна.

 5 Модульный принцип построения программ 56 Перемещение по пунктам меню с помощью клавиш 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, 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 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 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 Управление экраном в графическом режиме В графическом 5 Модульный принцип построения программ 60 Управление экраном в графическом режиме В графическом режиме программист получает возможность управлять каждой точкой (пикселем) экрана. Координаты точки определяются относительно верхнего левого угла. Каждая точка экрана при этом может высвечиваться одним из доступных цветов. Информация о цвете точки хранится в видеобуфере. Количество цветов зависит от количества бит, отведенных в видеобуфере под одну точку. Рассмотрим основные варианты. 1. « 1 точка - 1 бит» - монохромный режим: каждая точка высвечивается либо основным цветом, если в видеобуфере для точки записана 1, либо цветом фона, если в видеобуфере записан 0. 2. « 1 точка - 2 бита» - режим с двумя трехцветными палитрами: Палитра 0: Палитра 1: 01 -зеленый; 01 -светло-голубой;

 5 Модульный принцип построения программ 61 3. « 1 точка - 4 бита» 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 бит» 5 Модульный принцип построения программ 62 4. « 1 точка - 8 бит» - режим, использующий палитру на 256 цветов. В этом режиме используется та же идея записи кода цвета не в видеобуфер, а в регистры палитры, что и в предыдущем режиме, но используется 256 регистров палитры, в которых под запись цвета используется 18 бит. Из этих 18 бит под кодирование яркости каждого цвета используется 6 бит, обеспечивая 64 градации яркости каждого цвета. Таким образом, на экране можно одновременно видеть 256 цветов из 64^3 = 262144 возможных. Количество точек на экране, набор возможных цветов и количество страниц изображения, которые могут одновременно храниться в памяти, зависят от используемых технических средств (типа монитора и блока управления монитором - адаптера) и режимов их работы. Для каждого типа оборудования, существовавшего на момент разработки среды программирования, среда программирования Turbo Pascal 7. 0 включает свою программу

 5 Модульный принцип построения программ 63 Драйвер – это специальная программа, которая управляет 5 Модульный принцип построения программ 63 Драйвер – это специальная программа, которая управляет техническими средствами компьютера. Для всех существующих типов адаптеров фирма Borland разработала графические драйверы (они имеют расширение . bgi и находятся на диске в одноименном подкаталоге). Необходимые процедуры и функции для работы с графикой собраны стандартном модуле – Graph (более 80 процедур, функций, типов, констант). I. Процедуры и функции переключения режимов управления экраном. Модуль Graph содержит средства, обеспечивающие различные варианты переключения текстового и графического режимов. 1. Процедура Init. Graph(Var driver, mode: integer; path: string) – переключает экран в графический режим. При вызове процедуры следует объявить специальные переменные, куда занести константу драйвера и константу режима, и указать эти переменные в качестве параметров процедуры. Существует возможность запросить автоматическое

 5 Модульный принцип построения программ 64 Целая переменная mode задает режим работы графического 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 Полностью инициализация графического режима может быть выполнена 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 - завершает работу 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. Процедуры и функции управления цветом. Модуль 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, то 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) 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 и 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), где 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 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, 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 пикселей и координатами центра Например, чтобы начертить дугу (смотри рисунок) от окружности радиуса 50 пикселей и координатами центра (100, 230) надо набрать команду: Arc (100, 230, 45, 135, 50)

 5 Модульный принцип построения программ 76 V. Процедуры и функции управления текстом. Текст 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 : 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. Приведем пример программы, при выполнении 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; 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 концентрических окружностей 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. Программа выводит десять вложенных друг 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 Построение графика элементарных функций Пусть дана некоторая 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, используя следующие Приведем программу построения графика функции 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; 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; {Преобразование координаты 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. 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. 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

Вопросы? Вопросы?