Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по программированию..pdf
Скачиваний:
10
Добавлен:
15.11.2022
Размер:
12.2 Mб
Скачать

Однако нам неизвестен коэффициент К. Его можно найти, используя условие

Рзо = 70.

Для этого будем делать “обратные” подстановки:

Рзо = (1-А-)-й 9 = (1 -К )‘2Р28 = {l-K f-p 21 = ... = {\ -К )гй-ро = (1-АГ)30-9б.

Из равенства

(1 - К )30•96 = 70

находим:

(щУЗО 1 - К = {% )

Далее программирование становится тривиальным.

Var I Byte; {exampl9.pas} Р, Q Real;

Begin

P:= 96;

Q:* Exp(l / 30 * Ln(70 / 96)); For I := 1 To 29 Do

Begin

P := Q * P;

 

WriteLnCl, »-й день -

P

5 3, » гг’ )

 

End

 

 

 

End.

 

 

 

Задания

1.

Рекуррентная последовательность определена следующим обра­

зом:

( 1,

 

если г = 0,

 

 

 

а* ~~ | а,_! - г +

i ,

если г > 0.

Для данного натурального п получить значение ап.

2.

Дана последовательность:

 

 

 

Г1,

если г = 0 и i = 1,

 

а*= | а*_24-

если * > 1*

Вычислить произведение элементов с 1-го по 20-й.

3.

Используя рекуррентный подход, вычислить сумму многочлена

10-й степени по формуле Горнера, где х — данное вещественное число.

Ют10 + 9х9 + 8т8 Н------ h 2х2 + х =

Здесь целая переменная Driver определяет тип графического драйвера; целая переменная Mode задает режим работы графического драйвера; Path — выражение типа String, содержащее маршрут поиска файла графического драйвера.

Список констант модуля Graph, определяющих типы драйверов и режимы, приведен в табл. 1 Приложения 2.

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

Uses

Graph;

 

 

Var

D river,

Mode

Integer;

begin

 

 

 

 

Driver

:=

VGA;

{драйвер}

Mode :=

VGAHi;

[режим работы}

InitG raph(Driver,

Mode, >C:\TP\BGI>);

Здесь указывается, что файл EGAVGA.BGI с драйвером для VGAмонитора находится в каталоге C:\TP\BGI. Режим VGAHi соответ­ ствует графической сетке 640 х 480 с палитрой из 16 цветов.

Возможно также автоматическое определение типа драйвера и уста­ новка режима. Этот прием позволяет программе работать с разными типами мониторов, не внося изменений в текст:

Driver := D etect;

InitG raph(Driver, Mode, ,C:\TP\BGIi ) ;

При этом автоматически устанавливается режим с наибольшей раз­ решающей способностью и цветностью.

После окончания работы в графическом режиме следует вернуться

втекстовый режим экрана.

Вмодуле Graph процедура возвращения в текстовый режим имеет заголовок:

Procedure CloseGraph;

Ц вет фона и цвет рисунка. На цветном мониторе можно ме­ нять окраску экрана. Установленная окраска экрана называется цве­ том фона. Рисунок на этом фоне наносится с помощью разнообразных линий: прямых, окружностей, прямоугольников, ломаных и пр. Цвета этих линий также могут меняться.

В табл. 2 Приложения 2 приведены имена констант, определяющих 16 цветов палитры для мониторов типа EGA, VGA.

Заголовок процедуры установки цвета фона:

Procedure SetBkColor(Color Word);

Здесь Color — выражение целого типа, определяющее номер цвета фона.

Заголовок процедуры установки цвета линий:

Procedure SetColor(Color Word);

Заметим, что если в качестве номера цвета линии указывается О, то это всегда совпадает с цветом фона (невидимая линия).

Если необходимо очистить графический экран (стереть рисунок), то для этого используется процедура очистки экрана.

Заголовок процедуры очистки экрана:

Procedure ClearDevice;

В результате выполнения этой процедуры экран заполняется уста­ новленным цветом фона.

Графические координаты. Положение каждого пикселя графиче­ ской сетки однозначно определяется указанием его координат. Графи­ ческие оси координат расположены на экране т* <, как показано на сле­ дующем рисунке:

О

X

640

Горизонтальная ось X направлена слева направо, вертикальная ось Y — сверху вниз. На рисунке указаны предельные графические коор­ динаты, соответствующие режиму VGAHi.

Можно определить максимальные координаты по осям, соответ­ ствующие данному драйверу. Это делается с помощью двух целочис­ ленных функций:

Function GetMaxX;

Function GetMaxY;

Графическое окно. Область вывода изображения может быть ограничена любым прямоугольником в пределах экрана. Такая область называется графическим окном. Существует процедура, устанавлива­ ющая положение графического окна на экране.

Заголовок процедуры назначения графического окна:

Procedure

SetViewPort(XI, Y l, Х2, Y2 Integer; Clip Boolean);

Здесь (X I ,Y l)

— координаты левого верхнего угла окна; (Х2,У2) —

координаты правого нижнего угла окна; Clip — ограничитель фигур; если C lip = True, то все построения производятся только в пределах окна, иначе — могут выходить за пределы окна.

После установки окна координаты точек внутри него отсчитыва­ ются от его верхнего левого утла.

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

Procedure MoveTo(X, Y In teger);

Здесь Х ,У — устанавливаемые координаты курсора. Координаты указываются относительно левого верхнего угла окна или, если окно не установлено, экрана.

Процедура “поставить точку” — основная процедура получения изображения, поскольку любой рисунок складывается из точек. Со­ стояние светящейся точки определяется

координатами точки на экране;

цветом точки.

Заголовок процедуры выставления точки на графическом экране:

Procedure PutPixel(X, Y Integer; Color Word);

Здесь Х ,У — координаты точки, Color — цвет точки.

П ример 1. Следующая программа устанавливает по центру Экрана графическое окно размером 100 х 100, заливает его желтым фоном и заполняет синими точками, расположенными через 4 позиции.

Uses

Graph;

Integer;

 

Var

Driver, Mode

Integer;

Begin

X, Y, XI, Yl,

X2, Y2, Xc, Yc

 

 

 

{________ Инициализация графического режима_________________ >

Driver :® Detect;

InitGraph(Driver, Mode, ^iXTPXBGlO ;

{_______ Определение координат центра экрана__________ _____ }

Xc :* GetMaxX Div 2;

Yc := GetMaxY Div 2;

{_______ Определение координат графического окна___________ }

XI

:» Xc

- 50

Yl

; s

Yc

- 50

X2

; s

Xc

+

50

Y2

; s

Yc

+

50

{____

Установка графического окна__________

_________ >

 

SetVievPortOU, Yl, X2, Y2, true);

_________ >

{____ __ Установка цвета фона н очистка экрана__

 

SetBkColor(Yellow);

 

 

{____

ClearDevice;

.... _

_________>

Расстановка точек в окне

 

For X := 1 То 25 Do

 

 

 

For Y :» 1 То 25 Do

 

 

PutPixel(4 * X, 4 * Y, Blue);

Задержка изображения на экране до нажатия <ЕНТЕЯ>_} ReadLn;

{_____^„.Вкхоц из графического режима в символьной._________> CloseGraph;

End.

Графические примитивы. Хотя любое изображение можно по­ строить из точек, но программировать получение сложного рисунка или чертежа, используя только процедуру “Поставить точку” , было бы слишком неудобно и громоздко. В любом графическом пакете суще­ ствуют процедуры рисования основных геометрических фигур: пря­ мых линий, окружностей, эллипсов, прямоугольников и др. Такие фи­ гуры называют графическими примитивами.

Рассмотрим несколько основных процедур рисования графических примитивов, имеющихся в модуле Graph.

Линия с заданными координатами концов (X I, Y1) и (Х2,У2):

Procedure Line(Xl, Yl, Х2, Y2

Integer);

Линия от текущей точки до точки с координатами X , Y :

Procedure LineTo(X, Y Integer);

Линия от текущей точки до точки с заданными приращениями ко­ ординат DX, DY:

Procedure LineRel(DX, DY Integer);

Прямоугольник с заданными координатами верхнего левого угла (X I, У1) и нижнего правого угла (Х2,У 2);

Procedure Rectangle(XI, Yl, Х2, Y2 Integer);

Окружность с центром в точке (X, У) и радиусом R в пикселах:

Procedure Circle(X, Y Integer; R Word);

Дуга окружности с центром в точке (Х ,У ), радиусом R, начальным

углом ВедА и конечным углом EndA.

Углы измеряются в градусах

против часовой стрелки от направления оси X .

Procedure Arc(X, Y Integer;

BegA, EndA, R Word);

Эллипсная дуга с центром в точке Х ,У с начальным и конечным углами BegA и EndA, горизонтальным радиусом RX и вертикальным радиусом R Y:

Procedure EllipseCX, Y

Integer; BegA, EndA, RX, RY

Word);

Пример 2. Составим программу, рисующую голову робота так, как показано на рисунке.

100

150

250

300

Рисунок содержит два прямоугольника, две окружности, две дуги, эллипс и три прямые линии. Заранее продумываются все координаты и размеры элементов рисунка.

Uses

Graph;

Integer;

 

 

 

 

 

Var

Driver, Mode

 

 

 

 

 

Begin

 

 

 

 

 

 

 

 

 

 

{-------- Инициализация графического режима_________________ >

 

Driver := Detect;

 

 

>C:\TP\BGI’);

 

 

 

 

InitGraph(Driver, Mode,

 

 

 

 

SetColor(White);

 

 

 

{ белый цвет рисунха }

 

SetBkColor(Black);

300,

300);

{ черный цвет фона }

 

Rectangle(100,

100,

{ голова

}

 

 

Circle(150,

170,

30);

 

{ левый глаз >

}

 

Circle(250,

170,

30);

 

{ правый глаз

 

Arc(150, 170, 45, 135, 40);

{ левая

бровь

}

 

Arc(250, 170, 45, 135, 40)';

{ правая

бровь

}

 

Ellipse(200, 250, 0, 359, Ю, 20);

{ нос

>

 

 

 

Rectangle(130,

280,

270,

290);

{ рот

}

 

 

 

MoveTo(100,

300);

 

 

{ три

{ установка вниз влево >

 

LineTo(50,

350);

 

 

}

 

 

 

 

LineTo(350,

350);

 

 

{ линии

}

 

 

 

 

LineTo(300,

300);

 

Red);

{ шеи

}

>

 

 

 

PutPixel(150,

170,

{ левый зрачок

 

 

 

PutPixel(250,

170,

Red);

{ правый зрачок

}

 

 

ReadLn;

 

 

 

 

{ задержка }

 

 

 

End.

CloseGraph;

 

 

 

 

{ выход из I.афики >

 

 

 

 

 

 

 

 

 

 

 

В приведенном примере все линии рисуются сплошными со стан­ дартной толщиной. Модуль Graph позволяет управлять стилем линии (сплошная, пунктирная, точечная и пр.) и толщиной. Для этого суще­ ствует процедура SetLineStile (см. Приложение 2).

Закраски и заполнения. Среди графических примитивов суще­ ствуют закрашенные области. Цвет закраски определяется процедурой SetColor. Кроме того, можно управлять рисунком закраски (типом заполнения). Это может быть сплошная закраска, заполнение редкими точками, крестиками, штрихами и пр.

В табл. 3 Приложения 2 описаны константы для указания типа за­ полнения.

Процедура определения типа заполнения (F ill) и цвета заполнения

(Color,) имеет следующий заголовок:

Procedure SetFillStyle(Fill, Color Word);

Заполненная прямоугольная область с заданными координатами

углов:

Мы рассмотрим лишь один простейший вариант математической графики — построение графика функции.

Требуется составить программу построения на экране дисплея гра­ фика функции

V = F(x).

Решение этой задачи удобно проводить в следующем порядке.

1.Определить границы значений аргумента, в пределах которых будет строиться график. Обозначим их Xmin — нижняя граница, Х тах

верхняя граница.

2.Для данной области значений аргумента определить предельные значения функции: У ^ и УшахЭти значения не обязательно должны быть точными. Они могут быть оценочными, соответственно, снизу и сверху.

3.Задать границы графического окна, в пределах которого будет рисоваться график: [Хдт^ Х д тах]^ [У&пнпУ&пах]- Поскольку в графиче­ ских координатах вертикальная ось направлена вниз, то У <7min > Удтвх.

Таким образом, мы имеем две системы координат: (Х ,У ), которые назовем математическими координатами (в литературе чаще исполь­ зуют термин “мировые координаты” ) и (Xg,Yg) — графические ко­ ординаты. Нетрудно получить формулу, связывающую графические и математические координаты:

Хд X ^mm

-^<7max

^9тти/ v

v

\

Шах

Y

 

—^Vmin;

 

min

 

 

 

Уд У9т\п

Уд max ~

^ Я ш п

( \ г

у

\

V

V

V-1

•‘ min/

 

1max ~

1min

 

 

 

Здесь квадратные скобки означают округление до целого значения (функция round).

Построение графика функции может производиться либо точеч­ ным методом, либо кусочно-линейным. При первом способе график строится как последовательность точек, расположенных максимально близко. Производится “попиксельный” перебор значений аргумента в интервале [Х&ш^Х^шах] с выставлением точек с соответствующими У-координатами.

При кусочно-линейном методе задается математический шаг ДХ, рассчитывается последовательность значений (Х,-,1*):

Xi = X mia + i-AX,

Yi = F(X{),

_ n i

^

,---- ^max

^min

»

l u,i,...,n,

П -----------------

 

и график строится в виде отрезков прямых, проведенных через точки ( В Д ) , (Xi+uYl+г).

Пример. Составим программу построения графика функции

у= sinx

для х е [0;27г], используя первый (точечный) метод.

Из условия задачи следует, что Х т[п= 0, Х тйх = 2л. В этих пределах функция sinx меняется от -1 до 1. Поэтому Ущщ = -1, Ушах = 1.

Выберем следующие границы графического окна:

Xgmin = Ю»

Хдтах = 200,’

Y 9тт= 140;

УУшах —40.

10

200

Графпк строится в виде последовательности точек с математиче­ скими координатами

Х{ = Xnun + г •/г; Y{ = sin(Xi); г = 0,..., 190.

Шаг h выбирается минимально возможным, соответствующим шагу графической сетки:

Ь _ -^тах -^min _ ^7Г _

^ ш а х - ^ ш ш " 1 9 0 “ 95-

Приведенные выше формулы пересчета математических коорд^ат в графические примут вид:

X д = 10 -Ь

'200л-10

'

= 10 +

'95'

 

 

 

. п

Yg —140 + 40-140 (г+ 1) = 90 - [50F].

Вместе с графиком функции строятся оси координат. Ось X имеет координату Yg = 90, ось У с координатой Хд = 10.