Побудова
діаграм h2>
Нехай є
послідовність позитивних дійсних чисел a1, a2, ..., an,
позначає результати будь-яких вимірювань (наприклад, висоти вершин гір над
рівнем моря, площі держав, середні оцінки учнів класу і т.д.).
Потрібно побудувати візуалізоване представлення цієї послідовності з
метою порівняння отриманих результатів. У таких випадках використовують діаграми. P>
1. Кругові
діаграми h2>
У кругової
діаграмі кожного елемента послідовності відповідає сектор, градусна
міра якого пропорційна величині елемента. p>
Для побудови
кругової діаграми необхідно підсумувати всі елементи послідовності,
після чого знайти відносини кожного з елементів, до отриманої суми (так буде
обчислено, яку частину кола потрібно поставити у відповідність для розрахунку, --
тобто розраховуються частки кола, що припадають на цю величину, якщо все коло
прийняти рівним 1). Всі ці розрахунки можна уявити формулами . Потім ці
відносні величини переводяться в градуси: , після чого
можна приступати до побудови діаграми. p>
Алгоритм в цьому
випадку буде таким: p>
обчислити суму
елементів послідовності; p>
знайти величину
сектору, що відповідає кожній величиною; p>
побудувати все
сектори у графічному режимі (у результаті має вийти повне коло).
Бажано кожен сектор будувати своїм кольором, або використовувати різну
штрихування, якщо сектори одноколірні. p>
Програма
побудови кругової діаграми з цього алгоритму представлена нижче: p>
(Круговая
діаграма (с) А.П. Шестаков, 2001) p>
program Kr_D; p>
Uses Graph; p>
Var a, S: Real; I: Byte; G, M: Integer; p>
Xc, Yc, R: Integer; (координати центру
кола і його радіус) p>
F: Text; (файл містить дані для
побудови діаграми) p>
Alpha: Integer; (кут, відповідний
черговий величиною) p>
SAngle: Integer; Stroka: String; p>
Begin p>
Assign (F,
'1. Dat '); Reset (F); p>
S: = 0; (сума елементів
послідовності) p>
While Not Eof (F) Do p>
begin
Readln (F, a); S: = S + a end; p>
reset (f); G
: = Detect; M: = 0; p>
initgraph (G, M,''); Xc: = GetMaxX Div 2; Yc: = GetMaxY Div 2; p>
R: = 100;
SAngle: = 0; i: = 1; p>
While Not
Eof (f) Do begin p>
Readln (F, a); Alpha: = round (A/S * 360); (обчислення кута) p>
setcolor (i mod 16 + 1); setfillstyle (1, i mod 16 + 1); p>
(побудова
сектору, що відповідає величині) p>
sector (Xc, Yc, SAngle, SAngle +
Alpha, R, R); p>
SAngle
: = SAngle + Alpha; i: = i + 1; p>
(зазначимо, якого кольору яка величина
відповідає) p>
bar (Xc 200,
Yc-250 + (i-1) * 20, Xc 220, Yc-250 + (i-1) * 20 +15); p>
str (a: 8:2, stroka); p>
outtextxy (Xc + 230, Yc - 250 + 5 + (i - 1) * 20, stroka) end; p>
readln;
close (F); closegraph End. p>
Результат
роботи програми для вказаного на малюнку набору чисел: p>
p>
2.
Стовпчасті діаграми h2>
Для побудови
діаграми виділимо на екрані прямокутну область з координатами відповідно
верхнього лівого кута (Xlv, Ylv) і правого нижнього (Xpn, Ypn). Висота стовпця
діаграми, що відповідає максимальному елементу послідовності, буде
збігатися з висотою прямокутника. Ширина стовпця буде залежати від кількості
елементів послідовності: чим більше компонент, тим меншою буде ширина.
Таким чином, для побудови діаграми потрібно визначити кількість компонентів
послідовності і максимальний елемент послідовності. Висота vi
чергового стовпця діаграми на екрані буде визначатися формулою де xmax --
максимальний елемент послідовності, xi - черговий елемент
послідовності. p>
Алгоритм
побудови діаграми наступний: p>
визначити
кількість елементів послідовності і її максимальний елемент; p>
згідно
зазначеній формулі побудувати стовпці діаграми. Їх ширина на екрані може бути
розрахована за формулою де n --
кількість елементів послідовності. p>
Програма
побудови стовпчастий діаграми з цього алгоритму представлена нижче: p>
(Стовпчасті
діаграма (с) А.П. Шестаков, 2001) p>
program Stol_D; p>
Uses Graph; p>
Var a, xmax: Real; I, n: Byte; G, M: Integer; p>
F: Text; (файл містить дані для
побудови діаграми) p>
Stroka: String; p>
Xlv, Ylv, Xpn, Ypn: Integer; (координати
вікна виводу діаграми) p>
Begin p>
Assign (F,
'1. Dat '); Reset (F); p>
if not
eof (f) then begin readln (f, xmax); n: = 1 end else n: = 0; p>
While Not
Eof (F) Do p>
begin
Readln (F, a); if a> xmax then xmax: = a; n: = n + 1 end; p>
reset (f); G
: = Detect; M: = 0; p>
initgraph (G, M,''); Xlv: = 50;
Ylv: = 50; Xpn: = GetMaxX-100; Ypn: =
GetMaxY-50; p>
i: = 0; (номер стовпчика) p>
While Not Eof (f) Do p>
begin p>
Readln (F, a); p>
setcolor (i mod 16 + 1); setfillstyle (1, i mod 16 + 1); p>
(черговий стовпець) p>
bar (round (Xlv + i * (Xpn-Xlv)/n),
Ypn, p>
round (Xlv + (i +1) * (Xpn-Xlv)/n), round (Ypn-(Ypn-Ylv)/xmax * a )); p>
i: = i + 1; p>
(зазначимо, якого кольору яка величина
відповідає) p>
bar (getMaxx-70,
50 + (i-1) * 20, getMaxx-50, 50 + (i-1) * 20 +15); p>
str (a: 8:2, stroka); p>
outtextxy (getMaxx-40, 50 + (i-1) * 20 +8, stroka); p>
end; p>
readln;
close (F); closegraph p>
End. p>
Результат
праці програми для вказаного на малюнку набору чисел: p>
p>
Для кращого
сприйняття діаграми було б доцільно побудувати вертикальну вісь з
розміткою по ній, що в даній програмі відсутня. p>
3. Лінійні
діаграми h2>
При побудові
лінійних діаграм кожної величиною відповідає точка, розташована на
певній висоті відносно початку відліку (висота розраховується так само,
як і при побудові стовпчастих діаграм), всі крапки з'єднуються лініями. У
результаті виходить ламана. Такого роду діаграми найчастіше ладу в тих
випадках, коли необхідно візуалізувати динаміку зміни величин. p>
Програма
аналогічна програмі побудови стовпчастих діаграм і наведена нижче. p>
(Лінійна
діаграма (с) А.П. Шестаков, 2001) p>
program Stol_D; p>
Uses Graph; p>
Var a, xmax: Real; I, n: Byte; G, M: Integer; p>
F: Text; (файл містить дані для
побудови діаграми) p>
Stroka: String; Yn, Yk: Integer; p>
Xlv, Ylv, Xpn, Ypn: Integer; (координати
вікна виводу діаграми) p>
Begin p>
Assign (F,
'1. Dat '); Reset (F); p>
if not
eof (f) then begin readln (f, xmax); n: = 1 end else n: = 0; p>
While Not
Eof (F) Do p>
begin
Readln (F, a); if a> xmax then xmax: = a; n: = n + 1 end; p>
reset (f); G
: = Detect; M: = 0; p>
initgraph (G,
M,''); Xlv: = 50; Ylv: = 50; Xpn: =
GetMaxX-100; Ypn: = GetMaxY-50; p>
line (xlv,
ylv, xlv, ypn); line (xlv, ypn, xpn, ypn); p>
i: = 0; (номер точки) p>
readln (f, a); p>
Yn: =
round (Ypn-(Ypn-Ylv)/xmax * a); p>
str (a: 5:1, stroka); p>
outtextxy (round (Xlv + i * (Xpn-Xlv)/n) -20,
Ypn 20, stroka); p>
While Not
Eof (f) Do p>
begin p>
setcolor (i mod 16 + 1); setfillstyle (1, i mod 16 + 1); p>
(зазначимо, якого кольору яка величина
відповідає) p>
Readln (F, a); p>
Yk: =
round (Ypn-(Ypn-Ylv)/xmax * a); p>
(чергова лінія) p>
line (round (Xlv + i * (Xpn-Xlv)/n),
Yn, p>
round (Xlv + (i +1) * (Xpn-Xlv)/n), Yk); p>
i: = i +
1; p>
str (a: 5:1, stroka); p>
outtextxy (round (Xlv + i * (Xpn-Xlv)/n) -20, Ypn 20, stroka); p>
Yn: = Yk; (запам'ятовуємо положення черговий
точки) p>
end; p>
readln;
close (F); closegraph p>
End. p>
Результат
роботи програми для вказаного на малюнку набору чисел: p>
p>
Всі
представлені тут програми можуть бути об'єднані в одну програму із загальним
меню, де користувачеві надається можливість вибрати вид діаграми. p>
Список
літератури h2>
Для підготовки
даної роботи були використані матеріали з сайту http://www.comp-science.narod.ru/
p>