Иллюстрированный самоучитель по Turbo Pascal для начинающих

Решения (задачи 217-221)

Задача 219

{ Обрабатывает результаты контрольной работы
и отражает их в виде диаграммы } uses Crt, Graph;
(возвращает изображение дробного числа} function RealtoStr(r: real; n,m: integer): string; var
st: string; begin
Str(r:n:m,st); ReALToStr: = st; end;
const
{ подсказка при вводе исходных данных и
подпись рядом с прямоугольником легенды } mes: array[2..5] of string[10] =
('двоек','троек','четверок','пятерок');
var
array[2..5] of integer; { количество пятерок, четверок,
integer;
array[2..5] of real;
троек и двоек } { всего оценок } { процент каждой оценки
array[2..5] of integer; { высоты столбиков диаграмм }
integer; { номер максимального эл-та массива n integer; { индекс массива }
х,у: integer; { координаты левого нижнего угла столбика диаграммы }
grDriver:integer; { драйвер }
grMode:integer; { графический режим }
grPath:string; { место расположения драйвера }
ErrCode:integer; { результат инициализации граф.
begin
(ввод исходных данных }
TextBackground(Blue);
TextColor(LightGray);
ClrScr;
writeln('Обработка результатов контрольной работы');
writeln('Введите исходные данные:');
for i: = 5 downto 2 do begin
write(mes[i],' › '); readln(n[i]); end;
for i: = 2 to 5 do s: = s+n[i]; { всего оценок }
{ вычислим процент каждой оценки } for i: = 2 to 5 do p[i]: = (n[i]/s)*100;
{ вычислим высоту каждого столбика диаграммы, }
{ но сначала определим, каких оценок больше }
т: = 5; { пусть больше всего пусть количеству оценок, которых больше,
соответствует столбик высотой 200 пикселей. Вычислим высоты остальных столбиков. }
for i: = 5 downto 2 do
 .h[i]: = Round((200/n[m])*n[i]);
{ обработка выполнена, строим диаграмму }
grDriver: = VGA; { режим VGA}
grMode: = VGAHi; { разрешение 640x480}
grPath: = 'e:\tp\bgi'; { драйвер, файл EGAVGA.BGI, находится
в каталоге e:\tp\bgi } InitGraph(grDriver, grMode,grPath);
ErrCode: = GraphResult; if ErrCode <> grOk then begin
writeln('Ошибка инициализации графического режима.1);
writeln(',njM завершения работы программы ',
'нажмите Enter'); readln; HALT (l^-
{ строим диаграмму }
OuttextXY(40.50,'Результаты контрольной работы'); Rectangle(40.80.170.310);
х: = 50; у: = 300; { левый нижний угол первого столбика }
{ столбики диаграммы } for i: = 5 downto 2 do begin
SetFillStyle(SolidFill,i);
Bar(x,y,x+10,y-h[i]); { столбик }
{ OutTextXY(x,y-h[i]-10,ReALToStr(p[i],5.2)+'%');
x: = x+20; end;
{ численные значения } x: = 50;
for i: = 5 downto 2 do begin
SetFillStyle(SolidFill,i);
{Bar(x,y,x+10,y-h[i]); { столбик }
OutTextXY(x,y-h[i]-10,ReALToStr(p[i],5.1)+'%');
x: = x+20; end;
{ легенда } х: = 200;у: = 100; for i: = 5 down to 2 do begin
SetFillStyle(SolidFill,i); Bar(x,y,x+20,y+10); { столбик }
OutTextXY(x+25,y,raes[i]); y: = y+20; end; readln; CloseGraph; end.
{ Выводит круговую диаграмму }
uses Graph;
const
N=4; (количество категорий }
name: array[1..N] of
string[10]=('Книги','Журналы','Канцтовары','Прочее'); var
kol: array[1..N] of real,
dol: array[l..N] of real;
sum: real; al,a2: integer; x,y: integer; st: string; i: integer;
{ количество для категории }
{ доля категории в общем количестве }
{ общее кол-во по всем категориям { угол начала и конца сектора }
(координаты вывода легенды } { изображение числа }
grDriver:integer; { драйвер }
grMode:integer; { графический режим }
grPath:string; { место расположения драйвера }
ErrCode:integer; { результат инициализации граф. режима }
begin
grDriver: = VGA; { режим VGA} grMode: = VGAHi;
(разрешение 640x480} grPath: = 'e:\tp\bgi'; (драйвер, файл EGAVGA.BGI, находится
в каталоге e:\tp\bgi }
tGraph(grDriver, grMode,grPath); ErrCode: = GraphResult; if ErrCode о grOk then begin
 .writeln('Ошибка инициализации графического режима.');
writeln('Для завершения работы программы ', 'нажмите Enter');
readln;
HALT(l); end;
{ ввод исходных данных }
writeln('Введите количество по каждой категории'); sum: = 0;
for i: = l to N do begin
write(name[i],' › '); readln(kol[i]); sum: = sum+kol[i]; end;
f вычислим долю каждой категории в общей сумме } for i: = l to N do
]: = kol[i]/sum*100;
{ строим диаграмму } al: = 0; (от оси ОХ }
x: = 350; y: = 100; { левый верхний угол области легенды } for i: = l to N do begin
{ сектор }
a2: = al+Round(3.6*Dol[i]); { 1% – 3.6 градуса }
if a2 > 360 then a2: = 360;
SetFillstyle(SolidFill,i);
PieSlice(200.200,al,a2.100);
a1: = a2; { следующий сектор – от конца текущего }
{ легенда }
Bar(х,у,х+30,у+10);
Rectangle(х,у,х+30,у+10);
str(dol[i]:6:1,at);
OutTextXY(x+50,y,name[i]+' – '
y: = y+20; end;
readln; CloseGraph;
end.
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.