Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УПП Программирование 2102,2202.doc
Скачиваний:
17
Добавлен:
20.04.2015
Размер:
760.32 Кб
Скачать

Var d,I,m,rx,ry:integer;

begin

initgraph(d,m,''); {переход в графику}

ry:=getmaxy; rx:=getmaxx; {размер экрана}

line(0,0,rx,ry); {первая диагональ}

line(0,ry,rx,0); {вторая диагональ}

for i:=1 to 4 do begin {окружности}

circle(rx div 2,ry div 2,50*i);

end;

readln; {пауза для просмотра результата}

closegraph; {закрытие графического режима}

end.

Пример 11-2. Вывести на кран функцию f(x)=sin(x)*x вместе с коорди­нат­ными осями. Аргумент Х изменяется от начального значения Xn=0 до ко­неч­ного Xk=20 с шагом dx=0.01. Главная проблема заключается в масшта­биро­вании исходной “натуральной” функции F в ее экранный вид Fэ: F(X)Fэ(Xэ). Здесь следует учесть, что экранные координаты расположены (рис. 11-2) не так как мы привыкли. Точка 0э,0э находится в его верхнем левом углу (а не в цент­ре), ось Yэ идет вниз (а не вверх), ось Xэ – идет вправо. Т.о. для адекватного отображения графика на экране нам понадобится реализовать три действия:

1. Масштабировать диапазоны D изменения натуральных Х и Y к желаемым экранным, т.е. привести DХ и DY к DХэ и DYэ соот­ветственно с помощью масштабных коэффициентов Mx=DХэ/Dx и My=DYэ/DY.

2. Перенести координаты так, чтобы максимум Yэ приходился на верхнюю границу экранной области, а начальное значение X – на левую ее границу.

3. Перевернуть направление графика. Поскольку направление экран­ной оси ординат противоположно натуральному, знак изменения Yэ должен быть противоположен знаку Y.

Программа имеет следующую структуру. 1). Описывается вычис­ляемая функция f(x). 2). Выясняются размеры экрана, параметры аргумента, про­водится вертикальная координата. 3).Находятся макси­мальные значения Y. 4). Выполняется масштабирование переменных (msy и msx). Эти значения ука­зывают, сколько пикселей приходится на единицу изме­нения Y и Х соот­ветственно. 5). Выполняется собс­твенно рисование кривой. Здесь оно выпол­нено двумя способами – точками и отрезками линий. Проверьте результат в обоих случаях, поочередно убрав одну из них. 6). Проводится ось Х. Результат должен быть похож на рис. 11-3.

PROGRAM P11_2;

uses graph;

Var d,m,rx,ry:integer;

X,y,xn,xk,ymin,ymax,dx:real;

msy,msx:real;

FUNCTION f(x:real):real; {вычисление функции}

begin

f:=sin(x)*x

end;

BEGIN {собственно начало program p11_2}

initgraph(d,m,''); {переход в графический режим}

ry:=getmaxy+1; rx:=getmaxx+1; {размер экрана}

line(0,0,0,ry); {ось Y}

xn:=0; xk:=60; dx:=0.01; {параметры аргумента}

x:=xn; {начальное Х}

ymin:=f(x); ymax:=f(x);

while x<=xk do begin {поиск максимума и минимума Y}

y:=f(x);

if y>ymax then ymax:=y;

if y<ymin then ymin:=y;

x:=x+dx; {изменяем Х}

end;

msy:=ry/abs(ymax-ymin); {масштаб по Y}

msx:=rx/abs(xk-xn); {масштаб по X}

x:=xn; {начальное Х}

while x<=xk do begin {рисование}

y:=f(x);

putpixel(round((x-xn)*msx),-round((y-ymax)*msy),2); {точки}

lineto(round((x-xn)*msx),-round((y-ymax)*msy)); {отрезки}

x:=x+dx; {изменяем Х}

end;

line(0,-round(-ymax*msy),rx,-round(-ymax*msy)); {ось Х}

readln; {пауза для просмотра картинки}

closegraph;

end.

Контрольные задания.

а). Решить аналогичную задачу, но ось Y направить горизонтально, а Х – вертикально.

б). Известна зарплата (массив zar[1..5]) работников (N=5) бригады. Построить диаграмму из вертикальных линий.

в). Условие то же, но диаграмма столбиковая. Замечание. Ширина столбца оп­ределяется делением ширины экрана на число рабочих. Однако, если ширина столбца не кратна размеру экрана, крайний столбец будет отображен не полностью. При программировании следует учесть этот фактор, уменьшив ширину столбца.

г). Известна зарплата (массив zar[1..5]) и премия (массив p[1..5]) каждого из N=5 работников бригады. Построить совмещенную столбиковую диаграмму (на столбике зарплаты стоит столбик премии). Премия должна быть заштри­хована командой SetFillStyle.

д). Для той же задачи построить секторную диаграмму зарплат.

Подсказка. Сначала следует найти сумму всех зарплат s. Затем перевести зарплату каждого работника в градусы его сектора на диаграмме zar[i]/s*360 и запомнить ее в массиве zar[1..5]. Далее вычислить начальный и конечный угол каждого радиуса каждого сектора, нарисовать диаграмму командой PieSlice и раскрасить ее.