Программа


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;
VAR i,MaxNum:word; { Счетчик и номер максимального элементов массива }
    Res:TResArray; { Массив результатов эксперимента }
    Ch,ChKey:char; { Переменная для опроса клавиатуры и задаваемый символ }
    Time1,Time2:real; { Моменты времени вывода на экран и нажатия клавиши }
    _H, { Высота диаграммы }
    h,w, { Высота и ширина прямоугольника диаграммы }
    LeftStartPos, { Левый край диаграммы }
    LP,DP, { Левая и нижняя координаты прямоугольника диаграммы }
    Step { Шаг прямоугольников диаграммы }
    :integer;
    ErrorSum:real; { Количество ошибок }
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; { Очистка экрана }
    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,i*2); { Установка атрибутов текста }
    OutCenterCenterText(GetMaxX div 2,GetMaxY div 2,Ch); { Вывод символа }
    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.

Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию