Решения (задачи 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.