{============================================================}
{       Тест математических функций                          }
{============================================================}

var  c    : char;
     n, i : byte;

const  fnm : array [1..10]  of  string[9] =
                ( 'Abs(x)   ',
                  'Int(x)   ',
                  'Frac(x)  ',
                  'Sqr(x)   ',
                  'Sqrt(x)  ',
                  'Sin(x)   ',
                  'Cos(x)   ',
                  'ArcTan(x)',
                  'Ln(x)    ',
                  'Exp(x)   '   );


{""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""}
{    Рисование графика функции.                              }
{ Номер функции находится в переменной n.                    }

procedure  Fn;
     var  x, y    : real;
          xi, yi  : integer;
          xmin, step, xaxis, yaxis  : integer;
     begin
       ClrScr; ClrGScr; GotoXY(52,0); write('y=',fnm[n]);
                                                  GotoXY(0,0);
       case  n  of
         1 :  begin  xmin:=0;     step:=100;
                     yaxis:=256;  xaxis:=230;  end;
         2 :  begin  xmin:=0;     step:=50;
                     yaxis:=256;  xaxis:=128;  end;
         3 :  begin  xmin:=0;     step:=50;
                     yaxis:=256;  xaxis:=128;  end;
         4 :  begin  xmin:=0;     step:=100;
                     yaxis:=256;  xaxis:=230;  end;
         5 :  begin  xmin:=10;    step:=100;
                     yaxis:=10;   xaxis:=230;  end;
         6 :  begin  xmin:=0;     step:=50;
                     yaxis:=256;  xaxis:=128;  end;
         7 :  begin  xmin:=0;     step:=50;
                     yaxis:=256;  xaxis:=128;  end;
         8 :  begin  xmin:=0;     step:=50;
                     yaxis:=256;  xaxis:=128;  end;
         9 :  begin  xmin:=11;    step:=50;
                     yaxis:=10;   xaxis:=128;  end;
        10 :  begin  xmin:=0;     step:=50;
                     yaxis:=256;  xaxis:=230;  end;
       end{case};

       SetColor(1);
       Line(0,xaxis,511,xaxis);  Line(507,xaxis-4,511,xaxis);
                                 Line(507,xaxis+4,511,xaxis);
       Line(yaxis,0,yaxis,255);  Line(yaxis-4,4,yaxis,0);
                                 Line(yaxis+4,4,yaxis,0);
       for i:=0 to 4  do Line (yaxis-3, i*step+xaxis-2*step,
                               yaxis+3, i*step+xaxis-2*step);
       for i:=0 to 11 do Line (i*step+yaxis-5*step, xaxis-3,
                               i*step+yaxis-5*step, xaxis+3);
       SetColor ( 7 );

       for  xi:=xmin  to  511
       do  begin
             x := (xi-yaxis)/step;
             case  n  of
               1 :  y := Abs(x);
               2 :  y := Int(x);
               3 :  y := Frac(x);
               4 :  y := Sqr(x);
               5 :  y := Sqrt(x);
               6 :  y := Sin(x);
               7 :  y := Cos(x);
               8 :  y := ArcTan(x);
               9 :  y := Ln(x);
              10 :  y := Exp(x);
             end{case};
             yi := xaxis - Round ( y*step );
             PutPixel ( xi, yi );
           end;
       GotoXY(0,15);  write('Нажмите любую клавишу ');
       c:=ReadKey;
     end;

begin
  n := 1;
  repeat
    ClrScr;  ClrGScr;
    GotoXY(16,00);  write('Графики математических функций');
    for  i:=1  to  10
    do  begin  GotoXY(26,i+1);  write(fnm[i]);  end;
    GotoXY(26,12);  write('Закончить работу');
    GotoXY(7,14);
write('Выбирайте функцию с помощью стрелок вверх и вниз.');
    GotoXY(15,15);  write('Выбрав, нажмите возврат каретки.');
    GotoXY(0,0);
    SetColor(2);  Rectangle(0,18,511,26,true);
                  Rectangle(0,214,511,222,true);
    repeat
      SetColor(1);
      Rectangle(200,(n+1)*16,343,(n+1)*16+15,true);
      c := ReadKey;
      SetColor(0);
      Rectangle(200,(n+1)*16,343,(n+1)*16+15,true);
      case  c  of
        #$1E {стрелка вверх} : if n>1  then Dec(n) else n:=11;
        #$1F {стрелка вниз}  : if n<11 then Inc(n) else n:=1;
      end{case};
    until  c=#13 {возврат каретки};
    if  n<>11  then  Fn;
  until  n=11;
  ClrScr;  ClrGScr;
end.
;
      end{case};
    until  c=#13 {возврат каретки};
    if  n<>11  then  Fn;
  until  n=11;
  ClrScr;  ClrG