Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Решение математических задач.pdf
Скачиваний:
28
Добавлен:
13.02.2015
Размер:
858.1 Кб
Скачать

4.3. Создание двумерной диаграммы

На практике чаще всего используются 2 типа диаграмм: гистограмма, то есть столбчатая диаграмма, в которой каждый элемент данных представляется в виде отдельного столбца, и круговая диаграмма, в которой каждый элемент представляется в виде сектора, входящего в состав круга.

Построение диаграммы первого типа рассмотрим на примере следующей задачи. Требуется составить программу, которая запрашивает пользователя о результатах сдачи экзамена группой студентов и затем изображает эти результаты в виде гистограммы. Всего данная гистограмма должна включать в себя четыре столбца, высота каждого из которых должна соответствовать количеству студентов, сдавших экзамены на следующие оценки: неудовлетворительно, удовлетворительно, хорошо и отлично. Слева от диаграммы следует изобразить координатную ось, которая показывает масштаб изображения. Справа от гистограммы следует поместить легенду, то есть информацию об используемых в диаграмме условных обозначениях. Ввод данных производится в текстовом режиме, а построение самой диаграммы – в графическом.

Ниже приводится текст программы, которая решает поставленную задачу.

program gistogr; Uses Crt,Graph;

constx=50; y=450;

{x и y – горизонтальная и вертикальная графические координаты левого нижнего угла гистограммы}

var

x1,y1,grdr,grmd,dv,tr,hor,otl:integer;

{dv – количество двоечников, tr – троечников, hor – хорошистов, otl – отличников}

procedure stolb(c,k:integer; s:string; var x1,y1:integer);

{данная процедура для каждой категории студентов строит столбец в диаграмме и добавляет

соответствующую запись в легенду; с – цвет текущего столбца,

k – количество студентов, относящихся к текущей категории,

s – переменная, содержащая текст записи, которая заносится в легенду,

x1 – горизонтальная координата правой границы предыдущего столбца,

y1 – верхняя граница текущей записи в легенде} begin

88

setfillstyle(solidfill,c); bar(x1+30,y-k*20,x1+50,y-1); x1:=x1+50; bar(400,y1,440,y1+15); outtextXY(450,y1+5,s); y1:=y1+30;

end; begin ClrScr;

writeln('Программа построения гистограммы успеваемости группы студентов');

writeln('по итогам экзаменационной сессии'); writeln;

writeln('Введите количество двоечников'); readln(dv);

writeln;

writeln('Введите количество троечников'); readln(tr);

writeln;

writeln('Введите количество хорошистов'); readln(hor);

writeln;

writeln('Введите количество отличников'); readln(otl);

writeln;

Enter'); writeln('Для построения диаграммы нажмите

readln;

grdr:=detect;

initgraph(grdr,grmd,'d:\tp7\bgi'); x1:=x; y1:=200; line(x,y,x+225,y); line(x,125,x,y); OuttextXY(25,85,'количество'); OuttextXY(25,100,'студентов'); OuttextXY(x-20,y,'0'); line(x-3,y-100,x+3,y-100); OuttextXY(x-20,y-100,'5'); line(x-3,y-200,x+3,y-200); OuttextXY(x-20,y-200,'10'); line(x-3,y-300,x+3,y-300); OuttextXY(x-20,y-300,'15');

stolb(yellow,dv,'двоечники',x1,y1);

stolb(magenta,tr,'троечники',x1,y1);

stolb(green,hor,'хорошисты',x1,y1);

89

stolb(lightred,otl,'отличники',x1,y1);

Settextstyle(defaultfont,horizdir,2);

Setcolor(cyan);

группы');

OuttextXY(100,10,'Диаграмма успеваемости

OuttextXY(100,30,'по итогам сессии'); readln;

closegraph end.

В программе gistogr после ввода исходных данных производится

инициализация графического режима в соответствии с шаблоном, приведенным в разделе 4.1 данного пособия. Затем с помощью процедур

line создаются координатные оси и штрихи на этих осях. С помощью процедуры OuttextXY над осью ординат создается надпись «количество

студентов». С помощью аналогичных процедур создаются надписи справа от оси ординат, показывающие числовые значения (количество студентов), соответствующие штрихам на оси ординат.

Следующим шагом в разработке программы является построение столбцов гистограммы и создание поясняющей легенды. На этом этапе необходимо обратить внимание на следующее обстоятельство. Нам необходимо будет 4 раза выполнить одну и ту же последовательность действий: создать очередной столбец определенного цвета в диаграмме, а в «легенде» создать небольшой прямоугольник такого же цвета и снабдить его текстовым комментарием, объясняющим, какой оценке соответствует данный цвет. Поэтому целесообразным является создание процедуры, которая выполняет данную последовательность действий, а затем обращаться к ней по мере необходимости из основной части программы.

Данная процедура под названием stolb создана в программе gistogr и четыре раза вызывается из основной части программы. Эта

процедура содержит следующие пять параметров: параметры-значения c,k,s и параметры-переменные x1,y1. Разберем более подробно

назначение этих параметров.

Параметр c определяет цвет создаваемого столбца на диаграмме и

соответствующего ему прямоугольника в «легенде». Он описан в процедуре как параметр целого типа, но для удобства вместо числового значения цвета

при обращении к процедуре можно использовать эквивалентное ему словесное обозначение цвета: yellow, magenta и другие.

Параметр k также относится к целому типу и показывает количество

студентов, относящихся к одной из категорий: отличников, хорошистов, троечников или двоечников. Параметр s относится к строковому типу и

содержит текст записи, заносимой в «легенду» для очередного столбца. Эта запись содержит одно слово: «двоечники», «троечники», «хорошисты» или «отличники».

90

Параметр x1 относится к целому типу и задает по горизонтали

координату оси абсцисс (для первого столбца) или правую границу предыдущего столбца (для всех последующих столбцов). Таким образом, x1

задает точку отсчета, начиная от которой строится очередной столбец. Параметр y1 также относится к целому типу и задает по вертикали верхнюю

границу, начиная с которой в «легенде» создается очередной прямоугольник

исоздается соответствующая ему пояснительная запись.

Всамой процедуре stolb в начале командой setfillstyle задается цвет очередного столбца, определяемый параметром c и способ

закраски столбца на самой гистограмме и прямоугольника в «легенде»

(сплошная заливка).

Затем с помощью стандартной процедуры Bar создается очередной

столбец. Первые два параметра задают горизонтальную и вертикальную координаты левого верхнего угла столбца. Для определения горизонтальной координаты к величине x1 прибавляется 30. Таким образом, расстояние

между правой границей предыдущего столбца и левой границей текущего составит 30 пикселей.

Для определения вертикальной координаты левого верхнего угла необходимо знать высоту столбца. Эта величина подсчитывается следующим образом: высоту столбца, соответствующего одному человеку, принимаем равным 20 пикселям. Следовательно, высота столбца для группы из k

человек будет равна k*20 пикселей. Полученную высоту столбца вычитаем из константы y, определяющей нижнюю границу гистограммы, и получаем

искомую координату.

Следующие два параметра процедуры Bar определяют координаты

правого нижнего угла создаваемого столбца. Вертикальная координата будет одинакова для всех столбцов, так как нижней границей гистограммы является ось абсцисс, а каждый столбец начинается на один пиксель выше этой оси. Горизонтальную же координату правого угла определим следующим образом. Толщину столбца возьмем равной 20 пикселям. Следовательно, правый угол текущего столбца будет отстоять от правой границы предыдущего столбца на 50 пикселей, и к величине x1 мы прибавим

50, что и даст нам необходимую последнюю координату.

После создания столбца мы увеличим текущее значение переменной x1

на 50. Это значение, соответствующее правой границе уже текущего столбца, будет возвращено в основную часть программы и будет использовано при следующем обращении к процедуре stolb.

Следующая команда bar, используемая в процедуре stolb, создает

прямоугольник в «легенде». Так как все эти прямоугольники расположены один под другим параллельно друг другу, то горизонтальные их координаты меняться не будут. Высота каждого прямоугольника принимается равной 15 пикселям. Расстояние между прямоугольниками по вертикали также принимаем равным 15 пикселям. Исходя из этих величин, определяем вертикальные координаты прямоугольников. C помощью оператора

91

OuttextXY в 10 пикселях справа от прямоугольника создаем поясняющую

надпись.

После того как с помощью обращений к процедуре stolb мы создаем все столбцы диаграммы и «легенду», остается только вывести в верхней части

экрана заголовок гистограммы. Для этого с помощью команды Settextstyle задаем укрупненный размер шрифта, а далее операторами OuttextXY в две строки выводим текст заголовка.

Результаты работы данной программы представлены на рис. 4.2.

Рис. 4.2. Результаты работы программы, строящей гистограмму успеваемости студенческой группы

На примере следующей программы рассмотрим, как следует составлять круговую диаграмму. Требуется составить программу, которая использует такие же исходные данные, что и предыдущая, но результаты отображает не в виде гистограммы, а виде круговой диаграммы, в которой угловая величина каждого сектора соответствует проценту студентов группы, получивших ту или иную оценку. На каждом из секторов круговой диаграммы должна быть выведена надпись, показывающая процент соответствующей категории студентов (двоечников, троечников, хорошистов или отличников) по отношению к их общему количеству. Справа от диаграммы следует

92

поместить «легенду». Ввод данных производится в текстовом режиме, а построение самой диаграммы – в графическом.

Ниже приводится текст данной программы.

program circle_d;

 

 

 

 

 

Uses Crt,Graph;

 

 

 

 

 

var grdr,grmd,dv,tr,hor,otl,sum,ugol,y:integer;

{dv -количество двоечников, tr -троечников,

 

hor - хорошистов, otl - отличников,

сдававших

sum - общее количество студентов,

экзамен,

 

 

 

 

 

 

ugol - выраженный в градусах угол между начальным

радиусом диаграммы

 

ограничивающим

предыдущий

сектор,

и радиусом,

y -вертикальная координата левого верхнего угла

прямоугольника в легенде}

 

s:string;

var

procedure

sektor(c,k:integer;

ugol,y:integer);

 

 

 

 

 

{sektor - процедура, которая рисует на круговой

диаграмме сектор, соответствующий данной категории

студентов,

создает

на

этом

секторе

надпись,

показывающую процент данной категории студентов по

отношению к их общему количеству, а также добавляет

соответствующую строку в «легенду»:

 

 

 

c - цвет, которым закрашивается текущий сектор,

k - количество студентов, относящихся к данной

категории,

 

 

 

 

 

 

s - название категории}

 

 

 

 

var delta,xp,yp:integer;

 

 

 

 

pr,q,radian:real;

 

 

 

 

proc:string;

 

 

 

 

 

{delta - выраженный в градусах угол между начальным

и конечным радиусами текущего сектора,

к

данной

q - доля студентов, относящихся

категории,

 

 

 

 

 

 

pr - та же доля, выраженная в процентах,

proc - процент студентов, преобразованный в текстовую величину,

radian - угловая координата надписи на диаграмме, выраженная в радианах,

xp - горизонтальная координата начала надписи на диаграмме,

yp - вертикальная координата начала надписи на диаграмме}

begin

93

q:=k/sum;

delta:=round(q*360);

if (ugol+delta)>360 then delta:=delta-1; setfillstyle(solidfill,c); pieslice(200,300,ugol,ugol+delta,120); bar(400,y,440,y+20); outtextXY(450,y+5,s);

pr:=100*q;

str(pr:4:1,proc);

radian:=(ugol+delta/2)*pi/180;

xp:=round(200+cos(radian)*75); yp:=round(300-sin(radian)*75); outtextXY(xp,yp,proc+'%'); ugol:=ugol+delta;

y:=y+30;

end; begin

ClrScr;

диаграммы');writeln('Программа построения круговой writeln('успеваемости группы студентов'); writeln('по итогам экзаменационной сессии'); writeln;

writeln('Введите количество двоечников'); readln(dv);

writeln;

writeln('Введите количество троечников'); readln(tr);

writeln;

writeln('Введите количество хорошистов'); readln(hor);

writeln;

writeln('Введите количество отличников'); readln(otl);

sum:=dv+tr+hor+otl;

writeln;

Enter'); writeln('Для построения диаграммы нажмите

readln;

grdr:=detect;

initgraph(grdr,grmd,'d:\tp7\bgi');

y:=200;

ugol:=0;

circle(200,300,120);

sektor(brown,dv,'двоечники',ugol,y);

94

та же доля,

sektor(magenta,tr,'троечники',ugol,y);

sektor(green,hor,'хорошисты',ugol,y);

sektor(lightred,otl,'отличники',ugol,y);

Settextstyle(defaultfont,horizdir,2);

Setcolor(cyan);

OuttextXY(100,15,'Круговая диаграмма');

OuttextXY(100,35,'успеваемости студентов'); OuttextXY(100,55,'по результатам сессии'); readln;

closegraph end.

Программа circle_d во многом сходна с предыдущей программой gistogr. В программе circle_d четыре раза выполняется одна и та же

последовательность операций: создание сектора, соответствующего одной из категорий студентов, закрашенного определенным цветом, вывод на секторе надписи, указывающей процент этой категории по отношению ко всей группе, вывод прямоугольника с этим же цветом и создание поясняющей надписи в «легенде».

В программе circle_d данная последовательность операций оформлена в виде процедуры sector. Эта процедура имеет следующие

параметры: c – цвет сектора и соответствующего ему прямоугольника в «легенде»; k – количество студентов, относящихся к данной категории (категории: двоечники, троечники, хорошисты, отличники); s – содержание поясняющей надписи; ugol – угловая координата, определяющая начало текущего сектора; y – вертикальная координата, которая показывает, где

находится верхняя граница прямоугольника в «легенде». Последние две величины являются параметрами-переменными, значения которых изменяются в ходе работы.

Кроме параметров, процедура sector использует ряд локальных

переменных, играющих в данной процедуре вспомогательную роль. Это переменная delta, показывающая угловой размер текущего сектора, q -

доля студентов, относящихся к текущей категории, pr

выраженная в процентах, proc процент студентов, преобразованный в текстовую величину, radian - угловая координата надписи на диаграмме, выраженная в радианах, xp - горизонтальная координата начала надписи на диаграмме, yp - вертикальная координата начала надписи на диаграмме.

В основной части программы вводятся исходные данные и путем их суммирования определяется величина sum — общее количество студентов,

сдававших сессию (эта величина нужна для расчета доли, соответствующей каждой категории студентов). Затем инициализируется графический режим, и в этом режиме с помощью оператора circle строится окружность,

которая является основой создаваемой круговой диаграммы.

95

Затем путем обращения к процедуре sector создаются секторы для

каждой категории студентов, а также прямоугольники и текстовые пояснения в «легенде». Для того чтобы определить размер сектора для текущей категории студентов, нужно определить q — долю данной категории в

группе. Для этого разделим число студентов в данной категории k на общее число студентов в группе sum. Следующим шагом является вычисление delta — угловой величины сектора для данной категории. Для того чтобы перевести полученную долю q в градусы, мы умножаем ее на 360, а затем

округляем получившееся значение с помощью стандартной функции round. Затем с помощью команды Setfillstyle задаем способ закраски

сектора (сплошная заливка) и цвет этого сектора. Для построения самого сектора используется стандартная процедура Pieslice. В этой процедуре

координаты центра сектора и радиус сектора являются для всех секторов

одинаковыми и изменяются только граница сектора ugol и угловой размер сектора delta.

Далее с помощью стандартной процедуры bar в «легенде» создается

прямоугольник того же цвета, что и сектор. Горизонтальные координаты всех прямоугольников одинаковы, и меняются только вертикальные координаты. В 10 пикселях справа от очередного прямоугольника стандартной процедурой OuttextXY создается поясняющая надпись.

Последним этапом работы процедуры является создание в центре сектора надписи, показывающей процент студентов, относящихся к данной категории. Для этого мы пересчитываем долю студентов данной категории q

в соответствующий процент p, умножая q на 100. Затем преобразуем вещественную величину p в строковую proc c помощью стандартной процедуры str. Затем находим значение вспомогательной переменой radian, которая представляет собой угловую величину сектора,

переведенную в радианы. С помощью этой вспомогательной переменной мы

определяем xp и yp — координаты начала надписи, расположенной внутри сектора. Далее с помощью стандартной процедуры OuttextXY внутри

сектора выводится сама эта надпись, которая представляет собой содержимое строковой переменной proc c добавленным к ней знаком процента.

После создания секторов и «легенды» с помощью вышеописанной процедуры sektor в верхней части экрана операторами Settextstyle и OuttextXY в три строки создается общий заголовок диаграммы, что

является логическим завершением работы программы.

На приведенной ниже иллюстрации показан возможный внешний вид круговой диаграммы.

96