II. Процедуры и функции управления цветом. Модуль Graph содержит
специальные процедуры и функции управления цветом изображения.
1. Процедура SetBkColor(Color:word) - устанавливает новый цвет фона.
При инициализации графического режима видеобуфер очищается (обнуляется). При этом все точки оказываются связаны с 0 регистром палитры, который и считается регистром, хранящим цвет фона. Процедура SetBkCoIor записывает в 0 регистр палитры цвет, указанный в параметре Color.
2. Процедура SetColor(ColorNum:word) - объявляет цвет в регистре с
номером ColorNum текущим цветом рисования.
III. Процедуры и функции управления типом, толщиной линии и видом штриховки. Модуль Graph содержит средства, позволяющие управлять типом и толщиной линии, а также образцом закраски замкнутых контуров.
1. Процедура SetLineStyle(style, pattern, thickness: word) - устанавливает
стиль style или образец pattern линии и ее толщину thickness.
Для установки стиля используют следующие константы:
SolidLn=0; {сплошная} DottedLn=l; {точечная}
CenterLn=2; {штрихпунктирная} DashedLn=3; {пунктирная}
UserBitLn=4; {определенная программистом в образце}
Если указаны стили 0..3, то образец игнорируется. Если установлен
стиль 4, то вид линии определяется образцом.
Толщину линии можно установить одинарной и тройной, соответствующие
константы выглядят следующим образом:
NormWidth=l; {нормальная толщина линии}
ThickWidth=3; {тройная толщина линии }
2. Процедура SetFillStyle(fillstyle, color: word) - устанавливает образец
fillstyle и цвет color штриховки замкнутых контуров. Для определения образцов штриховки можно использовать следующие константы:
EmptyFill=0; {без штриховки - прозрачный контур}
SolidFill=1; {сплошная заливка}
LineFill=2; { горизонтальные линии}
LtSlashFill=3; {//// тонкие линии}
SlashFiU=4; {\\\\ - толстые линии}
BkSlashFill=5; {\\\\ - толстые линии}
LtBkSlashFill=6; {////- тонкие линии}
HatchFill=7; {-f+++ - клетка горизонтальная}
и т.д.
3. Процедура FloodFill(x, у, color: word) - закрашивает текущим образцом
и цветом закраски, установленными процедурой SetFiIlStyle, область,
ограниченную контуром цвета color, внутри которой находится точка с координатами (х,у). Если контур не замкнут, то будет закрашен весь экран
IV. Процедуры и функции рисования точек и линий, фигур
Модуль Graph предоставляет программисту большой набор процедур и функций, рисующих различные примитивы (простейшие фигуры, размеры и местоположение которых определяются параметрами).
1. Процедура PutPixel(x, у, color: word) - рисует точку цветом, определенным color, в точке экрана с координатами (x, у).
2. Функция GetPixel(x,y:word):word – возвращает цвет точки с указанными координатами.
3. Функция MoveTo(x,y:word):word- задает положение текущей точки -
точки, используемой в качестве исходной при рисовании линий или выводе
текста.
4. Процедура MoveRel(dx,dy:word) - задает положение текущей точки
относительно ее предыдущего положения.
5. Функции GetX:word и GetY:word- возвращают соответственно координаты x и у текущей точки.
6. Функции GetMaxX:word и GetMaxY:word - возвращают соответственно
максимальные размеры экрана в точках для текущего режима.
7. Процедура Line(x1,y1,x2,y2:word) - рисует линию из точки (х1,у1) в точку (х2,у2).
8. Процедура LineTo(x,y:word) - рисует линию из текущей точки в точку (х,у).
9. Процедура LineRel(dx,dy:word) - рисует линию из текущей точки в точку, отстоящую от текущей на dx, dy.
10. Процедура Rectangle(xl,yl,x2,y2:word) - рисует прямоугольник по координатам левого верхнего и правого нижнего углов.
11. Процедура Bar(xl,yl,x2,y2:word) - рисует заштрихованный прямоугольник с заданными координатами текущим цветом и закрашивает его текущим образцом закраски.
12. Процедура Bar3D(xl,yl,x2,y2, depth:word; top: boolean) - рисует параллелепипед, у которого: размер передней грани определяется координатами х1, у 1, х2, у2; глубина depth обычно задается равной 25% ширины, а параметр top определяет, рисовать ли верхнюю грань (да, если true, и нет, если false). Верхнюю грань не рисуют, если необходимо изобразить несколько параллелепипедов, стоящих друг на друге. Передняя грань закрашивается текущим образцом и цветом закраски.
13. Процедура DrawPoly(numPoints:word; var PolyPoints) - рисует ломаную линию. Первый параметр определяет количество вершин ломаной, а второй - координаты этих вершин в массиве элементов специального типа PointType:
Type PointType = record
x,y:word;
end;...
Например:
Var MP:array[1..5] of PointType; {объявление массива координат точек}
DrawPoly(5,MP); {рисуем ломаную линию}
14. Процедура FillPoly (numPoints:word; Var PolyPoints) - рисует закрашенный многоугольник с указанными вершинами.
15. Процедура Circle (х, у, radius:word) - рисует окружность заданного
радиуса radius с центром в точке (х, у).
16. Процедура Arc(х,у, stangle, endangle, radius: word) - рисует дугу окружности указанного радиуса radius от угла stangle до угла endangle. Углы отсчитываются от положительного направления оси абсцисс против часовой стрелки и указываются в градусах.
17. Процедура Pieslice (х, у, stangle, endangle, radius:word) - рисует заштрихованный сектор или окружность (если конечный угол равен начальному). Углы отсчитываются от положительного направления оси абсцисс против часовой стрелки и указываются в градусах.
18. Процедура Ellipse (х, у, stangle, endangle, radiusX, radiusY: word) -
рисует эллипс или его дугу.
19. Процедура Sector (х, у, stangle, endangle, radiusX, radiusY: word) -
рисует заштрихованный эллипс или его сектор.
20. Процедура FillEllipse (х, у, radiusX, radiusY: word) - рисует заштрихованный эллипс.
Процедуры и функции управления текстом. Текст в графическом режиме может быть выведен процедурами Write и WriteLn, но при этом управление выполняется аналогично текстовому режиму. Специально для работы с текстом в графическом режиме модуль Graph предлагает следующие процедуры и функции.
1. Процедура SetTextStyle(font,direction,charsize:word) - устанавливает
текущий шрифт font, направление вывода строки direction и размер шрифта charsize.
Для установки шрифта используют специальные константы:
DefaultFont=0; {обычный}
TriplexFont=1; {полужирн ы й}
SmallFont=2; {мел кий}
SanserifFont=3; {прямой}
GothicFont=4; {готический}
Направление вывода может быть либо горизонтальным, либо вертикальным: HorizDir=0; {горизонтальное направление}
VertDir=l; {вертикальное направление}
Размер шрифта указывается значением, на которое необходимо умножить
исходный размер шрифта (8x8 точек). Таким образом, шрифт можно
увеличивать в целое число раз.
2. Процедура SetTextJustify(goriz, vert :word) - устанавливает способ выравнивания для горизонтального goriz и вертикального vert направлений вывода. Способ выравнивания определяется относительно некоторой точки с помощью специальных констант:
LeftText=0; {точка слева от текста}
CenterText=1; {точка по центру текста при горизонтальном направлении
вывода}
RightText=2; {точка справа от текста}
BottomText=0; {точка под текстом}
CenterText=1; {точка по центру текста при вертикальном направлении
вывода}
TopText=2; {точка над текстом}
3. Процедура OutText (st:string) - выводит строку, выравнивая ее заданным способом относительно текущей точки.
4. Процедура OutTextXY(x,y:word; st: string) - выводит строку st, выравнивая ее в соответствии с установленными режимами вертикального и горизонтального выравнивания относительно точки (х, у).
Пример 1. Приведем пример программы, при выполнении которой создается интересный визуальный эффект путем заполнения экрана множеством точек различных цветов.
Uses Crt, Graph;
Var Driver, Mode : integer; Color: word; X,Y:word;
Procedure GrInit;
Begin
Driver:= Detect; {автораспознанание драйвера} InitGraph(Driver, Mode,'');
If GraphResult<>0 then Begin Writeln ('Ошибка инициализации!');
Writeln ('Работа программы прервана'); Halt (1) {остановить выполнение программы с кодом завершения — 1}
End; End;
Begin GrInit;
Color: =0; Randomize;
Repeat
{выберем случайным образом координаты точки}
X: = Random(GetMaxX); Y: = Random(GetMaxY);
PutPixel(X,Y,Color), {вывод точки} Inc(Color); {изменение цвета}
{проверим, не превышает ли значение цвета максимального значения, которое определяет функция GetMaxColor}
If Color = GetMaxColor Then Color: =0;
Until KeyPressed; {повторять до нажатия любой клавиши)
ClearDevice;
{CloseGraph}
End.
Пример 2 Будильник.
program Budil;
uses graph;
var grDriver:integer; grMode:integer;
Begin
grDriver:=Detect; InitGraph(grDriver,grMode,'');
{Смена цвета фона}
SetBkColor(14);
{Смена цвета линии}
SetColor(5);
{Рисование окружности}
Circle(250,180,60); Circle(270,180,60);
Circle(210,235,7); Circle(310,235,7);
Circle(260,180,7); Circle(260,115,10);
SetColor(9);
{Рисование линий}
Line(260,180,260,140); Line(260,180,270,150);
Circle(260,230,5); Circle(260,125,5);
Circle(230,180,5); Circle(290,180,5);
readln;
End.
Пример 3. Прогрaмма рисует 5 концентрических окружностей в центре экрaнa.
Program Krug2;
Uses Graph;
Var Gd, Gm, rad,xc,yc:integer;
begin Gd:=Detect; { функция InitGraph должнa выполнить } { aвтоопределение типa мониторa (Gd) и его } { мaксимaльного рaзрешения (Gm)} InitGraph(Gd,Gm,''); { инициaлизaция грaфического режимa }
if GraphResult <> 0 then { в случaе ошибки инициaлизaции } begin Writeln('Ошибкa инициaлизaции грaфического режимa');
Writeln('В кaтaлоге прогрaммы должен присутствовaть дрaйвер egavga.bgi'); Writeln('или укaжите путь к нему в IniGraph(Gd,Gm,<путь>)'); Halt(1); end;
Case Gd of { aнaлизируем тип дисплея } { и вычисляем координaты центрa экрaнa }
9: begin { VGA монитор } xc:=(640-1) div 2; yc:=(480-1) div 2; end;
3: begin { EGA монитор } xc:=(640-1) div 2; yc:=(350-1) div 2; end; end;
for rad:=1 to 5 do Circle(xc, yc, rad*20); { рисуем окружности } Readln; CloseGraph; { возврaт в текстовый режим }
end.
Пример 4. Программа выводит десять вложенных друг в друга прямоугольников, после чего циклически меняет цвет фона. Для выхода из программы достаточно нажать на любую клавишу.
Uses Graph, CRT;
const NC: array [0..15] of String [12] = ('Black', 'Blue', 'Green', 'Cyan‘ ,'Red', 'Magenta',
' Brown', 'LightGray‘ ,'DarkGray', 'LightBlue', 'LightGreen’,'LightCyan1,'LightRed',
'LightMagenta‘ ,'Yellow', 'White');
var d, r, e, k, color, dx, dy: Integer;
Begin {Инициируем графику}
d := Detect; InitGraph(d, r, ' ') ;
e := GraphResult; if e <> grOK then WriteLn(GraphErrorMsg(e))
else begin {Выводим текст в центре экрана}
OutTextXY(200,GetMaxY div 2 ,'BACKGROUND COLOR');
dx := GetMaxX div 30; {Приращение длины}
dy := GetMaxY div 25; {Приращение высоты}
for k := 0 to 9 do{Выводим 10 прямоугольников}
Rectangle(k*dx,k*dy,GetMaxX-k*dx,GetMaxY-k*dy);
color := black; {Начальный цвет фона}
repeat {Цикл смены фона}
SetBkColor(color) ; SetFillStyle(0,Color);
Bar(345,GetMaxY div 2, 440 , GetMaxY div 2+8);
OutTextXY(345,GetMaxY div 2,NC[color]); delay(1000); inc(color);
if color > White then color := Black until KeyPressed;
if ReadKey=#0 then k := ord(ReadKey);
CloseGraph end
end.
Построение графика элементарных функций
Пусть дана некоторая функция у = f(х). Рассмотрим прямоугольную область координатной плоскости, которая определяется значениями:
xMin ≤ x ≤ xMax; yMin ≤ y ≤ yMax;
Эту область назовём областью функции, а координаты (х, у) — мировыми координатами. Графиком функции f(х) является некоторое конечное множество точек (хk,уk), уk = f(xk), k=1, ..., n из области функции.
Выделим на экране компьютера прямоугольную область, которую будем называть окном, в котором поместим точечный график функции. В графическом режиме экран имеет другую систему координат U и V.
Шаг 1. Определим исходные данные uMin, uMax, vMin, vMax, xMin, xMax, yMin, уМах, а также количество точек n=uMax — uMin и шаг изменения х xStep=(xMax — xMin)/n.
Шаг 2. Нарисуем рамку, обрамляющую окно (это будет прямоугольник, левый верхний угол которого имеет координаты (uMin, vMin), а правый нижний угол — (uMax, vMax).
Шаг 3. Вычислим кооэффициенты сжатия рх и ру по формулам .
Шаг 4. Нарисуем оси координат.
Шаг 5. Строим график функции y = f(x) из n точек, преобразовывая х в u, а у - в v.
uses Graph;
Const uMin=50; uMax=600; vMin=50; vMax=450;
{Окно графика функции}
Var grDriver: integer;
grMode: integer;
xStep:real; {Шаг по х}
n, k: integer; {Число точек графика}
x, y, px, py:real;
xMin, yMin, yMax, xMax: real;{Область функции}
Procedure Grlnit;
Begin
grDriver:=Detect;
InitGraph(grDriver,grMode,'');
IF GraphResult<>0 then
begin
Writeln('Ошибка инициализации!');
writeln('Работа программы прервана');
Halt(1)
end
End;
Function xScr(x: real):integer;
{Преобразование координаты х в u}
begin
xScr:=Round((x-xMin)*px+uMin);
end;
Function yScr(y:real):integer;
{Преобразование координаты y в v}
begin
yScr:=Round((y-yMax)*py+vMin);
end;
Function f(x:real):real;
{Вид функции}
begin
f:=X*X-5*X+6;
end;
Begin
{Ввод исходных значений области функции}
write('xMin='); readln(xMin);
write('xMax='); readln(xMax);
write('yMin='); readln(yMin);
write('yMax='); readln(yMax);
px:=(uMax-uMin)/(xMax-xMin);
py:=-(vMax-vMin)/(yMax-yMin);
Grlnit;
{Построение рамки прямоугольника}
SetLineStyle(0,0,3);
Rectangle(uMin,vMin,uMax,vMax);
{Построение осей координат}
SetLineStyle(0,0,1);
If (xMin<0) and (xMax>0) then
Line (xScr(0),vMin,xScr(0),vMax);
If(yMin<0) and(yMax>0) then
Line(uMin,yScr(0),uMax,yScr(0));
{Определение количества точек графика}
n:=uMax-uMin;
{Вычисление шага}
xStep:=(xMax-xMin)/n;
x:=xMin;
{Вывод графика в виде n точек желтого цвета, преобразовывая при этом х в u, у в v}
for k:=1 to n do
begin
y:=f(x);
if(y> yMin) and (y
Этапы проектирования программ:
техническое задание;
разработка технического проекта;
разработка рабочего проекта;
отладка отдельных модулей и программы в целом
Разработка документации
I. Техническое задание (примерный план)
1.Организационно-экономическая сущность задачи:
• наименование задачи, место ее решения;
• цель решения;
• назначение (для каких объектов подразделений и пользователей она предназначена);
• периодичность решения и требования к срокам решения;
• источники и способы поступления данных;
• потребители результатной информации и способы ее отправки
• информационная связь с другими задачами.
2. Описание исходной (входной) информации:
• перечень исходной информации;
• формы представления (электронная форма или бумажный документ) по каждой позиции перечня; примеры заполнения форм (документов); описание структурных единиц информации (каждого элемента данных, реквизита);
• способы контроля ввода исходной информации;
3. Описание выходной информации:
• перечень результатной информации;
• формы представления, (печатная сводка, видеограмма, машинный носитель и его макет и т.д.);
• перечень пользователей результатной информации (подразделение и персонал)
• перечень регламентной и запросной информации;
• описание структурных единиц информации (каждого элемента данных, реквизита) по аналогии с исходными данными;
• способы контроля результатной информации;
• контроль разрядности;
• контроль интервала значений реквизита;
• контроль соответствия списку значений.
4.Описание алгоритма решения задачи (последовательности действий и логики решения задачи):
• описание способов формирования результатной информации с указанием последовательности выполнения логических и арифметических действий;
• описание связей, между частями, операциями, формулами алгоритма;
• требования к порядку расположения (сортировке) ключевых реквизитов, например; по возрастанию значений табельных номеров.
5.Описание используемой условно-постоянной и справочной информации:
• перечень единиц условно-постоянной информации, классификаторов, справочников, таблиц, списков с указанием их полных наименований;
• формы представления;
• описание структурных единиц информации (по аналогии с исходными записями;
• способы взаимодействия с переменной информацией;
• содержание справочной информации, ее структура и способы обращения к ней.
Описание данных (входной, выходной и справочной информации) свести в таблицу 1.
Таблица 1 - Описание данных, используемых в программе.
В столбце «Назначение переменной» может быть указан один из трёх вариантов:
исходные данные;
вспомогательная переменная;
результат.
В столбце «Ограничения» необходимо указать тип переменной и ее вид (простая или элемент массива или записи), а также ограничения на значения, например, «значение больше нуля».
II. Разработка технического проекта
На данном этапе выполняется комплекс наиболее важных работ:
конкретизируются данные об объекте программы,
производится декомпозиция задачи,
разрабатывается детальный алгоритм обработки данных.
Задачи обладают внутренней структурой.
Необходимо разбить сложную задачу на структурные элементарные составляющие и задать их комбинирование.
Далее требуется детализация задачи, т.е. переход от описания задачи в крупных понятиях к стоящим за этими понятиями объектам более низкого уровня.
Структурная методология включает следующие методы:
Метод нисходящего проектирования («сверху-вниз»);
Метод восходящего проектирования («снизу-вверх»)
Метод нисходящего проектирования («сверху-вниз») – подход функциональной декомпозиции на основе 2 стратегий:
пошагового уточнения, при котором на каждом следующем этапе декомпозиции определяются модули очередного более низкого уровня;
анализа сообщений, при котором анализируются потоки данных, обрабатываемых модулями.
Метод восходящего проектирования («снизу-вверх») – подход, при котором в первую очередь определяются вспомогательные модули, которые потребуются при проектировании программы.
Программные продукты обладают внутренней структурой, образованной взаимосвязанными программными модулями
Модуль – это самостоятельная часть программы, имеющая определенное назначение и обеспечивающая заданные функции обработки.
При модульном подходе работа программного продукта представляется в виде совокупности действий по преобразованию данных от «исходных» к «выходным». Под исходными данными подразумеваются данные, которые задаются об объекте при инициализации программы.
На этом этапе также необходимо:
установить какие справочные данные требуются для решения поставленной задачи,
разработать форму представления и ввода для них.
определить в виде каких объектов данных будут представлена используемая информация.
Под объектом данных программы подразумевается переменные, структуры (записи), массивы, файлы, используемые в программе.
Обычно объекты данных, используемые в программе, формируются на основе объектов предметной области, участвующих в задаче.
Выделенные подзадачи (рис.1) являются прообразами будущих программных модулей.
Для разработки программных модулей необходимо разработать алгоритм для каждой выделенной подзадачи.
На рис. 2 приведена типовая структура программного продукта, состоящего из отдельных программных модулей, процедур, встроенных функций.
Среди множества модулей различают:
головной модуль (вызывающая программа) – управляет запуском программного продукта (существует в единственном числе);
управляющий модуль – обеспечивает вызов других модулей на обработку;
рабочие модули выполняют функции обработки;
сервисные модули и библиотеки, утилиты – осуществляют обслуживающие функции.
На данном этапе необходимо, прежде всего, для каждой подзадачи определить выполняемые в ней действий, то есть какие основные операции по преобразованию данных от установленных входных к выходным данным выполняются в модуле. Необходимо выбрать тип используемого алгоритма и произвести его детальную разработку.
Общие рекомендации при декомпозиции:
не пытайтесь разбивать на модули очень простые задачи;
рекомендуемый размер модуля от 15 до 60 программных строк;
обязательно выделяйте в виде модуля ту часть программы, которая может быть полезна в других программах или в нескольких частях данной программы;
переменные, общие для нескольких модулей должны быть определены в вызывающей программе;
стремитесь к независимости модулей.
Выделим преимущества модульного программирования:
единичный модуль легче написать, отладить, проверить;
один модуль можно использовать в разных частях программы и в других программах;
изменения в программе могут затрагивать только один модуль, а не всю программу;
разработку отдельных модулей можно поручить различным людям.
Пример 6 – Процедура удаления записи из файла.
Procedure udal(var i:file_type);
Var t: tov; k: 1..100; с: char; found: boolean;
Begin
Assign(copf, 'copsc');
Writeln('Какую запись удалить? Введите номер товара'); Readln(k);
Reset(f); Rewrite(copf); {позиционирование файлов}
Found:=False;
While Not Eof(f) do begin
Read(f,t); {читаем запись из файла}
If t.nom < > k then write(copf,.t) {если номер записи не k, записываем ее в файл-{копию}
Else begin found:=true; {запись для удаления найдена}
Vivod(t); write(‘Именно эту запись удалить?'); Writeln(‘Д/H'); Readln(c);
Case с of
'д','Д','у','У : ; {пустой оператор, запись k в файл-копию не записываем}
Else Write(copf,t); {раздумали удалять, записываем запись k в файл-копию }
End; {case}
End; {else}
End; {while}
Close(f); Close(copf); {закрываем файлы }
If not found { если запись не найдена} Then begin
Writeln('Запись с номером ', k : 3, ' не найдена'); Erase(copf); {удаляем файл-копию}
End
Else begin
Erase(f); Rename(copf,’sclad’);
End;
End; {конец п/п}
Пример 7 – Процедура просмотра всех записей файла.
Procedure prosmotr(var f:file_type);
Var t:tov;
Begin
Reset(f); {установка указателя на начало файла для чтения из него}
While not eof(f) do begin {выполнять, пока не достигнут конец файла}
Read(f, t); {чтение записи из файла}
Vivodzap(t); {вывод записи}
end;
End; {конец п/п}
Пример 8 – Процедура добавления новой записи в файл.
Procedure dobav( Var f: file_type);
Var t:Tov; с: Char;
Begin
Reset(f);
Seek(f,Filesize(f)); {указатель перемещаем на конец файла}
Vvodzap(t);
Write(f, t); Close(f);
End; {конец п/п}
Пример 9 – Процедура нахождения общей стоимости товаров
Procedure Sum(Var f: File_type); { }
Var t:Tov; s:Real;
Begin
Reset(f); s:=0;
While not eof(f) do begin
Read(f, t); {читаем запись из файла}
s:=s+t.s_ed * t.kol; {суммируем стоимости отдельных товаров}
End;
Writeln('Ha складе хранятся товары на сумму – ‘, s:8:2, 'руб');
Readln;
End; {конец п/п}
Пример 10 – Процедура поиска данных о товаре по наименованию.
Procedure poisk(var f: file_type);
Var t:tov; name: String[20]; z: Boolean;
Begin
Writeln('Введите название искомого товара?'); Readln(name);
Reset(f); z:=false;
While not eof(f) do Begin
Read(f,t); {читаем запись из файла}
If t.nt=name {товар с искомым наименованием найден}
Then begin {выводим данную запись}
z:=true; vivod(t);
end;
end; {while}
if not z then Writeln('3апись с наименованием ', name:20, ' не найдена');
readln;
close(f);
end; {конец п/п}
Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:
Email: Нажмите что бы посмотреть