Программа
USES Crt, Graph, DOS; { Подключение модулей }
CONST PathToDriver='C:\PROGRA~1\BP\BGI'; { Путь к графическому драйверу }
ResQuant=10; { Разбиение вариативности экспериментов }
TYPE TResElement=record { Тип - результат экспериментального варианта }
ErrorQuant:word; { Количество ошибок }
ErrorPercent:real; { Процент ошибок к общему числу ошибок }
ExperimentQuant:word; { Количество запросов по варианту эксперимента }
ReactionTime:real; { Сумма времен реакций }
MedReactionTime:real; { Среднее время реакции }
end;
TResArray=array[1..ResQuant] of TResElement; { Тип - массив эксперимента }
VAR Exit:boolean; { Флаг выхода из программы }
GraphDriver:integer; { Графический драйвер }
GraphMode:integer; { Графический режим }
PROCEDURE SwitchingPage;{ Переключение отображаемой и активной видеостраниц }
Const Page:boolean=FALSE; { Флаг страниц }
Begin
SetVisualPage(Ord(Page)); { Установка отображаемой страницы }
SetActivePage(Ord(not Page)); { Установка активной страницы }
Page:=not Page { Переустановка флага }
End;
PROCEDURE OutCenterBottomText(X,Y:integer; S:string);
Begin { Вывод текста с позиционированием относительно заданных координат }
SetTextJustify(CenterText, BottomText);
OutTextXY(X,Y,S);
End;
PROCEDURE OutCenterCenterText(X,Y:integer; S:string);
Begin { Вывод текста с позиционированием относительно заданных координат }
SetTextJustify(CenterText, CenterText);
OutTextXY(X,Y,S);
End;
FUNCTION GetTime:real; { Запрос и преобразование времени }
Var Hour,Minute,Second,Sec100:word;
Begin
DOS.GetTime(Hour,Minute,Second,Sec100);
GetTime:=Sec100/100+Second+Minute*60+Hour*3600.0;
End;
FUNCTION Stringer(N:real):string; { Функция преобразования числа в строку }
Var St:string; { Переменная для преобразования числа в строку }
Begin
Str(N:4:2,St); { Преобразование }
Stringer:=St { Определение значения функции }
End;
PROCEDURE Line(X1,Y1,X2,Y2:integer); { Прорисовка линии случайным цветом }
Begin
SetColor(Random(16)); { Установка случайного цвета выводимых объектов }
Graph.Line(X1,Y1,X2,Y2)
End;
VAR i,MaxNum:word; { Счетчик и номер максимального элементов массива }
Res:TResArray; { Массив результатов эксперимента }
Ch,ChKey:char; { Переменная для опроса клавиатуры и задаваемый символ }
Time1,Time2:real; { Моменты времени вывода на экран и нажатия клавиши }
_H, { Высота диаграммы }
h,w, { Высота и ширина прямоугольника диаграммы }
LeftStartPos, { Левый край диаграммы }
LP,DP, { Левая и нижняя координаты прямоугольника диаграммы }
Step { Шаг прямоугольников диаграммы }
:integer;
ErrorSum:real; { Количество ошибок }
L,T,R,B:integer; { Левая, верхняя, правая и нижняя границы зашумления изображения }
j,k:integer; { Служебный счетчик для отрисовки шума и коэффициент зашумления }
BEGIN
for i:=1 to ResQuant do with Res[i] do { Инициализация массива эксперимента }
begin ErrorQuant:=0; ExperimentQuant:=0; ReactionTime:=0 end;
Randomize; { Инициализация генератора случайных чисел }
Exit:=FALSE; { Сброс флага выхода }
GraphDriver:=Detect; { Автоматическое оперделение драйвера }
InitGraph(GraphDriver,GraphMode,PathToDriver); { Инициалиэация графики }
GraphMode:=1; { Задание графического режима }
SetGraphMode(GraphMode); { Установка графического режима }
SetBkColor(Blue); { Установка цвета фона }
SwitchingPage; { Переключение видео страницы }
repeat { Цикл обработки клавиатуры и набора результата }
ClearDevice; { Очистка экрана }
{ Начальное определение границ шума: }
T:=Round(0.2*GetMaxY);
B:=Round(0.8*GetMaxY);
L:=(GetMaxX-(B-T)) div 2;
R:=GetMaxX-L;
SetColor(White); { Установка цвета выводимых объектов }
SetTextStyle(DefaultFont,HorizDir,1); { Установка атрибутов графического текста }
OutCenterBottomText(GetMaxX div 2,10,'Press <NumKey>'); { Вывод подсказки }
OutCenterBottomText(GetMaxX div 2,GetMaxY-2,'For Exit Press <ESC>'); { Вывод подсказки }
Ch:=Chr(Random(10)+Ord('0')); { Задание очередного символа }
i:=Random(ResQuant)+1; { Определение параметра эксперимента }
SetTextStyle(DefaultFont,HorizDir,15); { Установка атрибутов текста }
OutCenterCenterText(GetMaxX div 2,GetMaxY div 2,Ch); { Вывод символа }
SetColor(LightBlue); { Установка цвета выводимых объектов }
k:=i+3; { Определения коэффициента шума }
{ Приведение границ к условиям кратности коэффициенту шума: }
while (R-L) mod k<>0 do
if GetMaxX-R>L
then L:=L-1
else R:=R+1;
while (B-T) mod k<>0 do
if GetMaxY-B>T
then T:=T-1
else B:=B+1;
for j:=0 to (R-L) div k do { Цикл отрисовки линий определяющих шум }
begin
Line(L ,T+j*k, R,T+j*k);
Line(L+j*k, T,L+j*k, B);
Line(L+j*k, T, L,T+j*k);
Line(L+j*k, B, R,T+j*k);
Line(L+j*k, T, R,B-j*k);
Line(L+j*k, B, L,B-j*k);
end;
SwitchingPage; { Переключение видео страницы }
Time1:=GetTime; { "Снятие" момента времени }
ChKey:=ReadKey; { Чтение клавиатуры }
Time2:=GetTime; { "Снятие" момента времени }
if ChKey=Ch { Проверка правильности нажатия клавиши }
then with Res[i] do
begin
Inc(ExperimentQuant); { Набор числа экспериментов }
ReactionTime:=ReactionTime+Time2-Time1 { Набор суммы времен }
end
else if ChKey<>#27 { Проверка условия выхода }
then Inc(Res[i].ErrorQuant) { Набор числа ошибок }
else Exit:=TRUE { Подьем флага выхода }
until Exit;
ClearDevice; { Очистка экрана }
SetTextStyle(DefaultFont,HorizDir,1); { Установка атрибутов текста }
OutCenterBottomText(GetMaxX div 2,GetMaxY-2,'For Exit Press <ESC>'); { Вывод подсказки }
for i:=1 to ResQuant do { Пересчет результатов эксперимента по времени реакции }
with Res[i] do
if ExperimentQuant<>0
then MedReactionTime:=ReactionTime/ExperimentQuant
else MedReactionTime:=0;
{ Определение максимального результата: }
MaxNum:=1;
for i:=2 to ResQuant do
if Res[i].MedReactionTime>Res[MaxNum].MedReactionTime
then MaxNum:=i;
SetTextStyle(DefaultFont,VertDir,1); { Установка атрибутов текста }
SetColor(LightGray); { Установка цвета текста }
{ Расчет параметров диаграммы: }
_H:=Round(0.8*GetMaxY);
DP:=(GetMaxY-_H) div 2 + _H;
Step:=Round(GetMaxX/ResQuant);
w:=Round(Step/3);
LeftStartPos:=w div 2;
SetFillStyle(SolidFill,Green); { Установка параметров заполнения }
for i:=1 to ResQuant do { Цикл прорисовки диаграммы по временам }
Begin
if Res[MaxNum].MedReactionTime<>0
then h:=Round(0.8*Res[i].MedReactionTime/Res[MaxNum].MedReactionTime*_H)
else h:=0;
LP:=LeftStartPos+Step*(i-1);
Bar(LP,DP-h,LP+w,DP);
OutCenterBottomText(LP+w div 2,DP-h-2,Stringer(Res[i].MedReactionTime))
End;
{ Набор числа ошибок: }
ErrorSum:=Res[1].ErrorQuant;
for i:=2 to ResQuant do ErrorSum:=ErrorSum+Res[i].ErrorQuant;
if ErrorSum=0 then ErrorSum:=1; { Блокировка деления на ноль при отсутсвии ошибок }
for i:=1 to ResQuant do with Res[i] do ErrorPercent:=ErrorQuant/ErrorSum*100;
{ Расчет процента ошибок по каждому варианту }
{ Поиск варианта с максимальным процентом ошибок: }
MaxNum:=0;
for i:=1 to ResQuant do
if MaxNum>0
then if Res[i].ErrorPercent>Res[MaxNum].ErrorPercent
then MaxNum:=i
else
else if Res[i].ErrorPercent>0
then MaxNum:=i
else;
{ Переопределение параметров диаграммы: }
LeftStartPos:=LeftStartPos+w+1;
SetFillStyle(SolidFill,Red);
for i:=1 to ResQuant do { Цикл вывода диаграммы по ошибкам }
Begin
if MaxNum<>0
then h:=Round(0.8*Res[i].ErrorPercent/Res[MaxNum].ErrorPercent*_H)
else h:=0;
LP:=LeftStartPos+Step*(i-1);
Bar(LP,DP-h,LP+w,DP);
OutCenterBottomText(LP+w div 2,DP-h-2,Stringer(Res[i].ErrorPercent))
End;
SwitchingPage; { Переключение активной страницы }
ChKey:=ReadKey; { Остановка программы }
CloseGraph; { Закрытие графического режима }
for i:=1 to ResQuant do { Вывод данных (для контроля) }
with Res[i] do WriteLn(i:2,' ',ErrorQuant:10,' ',ExperimentQuant:10,
ReactionTime:10,' ',MedReactionTime:10);
END.
Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию