Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Стандартный модуль работы с графическим экраном Graph



1) назначение модуля

Подключаются процедуры и функции по работе с экраном в графическом режиме, т.е. когда доступной становится любая точка (пиксель) экрана. Для их использования необходимо:

  • подключить раздел графических подпрограмм Турбо-Паскаля, что выполняется в самом начале раздела описаний оператором USES Graph;
  • инициализировать графику в выполняемом блоке, для чего загрузить в память драйвер управления монитором в графическом режиме. Это делается процедурой InitGraph(...) . Далее выполняется выбор цветов и характеристик графических примитивов (точек, линий, стандартных фигур и полигонов, символов текста) и изображаются нужные объекты, с помощью стандартных процедур и функций. По окончании работы графический режим монитора выключается (закрытием графики процедурой CloseGraph ).

2) координаты экрана

Определяются возможностями видеосистемы ПЭВМ. Обычно стараются использовать наилучший возможный режим экрана

{ *** функции, связанные с координатами *** }

function GetX: integer; – получить текущую координату X;

function GetY: integer; – получить текущую координату Y;

function GetMaxX: integer; – получить максимально возможную координату экрана по X;

function GetMaxY: integer; – получить максимально возможную координату экрана по Y;

3) управление графическим режимом

{ *** определение, инициализация и восстановление текстового режима *** }

procedure DetectGraph (var GraphDriver, GraphMode: integer); – получение возможного типа драйвера и графического режима по установленным аппаратным средствам;

procedure InitGraph (var GraphDriver: integer;

var GraphMode: integer;

PathToDriver: String); – инициализировать графический режим экрана;

function GetMaxMode: integer; – получение наилучшего графического режима для данной ПЭВМ;

procedure SetGraphMode (Mode: integer); – задание графического режима;

function GetGraphMode: integer; – получение текущего графического режима;

procedure GraphDefaults; – установление графических параметров по-умолчанию (стандартных)

procedure RestoreCrtMode; – возвращение экрана в состояние, которое было до установления графики

procedure CloseGraph; – закрытие графического режима.

 

{ Коды завершений графических операций: }

grOk = 0; – без ошибок.

grNoInitGraph = -1; – не загружен драйвер графического режима.

grNotDetected = -2; – не определен тип видеокарты.

grFileNotFound = -3; – не найден файл с драйвером.

grInvalidDriver = -4; – ошибка работы драйвера.

grNoLoadMem = -5; – не хватает места в ОП для загрузки драйвера.

grNoScanMem = -6; – выход за пределы памяти при сканирующем заполнении

grNoFloodMem = -7; – выход за пределы памяти при заливке.

grFontNotFound = -8; – не найден заказанный шрифт.

grNoFontMem = -9; – не хватает места в ОП для загрузки шрифта.

grInvalidMode = -10; – неверный режим графики.

grError = -11; – ошибка графической операции.

grIOerror = -12; – ошибка графического ввода/вывода

grInvalidFont = -13; – ошибка в файле шрифта.

grInvalidFontNum = -14; – недопустимый номер шрифта.

 

{ *** Функции, возвращающие сведения об ошибках *** }

function GraphErrorMsg (ErrorCode: integer): String; – название ошибки по коду;

function GraphResult: integer; – код ошибки последней графической операции.

 

4) управление экраном и окном

{ *** экран, окна, сохранение и восстановление окон *** }

procedure ClearDevice; – очиска грфического экрана цветом фона. Текущий указатель в левом верхнем углу;

procedure SetViewPort (x1, y1, x2, y2: integer; Clip: boolean); – задание границ окна и типа отсечения;

procedure GetViewSettings (var ViewPort: ViewPortType); – получить характеристики окна;

procedure ClearViewPort; – очистить окно цветом фона;

procedure SetVisualPage (Page: word); – задает номер отображаемой графической страницы;

procedure SetActivePage (Page: word); – устанавливает для графического вывода активную страницу.

 

{ *** сохранение/восстановление части экрана *** }

function ImageSize (x1, y1, x2, y2: integer): word; – определить размер ОП для прямоугольника;

procedure GetImage (x1, y1, x2, y2: integer; var BitMap); – сохранить в ОП образ прямоугольника;

procedure PutImage (X, Y: integer; var BitMap; BitBlt: word); – восстановить прямоугольник из ОП.

 

5) управление цветом

{ константы изображения цветов: }

 

Таблица 27. Кодировка цветов

Код Имя константы Цвет
Black Черный (прозрачный)
Blue синий
Green зеленый
Cyan голубой
Red красный
Magenta фиолетовый
Brown коричневый
LightGray светло-серый
DarkGray темно-серый
LightBlue светло-голубой
LightGreen светло-зеленый
LightCyan светло-синий
LightRed светло-красный
LightMagenta светло-фиолетовый (розовый)
Yellow светло-коричневый(желтый)
White белый

 

{ *** процедуры работы с цветом *** }

procedure SetBkColor (ColorNum: word); – установить цвет фона;

procedure SetColor(Color: word); – установить цвет рисования

function GetBkColor: word; – получить цвет фона;

function GetColor: word; – получить текущий цвет рисования;

function GetMaxColor: word; – получить максимально-возможное число цветов.

 

6) вывод точек

{ *** процедуры работы с точкой *** }

procedure PutPixel (X, Y: integer; Pixel: word); – поставить на экране точку (X, Y) заданным цветом (pixel);

function GetPixel (X, Y: integer): word; – получить цвет точки с координатами (Х, Y).

 

7) вывод линий

{ типы и толщины линий для процедур Get/SetLineStyle: }

SolidLn = 0; { сплошная };

DottedLn = 1; { пунктирная };

CenterLn = 2; { штрих-пунктирная (осевая) };

DashedLn = 3; { штриховая };

UserBitLn = 4; { задаваемая пользователем };

NormWidth = 1; { нормальная (тонкая) };

ThickWidth = 3; { толстая }.

 

{ *** процедуры перемещений и проведения отрезков линий *** }

procedure LineTo (X, Y: integer); – линия из текущей точки в (X, Y);

procedure LineRel (Dx, Dy: integer); – линия из текущей точки в точку, смещенную на (Dx, Dy);

procedure MoveTo (X, Y: integer); – переход в точку (X, Y);

procedure MoveRel (Dx, Dy: integer); – переход из текущей точки в точку, смещенную на (Dx, Dy);

procedure Line (x1, y1, x2, y2: integer); – линия из точки (x1, y1) в точку (x2, y2);

procedure GetLineSettings (var LineInfo: LineSettingsType); – получить текущие настройки рисования линий;

procedure SetLineStyle (LineStyle: word;

Pattern: word;

Thickness: word); – задать текущие настройки рисования линий.

 

8) вывод и закраска контуров

{ *** многоугольники, их закраска и текстуры *** }

procedure Rectangle (x1, y1, x2, y2: integer); – построить незакрашенный прямоугольник;

procedure Bar (x1, y1, x2, y2: integer); – построить закрашенный прямоугольник;

procedure Bar3D (x1, y1, x2, y2: integer; Depth: word; Top: boolean); – построить паралелепипед;

procedure DrawPoly (NumPoints: word; var PolyPoints); – построить контур многоугольника из NumPoints точек;

procedure FillPoly (NumPoints: word; var PolyPoints); – построить закрашенный многоугольник из NumPoints точек;

procedure GetFillSettings (var FillInfo: FillSettingsType); – получить текущие характеристики закраски;

procedure GetFillPattern (var FillPattern: FillPatternType); – получить текущие характеристики текстуры;

procedure SetFillStyle (Pattern: word; Color: word); – задать характеристики закраски;

procedure SetFillPattern (Pattern: FillPatternType; Color: word); – задать характеристики текстуры;

procedure FloodFill (X, Y: integer; Border: word); – залить область текущей закраской от заданной точки (X, Y) до границы, заданной цветом (Border).

 

9) окружности, эллипсы, дуги

{ *** построение окружностей, эллипсов и их частей *** }

procedure Arc (X, Y: integer; StAngle, EndAngle, Radius: word); – построение дуги окружности;

procedure GetArcCoords (var ArcCoords: ArcCoordsType); – получение параметров дуги окружности;

procedure Circle (X, Y: integer; Radius: word); – построение окружности заданного радиуса и центра;

procedure Ellipse (X, Y: integer;

StAngle, EndAngle: word;

XRadius, YRadius: word); – построение дуги эллипса;

procedure FillEllipse (X, Y: integer;

XRadius, YRadius: word); – построение закрашенного эллипса.

 

procedure GetAspectRatio (var Xasp, Yasp: word); – получение относительного разрешения по X и Y;

procedure SetAspectRatio (Xasp, Yasp: word); – задание относительного разрешения по X и Y;

procedure PieSlice (X, Y: integer; StAngle, EndAngle, Radius: word); – построение закрашенного сектора круга;

procedure Sector (X, Y: Integer;

StAngle, EndAngle,

XRadius, YRadius: word); – построение закрашенного сектора эллипса.

 

10) вывод текста

{ константы для процедур Set/GetTextStyle }

DefaultFont = 0; { шрифт по-умолчанию };

TriplexFont = 1; { " оттененный" шрифт };

SmallFont = 2; { мелкий шрифт };

SansSerifFont = 3; { шрифт " сан-сериф" };

GothicFont = 4; { готический шрифт };

HorizDir = 0; { текст слева–направо };

VertDir = 1; { текст снизу–вверх };

 

{ размещение текста относительно заданной точки }

LeftText = 0; { текст влево от точки };

CenterText = 1; { точка в центре текста };

RightText = 2; { текст вправо от точки };

BottomText = 0; { текст под точкой };

 

{ CenterText = 1; уже определено выше }

TopText = 2; { текст над точкой };

UserCharSize = 0; { размер шрифта задается программистом }.

 

{ признаки отсечения фигур при выходе за пределы окна }

ClipOn = true; – за границами окна фигура не видна;

ClipOff = false; – за границами окна фигура видна;

 

{ *** процедуры вывода текста *** }

procedure GetTextSettings (var TextInfo: TextSettingsType); – получить текущие настройки вывода текста;

procedure OutText (TextString: string); – вывести текст относительно текущей точки;

procedure OutTextXY (X, Y: integer; TextString: string); – вывести текст относительно точки (X, Y);

procedure SetTextJustify (Horiz, Vert: word); – установить параметры центровки (размещения) текста;

procedure SetTextStyle (Font, Direction: word; CharSize: word); – выбрать шрифт, его размер и направление вывода текста;

procedure SetUserCharSize (MultX, DivX, MultY, DivY: word); – задать размер шрифта программиста;

function TextHeight (TextString: string): word; – получить текущую высоту строки текста;

function TextWidth (TextString: string): word; – получить текущую ширину строки текста.

Разбор контрольного варианта № 31

Задание

Построить график функции Y=exp(X) для интервала X от –1 до 2, нанести на график размеченные оси координат и сделать подпись (название функции).

Дополнительные требования: график изобразить толстой штриховой линией красного цвета на белом фоне, координатные оси (толстая линия) и разметка (тонкая линия) – черного (темно-серого) цвета, подпись – синего цвета под графиком посередине.

Программу составить для EGA и VGA адаптеров (универсальную). Драйвер графического адаптера (с именем EGAVGA.BGI) находится в каталоге D: \TP6\BGI.

Условия, принятые из соображений дизайна:

График будет занимать 60% ширины и высот

     
     
     

ы экрана. Разметку проводим через 0.5 по Х и через 1.0 по Y. График рисуем процедурой LineTo, с шагом 0.2 по оси X.

Таблица идентификаторов

Таблица 28. Идентификаторы задачи 31-го варианта

Имя Тип Размер, (байт) Назначение
Graph_work Имя программы - Построение графика функции
Graph Имя модуля - Стандартные графические подпрограммы
Crt " - Стандартные подпрограммы работы с консолью
Print " - Стандартные подпрограммы работы с принтером
X Веществен. Текущее значение аргумента
Y " " Текущее значение функции
Xmin " " Минимальное значение аргумента
Xmax " " Максимальное значение аргумента
Ymin " " Минимальное значение функции
Ymax " " Максимальное значение функции
DeltaX " " Диапазон изменения аргумента
DeltaY " " Диапазон изменения функции
Dx " " Шаг аргумента для расчета графика функции
Dxs " " Шаг разметки оси Х
Dys " " Шаг разметки оси Y
Part " " Доля экрана, занимаемая графиком
Pole " " Размер полей вокруг графика в долях экрана
Mx " " Коэффициент пересчета Х в J
My " " Коэффициент пересчета Y в I
I Целое Горизонтальная координата экрана
J " " Вертикальная координата экрана
Imin " " Нижняя граница графика на экране
Imax " " Верхняя граница графика на экране
Jmin " " Левая граница графика на экране
Jmax " " Правая граница графика на экране
JAll " " Размер экрана по Х в пикселах
Iall " " Размер экрана по Y в пикселях
J0 " " Координата оси Y на экране
I0 " " Координата оси Х на экране
DeltaJ " " Размер рисунка по Х
DeltaI " " Размер рисунка по Y
Nx " " Шаг между рисками оси Х в пикселях
Ny " " Шаг между рисками оси Y в пикселях
Riska Строка Подпись текущей риски оси
GraphDrv Целое Тип графического драйвера
GraphMode " " Номер графического режима
Code беззнаковое " Код завершения процедуры инициализ. граф.
InitGraph Имя процедуры - Инициализация графического режима
GraphResult Имя функции - Возвращает код завершения граф. процедуры
ClearDevice Имя процедуры - Очистка экрана заданным цветом фона
Halt Имя процедуры - Останов (завершение) программы
SetBkColor Имя процедуры - Установка цвета фона
SetColor Имя процедуры - Установка цвета
SetLineStyle Имя процедуры - Установка типа линии
SetTextStyle Имя процедуры - Установка стиля текста
SetTextJustify Имя процедуры - Установка способа размещения текста
GetMaxX Имя функции - Возвращает размер экрана по Х
GetMaxY Имя функции - Возвращает размер экрана по Y
Round Имя функции - Округляет вещественный аргумент в целое
MoveTo Имя процедуры - Переход в заданную точку экрана
LineTo Имя процедуры - Проведение отрезка в заданную точку
Line Имя процедуры - Проведение отрезка
OutTextXY Имя процедуры - Вывод текста
Str Имя процедуры - Преобразование числа в строку с его изображен.
KeyPressed Имя функции - Возвращает TRUE, если нажата клавиша
CloseGraph Имя процедуры - Закрытие графического режима
Pr Имя процедуры - Копирование графического экрана на принтер

Алгоритм

1.Задание констант, стандартных значений;

2.Ввод исходных данных;

3.Печать исходных данных;

4.Расчет характеристик функций;

5.Открытие графики с проверкой правильности срабатывания;

6.Настройка фона;

7.Расчет параметров графика на экране;

8.Расчет масштабных коэффициентов перехода от X к J и от Y к I;

9.Построение графика функции:

9.1.Задание характеристик линии;

9.2.Начальная точка графика;

9.3.Цикл расчета экранных координат графика (X-> J, X-> Y-> I) и проведения отрезков;

10.Построение осей координат:

10.1.Задание характеристик линии;

10.2.Построение осей;

11.Разметка осей:

11.1.Задание характеристик линии;

11.2.Характеристики шрифта для подписи значений;

11.3.Цикл проведения разметки оси X, риски вверх от оси, по 10 пикселов:

11.3.1. от начала координат – вправо;

11.3.1. от начала координат – влево;

11.4. Цикл проведения разметки оси Y, риски вправо от оси, по 10 пикселов:

11.4.1.от начала координат – вверх;

11.4.2.от начала координат - вниз (Для данной функции ниже оси Х разметка не нужна);

12.Подпись графика:

12.1.Характеристики шрифта, цвет;

12.2.Вывод подписи;

13.Задержка графика на экране;

14.Вывод графика на печать - только если подключен принтер;

15.Закрытие графического режима.


           
     
 
 

Блок-схема алгоритма


           
   
   
 

Текст программы

Program Graph_work;

{ Программа Лабораторной работы N 8.

Вариант N 31.

Построение графика функции.

А.Я.Умненькая, ст. гр. Я-007 }

Uses Graph, Crt, Print; {Print – только при наличии принтера для печати графика с экрана на бумагу }

Var

X, Y, { текущие значения переменных Х и Y }

Xmin, Xmax, {минимальное и максимальное значения Х на графике}

Ymin, Ymax, {минимальное и максимальное значения Y на графике}

DeltaX, DeltaY, {диапазоны изменения X и Y в пределах рисунка}

Dx, { шаг построения графика по Х }

Dxs, Dys, { Шаги разметки осей по Х и по Y }

Part, Pole, { Доля экрана, занятая рисунком и доля чистого поля с каждой стороны }

Mx, My {Коэффициенты пересчета Х в J и Y в I}

: real;

Imin, Imax, {координаты экрана, соответствующие Ymin и Ymax}

Jmin, Jmax, {координаты экрана, соответствующие Xmin и Xmax}

J, I, {текущие значения переменных координат экрана }

JAll, IAll, {Максимальные размеры экрана (в пикселях) по X, Y}

J0, I0, {Координаты на экране точки пересечения осей графика}

DeltaJ, DeltaI, {Экранные размеры рисунка по Х и Y в пикселях}

Nx, Ny {Шаги разметки осей Х и Y в пикселях }

: integer;

Riska: String[5]; {Строка для вывода чисел у рисок осей}

GraphDrv, {Тип графического драйвера }

GraphMode: integer; {Устанавливаемый графический режим}

Code: word; {Код завершения инициализации графики }

BEGIN { Начало программы }

{1.Задание констант, стандартных значений }

Xmin: =-1.0; Xmax: =2.0;

Dxs: =0.5; Dys: =1.0;

Part: =0.6; Dx: =0.2;

{2.Ввод исходных данных - в примере не используем}

{3.Печать исходных данных - в примере не используем}

{4.Расчет характеристик функций }

DeltaX: =Xmax-Xmin;

Ymin: =exp(Xmin);

Ymax: =exp(Xmax);

if Ymin> 0 then Ymin: =0;

if Ymax< 0 then Ymax: =0;

DeltaX: =Xmax-Xmin;

DeltaY: =Ymax-Ymin;

{5.Открытие графики с проверкой правильности срабатывания}

GraphDrv: =0; {пусть определяет режим сам }

InitGraph(GraphDrv, GraphMode, 'D: \TP6\BGI');

Code: =GraphResult;

if Code< > 0 then {если завершение с кодом не 0 - закончить программу}

Begin

writeln('Ошибка открытия графики с кодом: ', Code);

Halt; { Останов программы }

End;

{6.Настройка фона}

SetBkColor(15); {Фон белый }

ClearDevice; {Очистка экрана}

{7.Расчет параметров графика на экране}

JAll: =GetMaxX;

IAll: =GetMaxY;

Pole: =(1.0-Part)/2.0;

Jmin: =Round(Pole*JAll);

Jmax: =Round((1.0-Pole)*JAll);

Imin: =Round((1.0-Pole)*IAll);

Imax: =Round(Pole*IAll); { Imin > Imax!!! }

DeltaJ: =Jmax-Jmin;

DeltaI: =Imax-Imin;

{8.Расчет масштабных коэффициентов перехода от X к J и от Y к I}

Mx: =DeltaJ/DeltaX;

My: =DeltaI/DeltaY;

{9.Построение графика функции}

{9.1.Задание характеристик линии}

SetColor(4); { цвет красный }

SetLineStyle(3, 0, 3); { штриховая толстая }

{9.2.Начальная точка графика}

Nx: =Round(Dxs*Mx);

Ny: =Round(Dys*My); { Шаг разметки по Y - отрицательный }

J: =Jmin;

I: = Imin+Round((exp(Xmin)-Ymin)*My);

MoveTo (J, I);

{9.3.Цикл расчета экранных координат графика (X-> J, X-> Y-> I) и проведения отрезков}

X: =0;

While X< =Xmax do

Begin

X: =X+Dx;

Y: =exp(X);

J: =Jmin+Round((X-Xmin)*Mx);

I: =Imin+Round((Y-Ymin)*My);

LineTo(J, I);

End;

{10.Построение осей 10.1.Задание характеристик линии }

SetColor(8); { цвет темно-серый }

SetLineStyle(0, 0, 3); { сплошная толстая }

{10.2.Построение осей }

J0: =Jmin+Round((0-Xmin)*Mx);

I0: =Imin+Round((0-Ymin)*My);

Line(J0, Imin, J0, Imax); {Построение оси Y (где X=0)}

Line(Jmin, I0, Jmax, I0); {Построение оси Х (где Y=0)}

{11.Разметка осей 11.1.Задание характеристик линии }

SetLineStyle(0, 0, 0); { сплошная тонкая }

{11.2.Характеристики шрифта для подписи значений }

SetTextStyle(0, 0, 0); { шрифт стандартный, подпись горизонтальна }

SetTextJustify(1, 2); {Размещение текста симметрично, относительно заданной точки по горизонтали и ниже точки по вертикали}

{11.3.Цикл проведения разметки оси X, риски вверх от оси, по 10 пикселов }

J: =J0;

X: =0;

while J< =Jmax+1 do {от начала координат - вправо }

begin

Line(J, I0, J, I0-10);

Str(X: 3: 1, Riska);

OutTextXY(J, I0+5, Riska);

X: =X+Dxs;

J: =Jmin+Round((X-Xmin)*Mx);

end;

J: =J0;

X: =0;

while J> =Jmin do {от начала координат - влево }

begin

Line(J, I0, J, I0-10);

Str(X: 3: 1, Riska);

OutTextXY(J, I0+5, Riska);

X: =X-Dxs;

J: =J-Nx;

end;

{11.4.Цикл проведения разметки оси Y, риски вправо от оси, по 10 пикселов }

SetTextJustify(2, 1); {Размещение текста симметрично, относительно заданной точки по вертикали и левее точки по горизонтали }

I: =I0;

Y: =0;

while I> =Imax do {от начала координат - вверх }

begin

Line(J0, I, J0+10, I);

Str(Y: 3: 1, Riska);

OutTextXY(J0-10, I, Riska);

Y: =Y+Dxs;

I: =I+Ny;

end;

{ Для данной функции ниже оси Х разметка не нужна}

I: =I0;

while I< =Imin do

begin

Line(J0, I, J0+10, I);

I: =I-Ny;

end;

{12.Подпись графика}

{12.1.Характеристики шрифта, цвет }

SetColor(1); { цвет синий }

SetTextJustify(1, 1); {Размещение текста симметрично, относительно заданной точки по горизонтали и по вертикали}

{12.2.Вывод подписи }

I: =Round(IAll*(1-Pole/2)); {середина нижнего поля}

OutTextXY(JAll div 2, I, 'График функции Y = exp(X)');

{13.Задержка графика на экране }

while Not KeyPressed do;

{14. Вывод графика на печать (на принтер) - только если он подключен }

Pr;

CloseGraph; {14.Закрытие графического режима }

END.

Рисунок 10. Результат работы программы 31-го варианта

Разбор контрольного варианта № 32

Задание

Построить график кривой, заданной параметрически: X=(2+0.5cos(8t))cos(t), Y=(2+0.5cos(8t))sin(t) для интервала t от 0 до 2π, нанести на график размеченные оси координат и сделать подпись.

Дополнительные требования: график изобразить тонкой сплошной линией красного цвета на белом фоне, координатные оси (толстая линия) и разметка (тонкая линия) – черного (темно-серого) цвета, подпись – синего цвета под графиком посередине.

Программу составить для EGA и VGA адаптеров (универсальную). Драйвер графического адаптера (с именем EGAVGA.BGI) находится в каталоге D: \TP6\BGI.

Условия, принятые из соображений дизайна:

График будет занимать 60% ширины и высоты экрана. Разметку проводим через 0.5 по Х и Y. График рисуем процедурой LineTo, для 400 точек.

Program Graph_work2;

{ Программа Лабораторной работы N 8

Вариант N 32.

Построение кривой, заданной параметрически.

А.Я.Умненькая, ст. гр. Я-007 }

Uses Graph, Crt; { Print - только при наличии принтера для печати графика с экрана на бумагу }

TYPE

mas=array[0..400] of real;

Var

X, Y: mas; { текущие значения переменных Х и Y }

Xmin, Xmax, t, tmin, tmax, { минимальное и максимальное значения Х на графике }

Ymin, Ymax, { минимальное и максимальное значения Y на графике }

DeltaX, DeltaY, { диапазоны изменения X и Y в пределах рисунка }

Dt, R, { шаг построения графика по t }

Xj, Yi,

Dxs, Dys, { Шаги разметки осей по Х и по Y }

Part, Pole, { Доля экрана, занятая рисунком и доля чистого поля с каждой стороны }

Mx, My {Коэффициенты пересчета Х в J и Y в I}

: real;

Imin, Imax, { координаты экрана, соответствующие Ymin и Ymax }

Jmin, Jmax, { координаты экрана, соответствующие Xmin и Xmax }

J, I, N, k, { текущие значения переменных координат экрана }

JAll, IAll, {Максимальные размеры экрана (в пикселях) по X и Y}

J0, I0, {Координаты на экране точки пересечения осей графика }

DeltaJ, DeltaI { Экранные размеры рисунка по Х и Y в пикселях}

: integer;

Riska: String[5]; { Строка для вывода чисел у рисок осей }

GraphDrv, { Тип графического драйвера }

GraphMode: integer; { Устанавливаемый графический режим }

Code: word; { Код завершения инициализации графики }

BEGIN { Начало программы }

{1.Задание констант, стандартных значений }

tmin: =0; tmax: =2.0*Pi;

Dxs: =0.5; Dys: =0.5;

Part: =0.6; N: =401;

{4.Расчет характеристик функций }

Dt: =(tmax-tmin)/(N-1);

Xmax: =-100;

Xmin: =100;

Ymax: =-100;

Ymin: =100;

For k: =0 to N-1 do

begin

t: =tmin+Dt*k;

R: =2.0+0.5*cos(8.0*t);

X[k]: =R*cos(t);

Y[k]: =R*sin(t);

if X[k]> Xmax then Xmax: =X[k];

if X[k]< Xmin then Xmin: =X[k];

if Y[k]> Ymax then Ymax: =Y[k];

if Y[k]< Ymin then Ymin: =Y[k];

end;

DeltaX: =Xmax-Xmin;

DeltaY: =Ymax-Ymin;

{5.Открытие графики с проверкой правильности срабатывания}

GraphDrv: =0; {пусть определяет режим сам }

InitGraph(GraphDrv, GraphMode, 'C: \voronov\STUD\TP\BGI');

Code: =GraphResult;

if Code< > 0 then {если завершение с кодом не 0 - закончить программу}

Begin

writeln('Ошибка открытия графики с кодом: ', Code);

Halt; { Останов программы }

End;

{6.Настройка фона}

SetBkColor(15); {Фон белый }

ClearDevice; {Очистка экрана}

{7.Расчет параметров графика на экране}

JAll: =GetMaxX;

IAll: =GetMaxY;

Pole: =(1.0-Part)/2.0;

Jmin: =Round(Pole*JAll);

Jmax: =Round((1.0-Pole)*JAll);

Imin: =Round((1.0-Pole)*IAll);

Imax: =Round(Pole*IAll); { Imin > Imax!!! }

DeltaJ: =Jmax-Jmin;

DeltaI: =Imax-Imin;

{8.Расчет масштабных коэффициентов перехода от X к J и от Y к I}

Mx: =DeltaJ/DeltaX;

My: =DeltaI/DeltaY;

{9.Построение графика функции}

{9.1.Задание характеристик линии}

SetColor(4); { цвет красный }

SetLineStyle(0, 0, 2);

{9.2.Начальная точка графика}

J: =Jmin+Round((X[0]-Xmin)*Mx);

I: =Imin+Round((Y[0]-Ymin)*My);

MoveTo (J, I);

{9.3.Цикл расчета экранных координат графика (X-> J, Y-> I) и проведения отрезков}

for k: =1 to N-1 do

Begin

J: =Jmin+Round((X[k]-Xmin)*Mx);

I: =Imin+Round((Y[k]-Ymin)*My);

LineTo(J, I);

End;

{10.Построение осей координат }

SetColor(8); { цвет темно-серый }

SetLineStyle(0, 0, 3); { сплошная толстая }

J0: =Jmin+Round((0-Xmin)*Mx);

I0: =Imin+Round((0-Ymin)*My);

Line(J0, Imin, J0, Imax); {Построение оси Y (где X=0)}

Line(Jmin, I0, Jmax, I0); {Построение оси Х (где Y=0)}

{11.Разметка осей}

SetLineStyle(0, 0, 0); { сплошная тонкая }

SetTextStyle(0, 0, 0); { шрифт стандартный, подпись горизонтальна }

SetTextJustify(1, 2); {Размещение текста симметрично, относительно заданной

точки по горизонтали и ниже точки по вертикали}

J: =J0;

Xj: =0;

while J< =Jmax+1 do {от начала координат - вправо }

begin

Line(J, Imin, J, Imax);

Str(Xj: 3: 1, Riska);

OutTextXY(J, I0+5, Riska);

Xj: =Xj+Dxs;

J: =Jmin+Round((Xj-Xmin)*Mx);

end;

J: =J0;

Xj: =0;

while J> =Jmin do {от начала координат - влево }

begin

Line(J, Imin, J, Imax);

Str(Xj: 3: 1, Riska);

OutTextXY(J, I0+5, Riska);

Xj: =Xj-Dxs;

J: =Jmin+Round((Xj-Xmin)*Mx);

end;

SetTextJustify(2, 1); {Размещение текста симметрично, относительно заданной

точки по вертикали и левее точки по горизонтали }

I: =I0;

Yi: =0;

while I> =Imax-1 do {от начала координат - вверх }

begin

Line(Jmin, I, Jmax, I);

Str(Yi: 3: 1, Riska);

OutTextXY(J0-10, I, Riska);

Yi: =Yi+Dxs;

I: =Imin+Round((Yi-Ymin)*My);

end;

I: =I0;

Yi: =0;

while I< =Imin do {от начала координат - вниз }

begin

Line(Jmin, I, Jmax, I);

Str(Yi: 3: 1, Riska);

OutTextXY(J0-10, I, Riska);

Yi: =Yi-Dxs;

I: =Imin+Round((Yi-Ymin)*My);

end;

{12.Подпись графика}

SetColor(1); { цвет синий }

SetTextJustify(1, 1); {Размещение текста симметрично, относительно заданной

точки по горизонтали и по вертикали}

I: =Round(IAll*(1-Pole/2)); {середина нижнего поля}

OutTextXY(JAll div 2, I, 'X=(2+0.5cos(8t))cos(t), Y=(2+0.5cos(8t))sin(t)');

{13.Задержка графика на экране }

while Not KeyPressed do;

{14. Вывод графика на печать (на принтер) - только если он подключен }

{Pr; }

{14.Закрытие графического режима }

CloseGraph;

END.

Рисунок 11. Результат работы программы 32-го варианта

Варианты заданий

Таблица 29. Варианты заданий лабораторной работы N9

  N вар Функция или параметрическое уравнение Аргумент и его диапазон   Цвет
текста/ фона графика/ осей координат
Парабола Y=1.3*X2-1.8 X [-1.2, 1.2] голубой белый зеленый голубой
Окружность X=0.5+2*cos(t) Y=0.2+2*sin(t) t [0, 2p] красный темно-серый светло-красный коричневый
Степенная функция Y=X3-2* X2+X X [-1, 3] розовый темно-серый светло-зеленый светло-серый
Эллипс x=3*cos(t), y=15*sin(t) t [0, 2p] синий светло-серый светло-синий темно-серый
Конхоида Никомеда X=A+B*cos(f) Y=A*tg(f)+B*sin(f) f [1.5, 4.5] A=1, B=2 светло-красный темно-серый светло-зеленый красный
Кардиоида X=4*cos(t)*(1+cos(t)) Y=4*sin(t)*(1+cos (t)) t [0, 2p] розовый красный синий розовый
Дробно-рациональная функция Y=(1.5*X+3)/(X-2) X [-4.2, 1.9] светло-серый розовый голубой желтый
Декартов лист X=3*A*t/(1+t3) Y=3*A*t*t/(1+t3) t [-0.5, 10] A=2 синий белый светло-синий светло-зеленый
Функция синус Y=2.5*sin(X)+0.5 X [-2p, 2p] белый зеленый желтый коричневый
Циссоида X=5*t2/(1+t2), Y=5*t3/(1+t2), t=tg(f) f [-p/4, p/4]   розовый черный зеленый белый
Тригонометрическая функция Y=сos(X2) X [-2p, 2p] светло-зеленый светло-синий белый розовый
Строфоида X=4*(t2-1)/(t2+1), Y=4*t*(t2-1)/(t2+1) t=tg(f) f [-p/2.5, p/2.5] темно-серый голубой белый желтый
Тригонометрическая функция Y=tg(X)-2*X X [-p/2.5, p/2.5] зеленый синий фиолетовый черный
Астроида X=3.5*cos3(t), Y=3.5*sin3(t) t [0, 2p] голубой белый светло-зеленый зеленый
Арксинус Y=arcsin(0.5*X) X [-2, 2] темно-серый голубой светло-зеленый зеленый
Эпициклоида X=(a+b)cos(t)-a*cos((a+b)*t/a), Y=(a+b)sin(t)-a*sin((a+b)*t/a) t [0, 2p] a=6, b=9 розовый фиолетовый голубой синий
Логарифм Y=ln(X+2) X [-1.5, 5] зеленый красный желтый светло-зеленый
Гипоциклоида X=2a*cos(f)+a*cos(2f) Y=2a*sin(f)-a*sin(2f) f [-p, p] a=1 белый розовый темно-серый голубой
Арктангенс Y=3*arctg(X) X [-5, 5] светло-зеленый голубой синий светло-синий
Эвольвента окружности X=a*cos(f)+a*f*sin(f) Y=a*sin(f)-a*f*cos(f) f [-9p, 9p] a=1.5 зеленый синий голубой черный
Дробно-рациональная нелинейная функция Y = A + B/X + C/X2 X [0.18, 3] A=1, B=2, C=-0.5 темно-серый белый фиолетовый красный
Леминиската X=r*cos(f) Y=r*sin(f) r=a*sqrt(2*cos(2f)) f [-p, p] светло-зеленый фиолетовый синий белый
Локон Аньези Y=A3/(X2 + A2) X [-5, 5] A=2 зеленый белый темно-серый светло-зеленый
Архимедова спираль X=r*cos(f) Y=r*sin(f) r=A*f f [-6p, 6p] A=1.5 розовый желтый синий светло-красный
Трохоида(удлинненая циклоида) X=A*(1+B*sin(f)) Y=A*(1-B*cos(f)) f [-2p, 4p] A=1.5, B=1.3 темно-серый белый светло-красный фиолетовый
Гиперболическая спираль X=(A*cos(f))/f Y=(A*sin(f))/f f [0.1, 10] A=3 фиолетовый зеленый светло-зеленый розовый
Удлиненная эпициклоида X=5*cos(f)-2*cos(5f) Y=5*sin(f)-2*sin(5f) f [-p, p] светло-серый синий светло-синий красный
Логарифмическая спираль X=r*cos(f) Y=r*sin(f) r=A*exp(B*f) f [0, 4] A=1.3, B=0.5 светло-зеленый синий белый зеленый
Удлиненная гипоциклоида X=4*cos(f)+2*cos(4f) Y=4*sin(f)-2*sin(4f) f [0, 2p] темно-серый белый синий зеленый
Улитка Паскаля X=2cos2(t)+3cos(t), Y=2*cos(t)sin(t)+3sin t t [0, 2p] коричневый желтый зеленый синий
Показательная функция Y=exp(X2) X [-1, 2] белый красный красный темно-серый
X=(2+0.5cos(8t))cos(t), Y=(2+0.5cos(8t))sin(t) t [0 до 2π ] синий белый красный темно-серый

Лабораторная работа № 9

Динамические переменные. Списки

Задачи лабораторной работы

Вопросы, изучаемые в работе

  • Разработка программы с динамическим выделением памяти.
  • Работа с переменными комбинированного типа - записями.
  • Работа с переменными ссылочного типа - указателями.
  • Программирование списков записей.

Задание (общее ко всем вариантам)

В лабораторной работе требуется сформировать заданный тип списка, заполнить его в соответствии с указаниями варианта задания данными из входного файла (типизированного или текстового) и вывести содержимое списка в виде таблицы в выводной текстовый файл по одной записи в строку.

Файл данных Dan.dat находится в каталоге D: \LAB1\ и состоит из записей. Первое поле каждой записи файла данных содержит фамилию и инициалы студента, второе и третье поля - оценки по дисциплинам, четвертое поле - среднюю оценку. Файл Dan.txt расположен там же и содержит ту же информацию, но в форме символьных строк.

В таблице вариантов указаны условия, которым должны отвечать записи данных, выбираемые из файла, а также типы списка и файла данных. Поля заглавного (в нульсвязных списках – первого обслуживаемого) звена должны содержать сведения о типе списка и количестве звеньев в нем.

В задании для типов списков используются следующие обозначения:

 

Таблица 30. Обозначения типов списков

Тип списка Обозначение
Односвязный линейный S1L
Односвязный кольцевой, заголовок внутри S1KI
Односвязный кольцевой, заголовок вне S1KO
Двусвязный линейный S2L
Двусвязный кольцевой, заголовок внутри S2KI
Двусвязный кольцевой, заголовок вне S2KO
Стек S0S
Очередь S0O
Дек S0D

Требования к программе

  • Программа должна содержать комментарий с указанием названия работы, № варианта, фамилии студента и № группы.
  • Все созданные в программе динамические переменные в конце должны быть удалены с освобождением памяти.
  • В подпрограммах не использовать глобальные переменные, кроме имен файлов.
  • Выводимая таблица должна быть озаглавлена в соответствии с заданием (какую выборку из исходного набора данных она содержит).
  • В заглавном элементе списка должен быть записан тип списка в форме:

Тип списка: < обозначение> и количество записей с данными (в первом целочисленном поле)

Содержание программы

  • формирование заглавного звена списка;
  • цикл чтения записей из файла данных и занесения их в список;
  • заполнение полей записи заглавного звена списка;
  • вывод записей данных из списка в выводной файл;
  • удаление списка.

Общие пояснения

Переменные, которые описываются в разделе описаний ( VAR ), называются статическими. Память для них выделяется перед началом выполнения программы, и во время выполнения программы не может быть изменена. По окончании программы, эта выделенная память автоматически освобождается.


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-05-30; Просмотров: 817; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.302 с.)
Главная | Случайная страница | Обратная связь