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