программирование тусур. Программирование учебное пособие. Учебное пособие Томск Эль Контент
Скачать 0.93 Mb.
|
Глава 9. Модули и графика SetTextStyle(Font:word;Direction:word;CharSize:word); где Font — выбранный шрифт, Direction — направление (горизонтальное или вертикальное), CharSize — размер выводимых символов. Возможные значения первых двух параметров представлены в табл. 9.5 и табл. 9.6. При организации вертикального вывода необходимо учитывать, что если программист не установит точку начала вывода с помощью MoveTo, то текст начинается с нижней строки экрана и продолжается вверх. Величину выводимых символов можно устанавли- вать с помощью коэффициента CharSize. Если CharSize = 1, то символ стро- ится в матрице 8 ×8, если CharSize = 2, то используется матрица 16×16 и т. д. до 10-кратного увеличения. Таблица 9.5 – Шрифты Константа Значение Описание DefaultFont 0 8 ×8 — битовый шрифт TriplexFont 1 Штриховые шрифты SmallFont 2 Малый шрифт SansSerifFont 3 Сансериф GothicFont 4 Готический Таблица 9.6 – Константы ориентации Константа Значение Описание HoizDir 0 Слева направо VertDir 1 Снизу вверх 9.2.4 Построение графических фигур Для построения прямоугольных фигур имеется несколько процедур. Первая из них — процедура вычерчивания прямоугольника: Rectangle(X1,Y1,X2,Y2: integer); где X1, Y1 — координаты левого верхнего угла, X2, Y2 — координаты правого ниж- него угла прямоугольника. Это очень полезная процедура, с ее помощью, в част- ности, можно легко построить любую диаграмму для визуального анализа данных. Область внутри прямоугольника не закрашена и совпадает по цвету с фоном. Пример Фрагмент программы, который выводит на экран 100 вычерченных разным цветом динамически меняющихся по высоте прямоугольников: for i:=1 to 100 do begin Random(16); {установка цвета} Rectangle(200,Random(300),250,300); {i-ый прямоугольник} 9.2 Графическое программирование 175 Delay(50);{задержка} ClearDevice {очистка экрана} end; Более эффектные для восприятия прямоугольники можно строить с помощью процедуры Bar(x1,y1,x2,y2: integer); которая рисует закрашенный столбец. Цвет закраски устанавливается с помощью SetFillStyle. Пример SetFillStyle(1,3); Bar(10,10,50,100); Функция SetFillStyle(pattern:word;color:word) определяет стиль за- полнения. Значения pattern приведены в табл. 9.7 и могут быть представлены кон- стантой или цифрой, color берется из шкалы цветов. Таблица 9.7 – Стиль заполнения Константа Значение Стиль EmptyFill 0 Заполнение цветом фона SolidFill 1 Однородное заполнение цветом LineFill 2 Заполнение символами «- -», цвет — color LtSlashFill 3 Заполнение символами «//» нормальной толщины, цвет — color SlashFill 4 Заполнение символами «//» удвоенной толщины, цвет — color BkSlashFill 5 Заполнение символами « //» удвоенной толщины, цвет — color LtBkSlashFill 6 Заполнение символами « //» нормальной толщины, цвет — color HatchFill 7 Заполнение вертикально-горизонтальной штриховкой тонкими линиями XhatchFill 8 Заполнение штриховкой крест-накрест по диагонали «редкими» тонкими линиями, цвет — color InterLeaveFill 9 Заполнение штриховкой крест-накрест по диагонали «частыми» тонкими линиями, цвет — color продолжение на следующей странице 176 Глава 9. Модули и графика Таблица 9.7 — Продолжение Константа Значение Стиль WideDotFill 10 Заполнение «редкими» точками CloseDotFill 11 Заполнение «частыми» точками UserFill 12 Заполнение по определенной пользователем маске заполнения, цвет — color Еще одна весьма эффектная процедура: Bar3D(x1,y1,x2,y2:integer; Depth: word; Top: boolean) вычерчивает трехмерный закрашенный прямоугольник. При этом используется тип и цвет закраски, установленные с помощью процедуры SetFilllStyle. Пара- метр Depth представляет собой число пикселов, задающих глубину трехмерного контура. Чаще всего его значение равно четверти ширины прямоугольника: Depth := (x2 - x1) div 4; параметр Top определяет, строить над прямоугольником вершину (Top = true) или нет (Top = false). Процедура DrawPoly позволяет строить любые многоугольники линией теку- щего цвета, стиля и толщины. Она имеет следующий формат: DrawPoly(numPoints: word; var PolyPoints); Параметр PolyPoints является нетипизированным параметром, который со- держит координаты каждого пересечения в многоугольнике. Параметр NumPoints задает число координат в PolyPoints. Необходимо помнить, что для вычерчива- ния замкнутой фигуры с n вершинами нужно передать при обращении к процедуре DrawPoly n + 1 координату, где координата вершины с номером n будет равна координате вершины с номером 1. Проиллюстрируем сказанное следующей про- граммой: {Программа вычерчивает в центре экрана треугольник красной линией} user Crt,Graph; var DriverVar, ModeVar :integer; pp : array[1..4] of PointType; {встроенный тип PointType определен как record x,y:integer end} xM, yM, xMaxD4, yMaxD4: word; begin DriverVar := Detect; InitGraph(DriverVar,ModeVar, ''); xM := GetMaxX; yM := GetMaxY; xMaxD4 := xM div 4; yMaxD4 := yM div 4; {определение координат вершин} pp[1].x := xMaxD4; pp[1].y := yMaxD4; pp[2].x := xM — xMaxD4; pp[2].y := xMaxD4; pp[3].x := xM div 2; 9.2 Графическое программирование 177 pp[3].y := yM — yMaxD4; pp[4] := pp[1]; SetColor(LightRed); {цвет для вычерчивания} DrawPoly(4,pp);{4 — количество пересечений + 1} Readln; CloseGraph end. В результате работы программы на экране появится красный треугольник на черном фоне (рис. 9.1). Рис. 9.1 – Треугольник Возникает естественное желание его закрасить, т. е. изменить фон внутри тре- угольника. Это можно сделать с помощью процедуры FillPoly(NumPoints: word; var PolyPoints); Значения параметров те же, что и в процедуре DrayPoly. Действие тоже аналогично, но фон внутри многоугольника закрашивается. В качестве примера нарисуем в левой верхней части экрана четырехугольную звезду зеленого цвета (рис. 9.2): {программа вычерчивает четырехугольную звезду} user Crt, Graph; const star: array[1..18] of integer = (75,0, 100,50, 150,75, 100,100, 75,150, 50,100, 0,75, 50,50, 75,0); var DriverVar, ModeVar: integer; begin DriverVar := Detect; InitGraph(DriverVar, ModeVar, ''); SetFillStyle(1,Green); FillPoly(9,Star); {9 — количество пересечений + 1} Readln; CloseGraph end. Для задания углов используется полярная система координат (рис. 9.3). 178 Глава 9. Модули и графика Рис. 9.2 – Четырехугольная звезда Рис. 9.3 – Полярная система координат Процедура вычерчивания окружности текущим цветом имеет следующий формат: Circle(x,y, Radius: word); где x и y — центр окружности, а Radius — ее радиус. Два оператора обеспечивают вывод ярко-зеленой окружности с радиусом 50 пик- селей и центром в точке 450, 100: SetColor(LightGreen); Circle(450,100,50); В ряде случаев, в частности для создания псевдообъемных фигур, используют- ся дуги. Их можно вычертить с помощью процедуры Arc(x,y: integer; StAngle, EndAngle, Radius: word); где x, y — центр окружности, StAngle и EndAngle — начальный и конечный уг- лы, Radius — радиус. Цвет для вычерчивания устанавливается процедурой SetColor . Очевидно, что если StAngle = 0 и EndAngle = 360, то вычерчи- вается полная окружность. Для построения эллиптических дуг предназначена процедура Ellipse (X,Y: integer; StAngle, EndAngle: word; xR, yR: word); где x, y — центр эллипса в дисплейных координатах, xR и yR — горизонтальная и вертикальная оси. Дуга эллипса вычерчивается от начального угла StAngle до конечного угла EndAngle текущим цветом. Значения StAngle = 0 и End- Angle = 360 приведут к вычерчиванию полного эллипса. 9.2 Графическое программирование 179 Пример Эллипс, нарисованный ярко-голубым цветом: SetColor(LightCyan); Ellipse(100,100,0,360,30,50); Обратите внимание, что фон внутри эллипса совпадает с фоном экрана. Что- бы создать закрашенный эллипс (в частности, закрашенный круг), используется специальная процедура FillEllipse(x,y: integer; xR,yR: word); где x, y — центр эллипса в дисплейных координатах, xR и yR — горизонтальная и вертикальная оси. Заполнитель устанавливается процедурой SetFillStyle. SetFillStyle(wideDotFill, Green); {установка стиля заполнения} SetColor(LightRed); {цвет для вычерчивания эллипса} FillEllipse(300,150,50,50); В этом фрагменте эллипс вычерчивается ярко-красной кривой и заполняется редкими точками зеленого цвета. 9.2.5 Простые анимационные алгоритмы Программы, которые строят, перемещают, изменяют форму различных изобра- жений на экране в соответствии с заранее разработанным сценарием, называются анимационными. Самый простой метод анимации заключается в следующем. Сначала выводится рисунок любым цветом. Через определенный период времени (используйте проце- дуру Delay из модуля Crt) тот же рисунок формируется цветом, совпадающим с фоном, что вызывает исчезновение изображения. Затем рисунок выводится в дру- гом месте тем же цветом, что и первая картинка, и т. д. Движение элемента изображения (спрайта) в этом алгоритме вызывает мель- кание экрана и носит несколько прерывистый характер. Избавиться от мелькания и заставить элемент изображения двигаться более плавно можно, если организовать вывод на разные страницы видеопамяти. В этом случае применяется следующий алгоритм: • вывести изображение на страницу 0 (она видима по умолчанию); • сформировать новое изображение на невидимой странице 1; • сделать видимой страницу 1; • сформировать новое изображение на невидимой странице 0 и т. д. 180 Глава 9. Модули и графика Контрольные вопросы по главе 9 1. Каковы координаты четырех угловых пикселей и центрального пикселя экрана? 2. Как нарисовать и закрасить круг с заданными центром и радиусом? 3. Создайте на экране N случайно размещенных кругов, каждый из которых имеет случайный радиус. 4. Создайте на экране случайно размещенные круги со случайными радиуса- ми. Программа перестает рисовать круги, когда вы нажмете «Enter». 5. Создайте на экране круг, окраска которого циклически меняется, перебирая все возможные цвета в графическом режиме VGA. Рекомендуемая литература к главе 9 [1] Немнюгин С. А. Turbo Pascal / С. А. Немнюгин. — СПб. : Питер, 2001. — 496 г. [2] Фаронов В. В. Турбо Паскаль 7.0: Практика программирования / В. В. Фа- ронов. — М. : Нолидж, 2000. — 416 с. ЗАКЛЮЧЕНИЕ Для того чтобы что-то понять — надо это уже знать. . . Те виды информации, для которых у нас нет готовых когнитивных схем, мы просто не воспринимаем. . . В пустую голову ничего поме- стить нельзя. М. Холодная Психология интеллекта: парадоксы исследования Вы научились основам программирования, даже менее того, основам програм- мирования на Паскале. И даже если Ваши программы при создании не требовали от Вас значительных усилий — знайте, что Вы еще новичок в программировании. Чтобы стать экспертом, Вам предстоит написать множество различных про- грамм на различных языках программирования. Программирование требует значи- тельных интеллектуальных усилий. И императивное (или процедурное) програм- мирование на таких языках, как Паскаль и C++, требует мыслить в компьютерных терминах. Со временем Вы познакомитесь с другими парадигмами программиро- вания, для которых достаточно мышления в терминах задачи. Программировать станет легче, но никогда творческий акт, лежащий в основе программирования, не удастся передать самим компьютерам. И поэтому, возможно, ваше умение и опыт будут всегда востребованы! ГЛОССАРИЙ Аксиоматическая семантика — логические формулы, которые определяют («ак- сиоматизируют») определенные свойства программ. Алгоритм — свод конечного числа правил, задающих последовательность вы- полнения операций при решении той или иной специфической задачи. Алфавит — набор основных символов, «букв алфавита», никакие другие сим- волы в предложениях языка не допускаются. Булевский (логический) тип используется для представлений значений двузнач- ной логики — всего два значения: истина, ложь. Вещественные типы обозначают множества вещественных чисел в различных диапазонах. Вызов подпрограммы — выполнение действий, заданных в подпрограмме, мо- жет быть произведен в некоторой точке программы посредством указания имени этой подпрограммы. Выражение — понятие языка программирования — представляет собой формаль- ное правило для вычисления некоторого (нового) значения. Вычислительная структура состоит из одного или нескольких типов и неко- торых основных (элементарных, базовых) операций над этими типами, каждая с результатом одного из этих типов. Глобальные объекты — константы, типы, переменные и т. п., описанные в про- грамме, но не являющиеся локальными. Динамическое распределение памяти, т. е. выделение памяти для отдельных элементов данных в тот момент, когда они появляются во время выполнения про- граммы, а не во время трансляции. Записи — составной тип; есть абстракция конечной последовательности эле- ментов, но в отличие от массивов объединяет значения различных типов. Интерпретатор — транслятор, который преобразует лишь небольшой фраг- мент исходной программы в машинные команды, а затем, дождавшись, когда ком- пьютер их выполнит, переходит к обработке следующего фрагмента. Интерпретация — переход (часто только воображаемый, мыслимый) от пред- ставления к абстрактной информации, т. е. к значению представления. Глоссарий 183 Информатика — это наука и техника, связанные с машинной обработкой, хра- нением и передачей информации. Информация — называют абстрактное содержание («содержательное значение», «семантика») какого-либо высказывания, описания, указания, сообщения или из- вестия. Внешняя форма сообщения — представление. Компилятор — транслятор, который читает всю программу целиком и делает ее перевод на машинный язык и помещает команды в память компьютера. После того, как программа откомпилирована, исходная программа больше не нужна. Конкатенация (сцепление) — операция со строками; применяется для соедине- ния (сцепления) нескольких строк в одну результирующую строку. Константа — понятие алгоритмического языка, имеет имя (обозначение) и зна- чение (элемент данных), но в отличие от переменной значение не может измениться. Локальные объекты — константы, типы, переменные и т. п., описанные в под- программе. Массив — составной тип; каждое значение массива состоит из фиксированного числа элементов одного и того же базового типа (т. е. значение содержит фиксиро- ванное число однотипных компонент). Множество — составной тип; возможными значениями переменных множе- ственного типа являются все подмножества значений базового типа. Модули — независимо хранимые и разрабатываемые, независимо компилируе- мые и тестируемые программные единицы со строго определенными интерфейса- ми, которые могут объединяться с главной программой. Ограниченный тип определяется сужением (ограничением) допустимого диа- пазона значений некоторого стандартного дискретного типа. Задается минимальное и максимальное значение диапазона. Оператор — фрагмент программы: представляет законченную фразу языка и оп- ределяет некоторый вполне законченный этап обработки данных. Оператор ввода (чтения) — оператор, предназначенный для ввода в программу входных данных; Оператор вывода (записи) — оператор, предназначенный для вывода из про- граммы результатов работы. Оператор присваивания — оператор, предназначенный для изменения значений переменных. Оператор цикла с предусловием (цикл while) используется в случае, когда цик- лическими действиями управляет логическое условие и, как правило, к моменту выполнения цикла не ясно, сколько нужно повторить циклические действия. Операционная семантика — описание последствий отдельных шагов вычисле- ний, которые имеют место при выполнении программы. Отладка — деятельность, направленная на установление точной природы из- вестной ошибки в программе, а затем на исправление этой ошибки. 184 Глоссарий Параметр-значение — формальный параметр подпрограммы; передает значе- ние внутрь подпрограммы. Вычисленное значение внутри подпрограммы невоз- можно с помощью параметра-значения передать наружу. Параметр-переменная — формальный параметр подпрограммы; передает зна- чение внутрь подпрограммы, и вычисленное значение внутри подпрограммы с по- мощью параметра-переменной передается наружу. Переменная — понятие алгоритмического языка, имеет имя (обозначение) и зна- чение (элемент данных). Перечислимый тип — тип, который задается путем явного перечисления всех его возможных значений, причем каждое такое значение будет определяться только именем. Подпрограмма — обособленная именованная часть программы со своим соб- ственным локальным контекстом имен. Программа— запись алгоритма на языке программирования. Процедура — подпрограмма; служит для задания совокупности действий, на- правленных на изменение внешней по отношению к подпрограмме программной обстановки и, как следствие, определение новых значений переменных в програм- ме. Вызов процедуры играет роль оператора. Пустой оператор — не имеет «графического» начертания, и не производит ни- каких действий. Необходимость введения такого понятия диктуется в первую оче- редь синтаксическими причинами. Рекурсия — организация повторения выполнения фрагмента программы, равно- сильная циклам. Семантические правила определяют свойства данного понятия алгоритмиче- ского языка в зависимости от свойств используемых в них понятий. Символьный (литерный) тип — значениями этого типа являются элементы на- бора литер, определяемого реализацией языка. Синтаксис — система правил, определяющая допустимые конструкции из букв алфавита. Синтаксис отвечает на вопрос: является ли последовательность символов программой на данном языке или нет? Синтаксические правила показывают, как образуется данное понятие алгорит- мического языка из других понятий и (или) букв алфавита. Списки — рекурсивные структуры данных; список может быть либо пустым, либо не пустым. В последнем случае он имеет голову (произвольный элемент данных) и хвост, который в свою очередь является списком. Ссылочный тип — тип, применяемый при динамическом распределении памя- ти. Значение ссылочного типа (неформально) — адрес в памяти, где располагается конкретное значение базового типа. Старшинство (приоритеты) операций — задает очередность выполнения опе- раций, указанных в выражении. Глоссарий 185 Строковый тип данных определяет множество символьных цепочек произ- вольной длины от нуля символов до заданного их числа. Структурное программирование — программирование, ориентированное на об- щение с людьми, а не с машиной. Тестирование — процесс выполнения программы с намерением найти ошибки. Технология программирования — это совокупность методов и средств разработ- ки (написания) программ и порядок применения этих методов и средств. Тип переменной — множество значений, которые может принимать переменная, и, как следствие, множество операций, допустимых над данной переменной. Транслятор — программа, переводящая с алгоритмического языка на машин- ный язык. Условный оператор применяется для задания разветвления в программе, т. е. выбора действий в зависимости от истинности или ложности какого-либо условия. Файловый тип — составной тип; файл интерпретируется как потенциально бес- конечный список значений одного и того же (базового) типа. Функциональная семантика — описание функций программы, т. е. установле- ние отношения между входными и выходными данными (экстенсиональное или наблюдаемое отношение). Функция — подпрограмма; служит для определения алгоритма вычисления но- вого значения некоторого простого типа, и вызов функции должен быть операндом в выражении. Целые типы обозначают множества целых чисел в различных диапазонах. Цикл с параметром — оператор, позволяющий задать автоматическое измене- ние значения некоторой переменной и использовать эти значения в последователь- ных итерациях. Язык металингвистических формул Бэкуса-Наура (язык БНФ) позволяет опи- сывать формальные языки (в том числе и языки программирования) в виде неко- торых формул. Учебное издание Зюзьков Валентин Михайлович ПРОГРАММИРОВАНИЕ Учебное пособие Корректор Осипова Е. А. Компьютерная верстка Насынова Н. Е. Подписано в печать 05.12.13. Формат 60х84/8. Усл. печ. л. 21,86. Тираж 300 экз. Заказ Издано в ООО «Эль Контент» 634029, г. Томск, ул. Кузнецова д. 11 оф. 17 Отпечатано в Томском государственном университете систем управления и радиоэлектроники. 634050, г. Томск, пр. Ленина, 40 Тел. (3822) 533018. |