Program Wykres_Funkcji;
uses crt,graph,strings;
const nx=5;
      ny=5;
var xmin,xmax,ymin,ymax,dzx,dzy,dx,x,y:real;
    n,k,karta,tryb,dlx,dly,x0,y0:integer;

Function funkcja(x:real):real;
Begin
funkcja:=x*x-1;
End;

Procedure przelicz(xmin,xmax,ymin,ymax:real;var dzx,dzy:real; var dlx,dly:integer);
Begin
dzx:=(getmaxx-150)/(xmax-xmin);
dzy:=(getmaxy-100)/(ymax-ymin);
dlx:=(getmaxx-150) div nx;
dly:=(getmaxy-100) div ny;
End;

Procedure osie(xmin,xmax,ymin,ymax,dzx,dzy:real;var x0,y0:integer);
Begin
 if (xmin<0) and (xmax>=0) then x0:=50+round(abs(dzx*xmin));
 if (xmin>=0) then x0:=50;
 if (xmax<0) then x0:=getmaxx-50;
 if (ymin<0) and (xmax>=0) then y0:=50+round(getmaxy-50-abs(dzy*ymin));
 if (ymin>=0) then y0:=getmaxy-50;
 if (ymax<=0) then y0:=50;
 line(x0,25,x0,getmaxy-20);   { os pionowa }
 line(x0-3,25,x0+3,25);   { strzalka pionowa }
 line(x0-3,25,x0,15);   { strzalka pionowa }
 line(x0+3,25,x0,15);   { strzalka pionowa }
 line(50,y0,getmaxx-25,y0);   { os pozioma }
 line(getmaxx-25,y0-3,getmaxx-25,y0+3);   { strzalka pozioma }
 line(getmaxx-25,y0-3,getmaxx-15,y0);   { strzalka pozioma }
 line(getmaxx-25,y0+3,getmaxx-15,y0);   { strzalka pozioma }
End;

Procedure podzialka(xmin,xmax,ymin,ymax,dzx,dzy:real;dlx,dly,x0,y0:integer);
var napis1,napis2,stx,sty:string;
    potx,poty:string;
    x,y,k,a:integer;
    skx,sky:array[0..5] of real;
Begin
 napis1:='t[s]*1E';
 napis2:='v[m/s]*1E';
 potx:='';
 poty:='';
 k:=0;
 x:=x0;
 if dlx<100 then a:=100
            else a:=dlx;
 if (abs(xmax-xmin)>1e-3) and (abs(xmax-xmin)<1e3) then potx:=potx+'0';
 if abs(xmax-xmin)>=1000 then potx:=potx+'+3';
 if abs(xmax-xmin)<=1e-3 then potx:=potx+'-3';
 while x<getmaxx-a do
    begin
     line(x,y0-5,x,y0+5);
     if xmin>=0 then skx[k]:=xmin+k*dlx/dzx
                else skx[k]:=k*dlx/dzx;
     if abs(xmax-xmin)>=1000 then skx[k]:=skx[k]/1000;
     if abs(xmax-xmin)<=1e-3 then skx[k]:=skx[k]*1000;
     str(skx[k]:3:2,stx);
     if k>0 then outtextxy(x,y0+10,stx)
            else outtextxy(x+4,y0+10,stx);
     k:=k+1;
     x:=x0+k*dlx;
    end;
 k:=0;
 x:=x0;
 if dlx<50 then a:=50
           else a:=dlx;
 while x>a do
    begin
     line(x,y0-5,x,y0+5);
     if xmax<=0 then skx[k]:=xmax-k*dlx/dzx
                else skx[k]:=-k*dlx/dzx;
     if abs(xmax-xmin)>=1000 then skx[k]:=skx[k]/1000;
     if abs(xmax-xmin)<=1e-3 then skx[k]:=skx[k]*1000;
     str(skx[k]:3:2,stx);
     if (k>0) or (xmax<0) then outtextxy(x,y0+10,stx);
     k:=k+1;
     x:=x0-k*dlx;
    end;

 k:=0;
 y:=y0;
 if dly<50 then a:=50
           else a:=dly;
 if (abs(ymax-ymin)>1e-3) and (abs(ymax-ymin)<1e3) then poty:=poty+'0';
 if abs(ymax-ymin)>1000 then poty:=poty+'+3';
 if abs(ymax-ymin)<=1e-3 then poty:=poty+'-3';
 while y<getmaxy-a do
    begin
     line(x0-5,y,x0+5,y);
     if ymax<0 then sky[k]:=ymax-k*dly/dzy
                else sky[k]:=-k*dly/dzy;
     if abs(ymax-ymin)>1000 then sky[k]:=sky[k]/1000;
     if abs(ymax-ymin)<=1e-3 then sky[k]:=sky[k]*1000;
     str(sky[k]:2:3,sty);
     if k>0 then outtextxy(x0-50,y-10,sty)
            else outtextxy(x0+4,y-10,sty);
     k:=k+1;
     y:=y0+k*dly;
    end;
 k:=0;
 y:=y0;
 while y>a do
    begin
     line(x0-5,y,x0+5,y);
     if ymin>0 then sky[k]:=ymin+k*dly/dzy
                else sky[k]:=k*dly/dzy;
     if abs(ymax-ymin)>=1000 then sky[k]:=sky[k]/1000;
     if abs(xmax-xmin)<=1e-3 then sky[k]:=sky[k]*1000;
     str(sky[k]:2:3,sty);
     if (k>0) then outtextxy(x0+5,y-10,sty);
     k:=k+1;
     y:=y0-k*dly;
    end;
 napis1:=napis1+potx;
 outtextxy(getmaxx-80,y0+40,napis1);
 napis2:=napis2+poty;
 outtextxy(x0,5,napis2);
end;

Procedure rysuj_fun(xmin,xmax,ymin,ymax,dzx,dzy:real;x0,y0,n:integer);
var k,i:integer;
    x,y:array[0..700] of real;
    dx:real;
begin
 dx:=(xmax-xmin)/n;
 for k:=0 to n do
   begin
    x[k]:=xmin+k*dx;
    y[k]:=funkcja(x[k]);
   end;
 if xmax<0 then x0:=round(x0-xmax*dzx);
 if xmin>0 then x0:=round(x0-xmin*dzx);
 if ymax<0 then y0:=round(y0-ymax*dzy);
 if ymin>0 then y0:=round(y0-ymin*dzy);
 for k:=0 to n-1 do
   begin
    line(round(x0+x[k]*dzx),round(y0-y[k]*dzy),
         round(x0+x[k+1]*dzx),y0-round(y[k+1]*dzy));
   end;
end;

BEGIN
n:=500;
clrscr;
write('xmin=');readln(xmin);
write('xmax=');readln(xmax);
dx:=(xmax-xmin)/n;
ymin:=funkcja(xmin);
ymax:=funkcja(xmax);
for k:=0 to n do
  begin
   x:=xmin+k*dx;
   y:=funkcja(x);
   if ymin>y then ymin:=y;
   if ymax<y then ymax:=y;
  end;

detectgraph(karta,tryb);
initgraph(karta,tryb,'c:\szkola\bp\bgi');

przelicz(xmin,xmax,ymin,ymax,dzx,dzy,dlx,dly);
osie(xmin,xmax,ymin,ymax,dzx,dzy,x0,y0);
podzialka(xmin,xmax,ymin,ymax,dzx,dzy,dlx,dly,x0,y0);
rysuj_fun(xmin,xmax,ymin,ymax,dzx,dzy,x0,y0,n);
readkey;
closegraph;

END.