Построение круговой диаграммы и гистограммы - Pascal ABC
Формулировка задачи:
Помогите пожалуйста в следующем
Решение задачи: «Построение круговой диаграммы и гистограммы»
textual
Листинг программы
Uses GraphAbc;
Const vv: array[1..4] of integer = (979, 948, 610, 580);
nz: array[1..4] of string = ('Анхель','Тугела', 'Кукенад', 'Сатерлинд');
col: array[1..4] of integer = (clYellow,clLime,clBrown,ClRed);
v: array [1..6] of string=('Утигард','Монгефоссен','Йосемите',
'Остре Мандола Фосс','Туссестренген','Киле');
p: array [1..6] of integer=(800,774,739,657,646,561);
Var r,i,n,m,s,x1,x2,h,xi,k1,no,nomax,u,u0,ss,j: integer;
sar,k:real;
z:string;
Begin
setWindowSize(800,650);
r:=loadpicture('1.jpg');
drawpicture(r,0,300,500,350);
s:=0;
h:=Round((600)/6);
for i:=1 to 5 do {нахождение наибольшего значения и ближайшего к среднему площади}
s:=s+p[i];
sar:=s/6;
SetPenWidth(3);
line(50,250,750,250);
line(50,10,50,300); {рассчет ширины прямоугольника для каждого месяца}
no:=1;
For i:=2 to 5 do
if abs(sar-p[i])<abs(sar-p[no]) then no:=i;
nomax:=1;
For i:=2 to 5 do
if abs(p[i]-p[no])>abs(p[i]-p[nomax]) then nomax:=i;
k1:=200 div round(abs(p[no]-p[nomax])); {вычисление коэффициента масштабирования по оси OY}
xi:= 60; {Строим столько прямоугольников, сколько есть }
For i:=-2 to 4 do
begin
S:=i*50;
Str(S,z);
Line(48,(250 div 5)*i,52,(250 div 5)*i);
TextOut(5,(250 div 5)*(5-i)-10,z);
end;
for i:=1 to 6 do
begin
If p[i]>p[no] then SetBrushColor(clGreen)
else SetBrushColor(clRed); {закраска прямоугольника диаграммы зеленым цветом}
Rectangle(xi,250-(p[i]-p[no]),xi+h,250);
SetFontSize(14); {Указываем размер цифр - 14}
SetFontStyle(fsBold); {Устанавливаем стиль шрифта - жирный}
str(p[i]-p[no],z);
SetFontColor(clwhite);
If p[i]>p[no] then TextOut(xi+(h div 10)+20,200,z) else
If p[i]<p[no] then TextOut(xi+(h div 10)+20,270,z);
SetBrushColor(clwhite); {Отменяем цвет закраски области на белый}
SetFontColor(clRed); {Устанавливаем цвет шрифта - красный}
if i mod 2=0 then TextOut(xi+(h div 40),70,v[i]) {Выводим текст под каждым прямоугольником диаграммы}
else TextOut(xi+(h div 10),40,v[i]);
xi:=xi+h+10;
end;
SetFontColor(clblack);
str(round(sar),z);
z:='Средняя высота = '+z;
TextOut(70,270,z);
z:='Наиболее близка к среднему значению высота водопада '+v[no];
TextOut(70,10,z);
ss:=0; u0:=0;
SetFontSize(16);
for j:=1 to 4 do ss:=ss+vv[j]; { вычисление суммарной площади }
for j:=1 to 4 do
begin
SetBrushColor(col[j]);
u:=u0 + round(vv[j]*360/ss)+1;
Pie(650,500,140,u0,u); { Рисование сектора }
u0:=u;
end;
SetBrushColor(col[1]);
textout(650,400,nz[1]);
textout(650,430,inttostr(vv[1]));
SetBrushColor(col[2]);
textout(550,450,nz[2]);
textout(550,480,inttostr(vv[2]));
SetBrushColor(col[3]);
textout(600,570,nz[3]);
textout(600,600,inttostr(vv[3]));
SetBrushColor(col[4]);
textout(670,510,nz[4]);
textout(690,540,inttostr(vv[4]));
End.
Объяснение кода листинга программы
В данном коде используется библиотека GraphABC для построения круговой диаграммы и гистограммы. Переменные:
- vv: массив из 4 чисел, представляющих собой сумму площадей секторов диаграммы (строка 2).
- nz: массив из 4 строк, представляющих названия секторов диаграммы (строка 2).
- col: массив из 4 чисел, представляющих цвета секторов диаграммы (строка 2).
- v: массив из 6 чисел, представляющих собой суммы площадей секторов диаграммы (строка 2).
- p: массив из 6 чисел, представляющих собой значения месяцев (строка 2).
- r, i, n, m, s, x1, x2, h,xi,k1,no,nomax,u,u0,ss,j: переменные для работы с графиком (строка 2).
- sar,k: переменные для работы с прямоугольниками диаграммы (строка 2).
- z: строка для вывода информации о средней высоте и ближайшем к среднему значению высот водопада (строка 2). Код начинается с инициализации оконных параметров и загрузки изображения (строки 3-4). Затем происходит расчет ширины прямоугольников для каждого месяца (строки 5-6). Далее идет цикл, в котором происходит построение круговой диаграммы. Для каждого месяца вычисляется коэффициент масштабирования по оси OY и строятся прямоугольники диаграммы (строки 7-11). Внутри цикла происходит вывод информации о каждом месяце, включая размер суммы площадей секторов и название сектора (строки 12-16). Затем происходит построение гистограммы. Для каждого значения суммы площадей секторов вычисляется цвет закраски прямоугольника и выводится текст с этим значением (строки 17-22). После этого вычисляется средняя высота и выводится информация о ней и ближайшем к среднему значению высот водопаде (строки 23-27). В конце кода выводятся значения суммы площадей секторов для каждого месяца (строки 28-32).