- •Министерство образования российской федерации
- •Var X,y: real;
- •Var X,y: real;
- •Var t:integer; p:char;
- •0..17: Write('детство');
- •20..30: Write('молодость');
- •31..54: Write('зрелость');
- •Var s:char;
- • Оператор цикла с предусловием имеет вид
- •Program p5_8;
- •Var y,X,z: integer;
- •Var I,j:integer; X,y,r:real;
- •Var I,j: integer;
- •Var n,I,j:integer; s,y,sr:real; X: array [1..10,1..5] of real;
- •Var I,j,n,m: integer;
- •X:array [1..10] of integer;
- •Var n,I,j,st,kl,k:integer;
- •Var st: char; sm: string[32]; ss: string;
- •Var n:integer;y:string;
- •Var k,I:integer; X: string;
- •Var X:string[1]; d:string; I:integer;
- •Var X:vr; y:array [1..5] of vr;
- •Ввод и вывод информации для типизированных и текстовых файлов производится процедурами:
- •X,y:real;
- •X,y:real; I:integer;
- •Im: string[4];
- •I: integer;
- •Im: string[4];
- •I: integer;
- •Im:string[4]
- •Im:string;
- •Var d,I,m,rx,ry:integer;
- •Var d,m,rx,ry:integer;
- •X,y,xn,xk,ymin,ymax,dx:real;
- •Ответы на тестовые задания, имеющиеся в тексте пособия:
- •& Тесты по курсу
- •Тираж: 150. Заказ №
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 и раскрасить ее.