Диаграммы облегчают сравнение различных данных, наглядно
представляют связь между ними.
Для представления числовых данных, которые сравниваются в пределах
одного периода, удобно использовать диаграммы в виде столбиков
— гистограммы.
Задача. Построить гистограмму
для сравнительного анализа выпуска деталей каким-то цехом за
n месяцев текущего года. Исходные данные получить случайным образом,
причем максимальное количество деталей не должно превышать 420.
Рассчитаем масштаб
для построения столбиков (прямоугольников). Ширина
прямоугольника h пусть будет равна Round((GetMaxX-150)/n). Высота
прямоугольника не должна превышать GetMaxY-20 = 430, так как ось ОХ
будет иметь такую ординату. Чтобы диаграмма не упиралась в самый
верх окна, возьмем высоту, равную 420. Среди введенных показателей
каждого месяца найдем наибольший (max). Тогда коэффициент
масштабирования k по оси OY будет равен 420 div
max.
Программа:
Uses Graph;
Var Driver,Mode:integer;
A:array[1..12] of integer; {массив количеств деталей,
созданных в прошлом месяце}
i,n,h,max,k,xi: integer;
z:string[3];
Procedure Grlnit;
Begin
Driver:=Detect;
InitGraph(Driver,Mode,''); IF GraphResult<>0 then begin
Writeln ('Ошибка инициализации!');
Writeln ('Работа программы прервана');
Halt(1)
end
End;
Begin
Write('Введите количество месяцев (< = 12):'); readln(n);
randomize;
for i:= 1 to n do
begin
A[i]:= Random(350); write(A[i]:5)
end;
writeln; Grlnit;
{построение окна с максимальными координатами}
SetViewPort(0,0,GetMaxX,GetMaxY,True);
clearviewport;
SetFillStyle(1,13);
Bar(0,0,GetMaxX,GetMaxY);
SetColor(15);
Rectangle(0,0,GetMaxX,GetMaxY);
{построение оси ОХx)
SetLineStyle{0,0,3); SetColor(2);
Line(10,GetMaxY-20,GetMaxX-10,GetMaxY-20);
{расчёт ширины прямоугольника}
h:= Round((GetMaxX-150)/n);
{нахождение наибольшего значения среди показателей}
max:=A[1];
For i:=2 to n do
IF A[i]>max THEN max:=A[i];
{вычисление коэффициента масштабирования по оси ОУ}
k:=420 div max;
{построение столбиков диаграммы разного цвета}
xi:=10;
SetColor(4);
For i:= 1 to n do
begin
SetFillStyle(1,i);
Bar(xi,420-A[i]*k,xi + h,420);
SetColor(15);
Rectangle(xi,420-A[i]*k,xi + h,420);
{вывод соответствующего номера под каждым столбиком}
Str(i,z);
OutTextXY(xi + h div 3,430,z);
xi:=xi+h+10;{10 - расстояние между столбиками}
end;
readln;
CloseGraph
End.