Program Example_614;
Uses graph; {Підключення бібліотек}
Const
Step=25; {Крох між поділками на осях}
Var GraphDriver,GraphMode:integer;
x,у:integer; {x,y - координати центру декарт. сист. коорд.}
r:integer; {r - відстань від центру координат до чергової поділки}
S:string; {S - рядок, де зберігається символьне значення підпису для поділки)
Begin
Randomize;
GraphDriver:=VGA; {Ініціалізація графічного режиму}
GraphMode:=VGAHi;
InitGraph(GraphDriver,GraphMode,’’); {Малювання осей}
line(0,240,640,240); line(320,0,320,480);
{Малювання стрілочок на кінцях осей}
line(630,235,640,240); line(630,245,640,240);
line(315,10,320,0); line(325,10,320,0);
{Підписи на осях}
outtextxy(330,5,’Y’); outtextxy(630,220,’X’) ;
x:=320; y:=240; r: =0; {Малювання та підпис поділок на вісі X}
while x+r<640 do
begin
line(x+r,y-4,x+r,y+4); line(x-r,y-4,x-r,y+4);
r:=r+step;
str(r div step, S);
settextjustify (1,1);
outtextxy(x+r,y+10,S);
s:=’-’+S;
outtextxy(x-r,y+10,S) ;
end;
r:=0; {Малювання та підпис поділок на вісі Y}
while y+r<4 80 do
begin
line(x+4,y+r,x-4,y+r); line(x+4,y-r,x-4,y-r);
r:=r+step;
str(r div step, S);
settextjustify (1,1); outtextxy(x-10,y-r,S);
s:=’-’+S; outtextxy(x-10,y+r,S);
end;
Readkey;
Closegraph; {Закриття графічного режиму}
End.
ЗАДАЧА № 616
Умова: Стовпчаста діаграма - це послідовно зображені прямокутники однакової ширини, що розташовані на одному горизонтальному рівні. Висота прямокутників пропорційна значенням деякої числової послідовності. Побудувати стовпчасту діаграму за даними п цілими значеннями. Для наочності стовпчики зафарбувати різними кольорами.
Розв ‘язок: Для побудови діаграми, по-перше, необхідно задати кількістьстовпчиків, тобто кількість числових значень, по яких буде будуватисядіаграма, а, по-друге, - самі значення. В даному алгоритмі всі ці величинивводяться з клавіатури, хоча можна передбачити і інші методи, наприклад,заповнення генератором випадкових чисел. Після введення числових данихслід розрахувати коефіцієнти пропорційності по осях Хта Y, щоб отриматималюнок на весь екран. Врахуємо, що максимальний розмір по осі X - 640 пікселів, а по осі Y - 480 пікселів. Тоді коефіцієнт по осі X можнаобчислити за формулою
де SizeX— коефіцієнт пропорційності, N— кількість стовпчиків на діаграмі.
Константне значення 5 від дробу віднімається, щоб розділити стовпчики між собою хоча б на 5 пікселів (це значення можна змінити).
По осі Y знайти коефіцієнт пропорційності важче, тому що для цього слід спочатку визначити максимальне значення, що використовується для побудови діаграми. Для знаходження максимуму використовуємо стандартний алгоритм. Тут можна запропонувати дітям згадати цей алгоритм самостійно. Після знаходження максимуму знаходимо коефіцієнт пропорційності по осі Y за очевидною формулою
де SizeY- шуканий коефіцієнт, Мах - максимальне значення з масиву.
Обидва шукані коефіцієнти пропорційності округлюємо функцією round, тому що екранні координати не можуть бути дробовими, а після цього нормалізуємо значення масиву множенням на коефіцієнт SizeY.
Після підготовки даних можна побудувати стовпчасту діаграму. Кожен її елемент будується процедурою Ваг, що малює зафарбований прямокутник, колір якого задається процедурою SetFillStyle. Очевидно, що ширина кожного стовпчика буде дорівнювати SizeX - 5, тому початкова координата по осі А’дорівнює (і - l)*SizeX, а кінцева — i*SizeX - 5, де і - змінна циклу, що рахує номер чергового стовпчика. Початкова координата по осі Y буде максимальною, тобто 480, а кінцева координата дорівнювати різниці між 480 та елементом масиву.
Програма має наступний вигляд:
Program Example_616;
Uses graph;
Var GraphDriver,GraphMode:integer;
N,i,Max :integer;
A:array [1. .100] of integer; {Масив значень побудови діаграми}
SizeX, SizeY : integer;
{Коефіцієнти пропорційності no відповідних осях}
Begin
ClrScr;
Write (‘Введіть кількість стовпчиків у діаграмі: ‘);
ReadLn (N); {Введення значень для побудови діаграми}
for i:=l to N do
begin Write (‘Введіть A[‘,i,’]:’); ReadLn (A[i]); end;
Randomize;
GraphDriver:=VGA; {Ініціалізація графічного режиму}
Читать дальше