Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Степан / Информатика / Паскаль (Попов).doc
Скачиваний:
56
Добавлен:
20.04.2015
Размер:
828.93 Кб
Скачать

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{окружности}

program P8_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

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)); {ось X}

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

closegraph;

end.

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

end;

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

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

end.

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

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

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

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

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

Задания для самостоятельного решения (рис. 8.3).

8.1. Решить аналогичную задачу, но осьYнаправить горизонтально, аX– вертикально (рис. 8.3-1).

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

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

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

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