{$N+}
Program Wykresy;    {RCz}
uses crt,graph;
var i,j,ster,tryb,sx,sy,dpi                     : integer;
    p,pp,kk,k,x,y                               : extended;
    klawisz                                     : char;


Begin
clrscr;
writeln('Program sˆu¾y do rysowaniw najprostrzych wykres¢w funkcji.');
writeln('Funkcja rysowana jest w domy˜lnym przedziale: (-10;10).');
write('Aby zmieni† przedziaˆ naci˜nij klawisz "z"');
klawisz:=readkey;
writeln;
if klawisz='z' then begin
                    write('Pocz¥tek przedziaˆu: '); readln(p);
                    write('Koniec przedziaˆu: '); readln(k);
                    end;
                    if (klawisz<>'z') or (p>=k) then
                    begin
                    write('Wykorzystane zostanie ustawienie domy˜le.');
                    readln;
                    p:=-10;     {poczatek przedzialu}
                    k:=10;      {koniec przedzialu}
                    end;
dpi:=100;  {rozdzielczosc wykresu>=100}
{skala}
sx:=50;  {jednostka w pkt. na x}
sy:=50;  {jednostka w pkt. na y}
ster:=detect;
initgraph(ster,tryb,'c:\bp\bgi');
repeat
if klawisz = '6' then sx:=sx-2;
if klawisz = '4' then sx:=sx+2;
if klawisz = '8' then sy:=sy-2;
if klawisz = '2' then sy:=sy+2;
setcolor(0);
line(0,trunc(getmaxY/2),getmaxX,trunc(getmaxY/2));
line(trunc(getmaxX/2),getmaxY,trunc(getmaxX/2),0);
for i:=1 to 50 do
begin
     line(trunc(i*sx+getmaxX/2),trunc(getmaxY/2-3),trunc(i*sx+getmaxX/2),trunc(getmaxY/2+3));
     line(trunc(-i*sx+getmaxX/2),trunc(getmaxY/2-3),trunc(-i*sx+getmaxX/2),trunc(getmaxY/2+3));
     line(trunc(getmaxX/2-3),trunc(i*sy+getmaxY/2),trunc(getmaxX/2+3),trunc(i*sy+getmaxY/2));
     line(trunc(getmaxX/2-3),trunc(-i*sy+getmaxY/2),trunc(getmaxX/2+3),trunc(-i*sy+getmaxY/2));
end;
pp:=p*dpi;    {p na wykresie}
kk:=k*dpi;    {k na wykresie}
x:=pp/dpi;
y:=-funkcja(x);
y:=y*sy;
x:=x*sx;
moveto(trunc(x+getmaxX/2),trunc(y+getmaxY/2));
x:=0;
for i:=trunc(pp) to trunc(kk) do
begin
     x:=(x+i)/dpi;
     y:=-funkcja(x);
     lineto(trunc(x*sx+getmaxX/2),trunc(y*sy+getmaxY/2));
end;
if klawisz = '6' then sx:=sx+2;
if klawisz = '4' then sx:=sx-2;
if klawisz = '8' then sy:=sy+2;
if klawisz = '2' then sy:=sy-2;

setcolor(11); {staˆe elementy graficzne}
outtextXY(getmaxX-20,trunc(getmaxY/2-20),'x');
line(0,trunc(getmaxY/2),getmaxX,trunc(getmaxY/2));
outtextXY(trunc(getmaxX/2+10),10,'y');
line(trunc(getmaxX/2),getmaxY,trunc(getmaxX/2),0);
outtextXY(460,10,'Klaw. numeryczna:');
outtextXY(460,20,'6,8 - powiekszanie');
outtextXY(460,30,'4,2 - pomniejszanie');

for i:=1 to 50 do
begin
     line(trunc(i*sx+getmaxX/2),trunc(getmaxY/2-3),trunc(i*sx+getmaxX/2),trunc(getmaxY/2+3));
     line(trunc(-i*sx+getmaxX/2),trunc(getmaxY/2-3),trunc(-i*sx+getmaxX/2),trunc(getmaxY/2+3));
     line(trunc(getmaxX/2-3),trunc(i*sy+getmaxY/2),trunc(getmaxX/2+3),trunc(i*sy+getmaxY/2));
     line(trunc(getmaxX/2-3),trunc(-i*sy+getmaxY/2),trunc(getmaxX/2+3),trunc(-i*sy+getmaxY/2));
end;
setcolor(15);
pp:=p*dpi;    {p na wykresie}
kk:=k*dpi;    {k na wykresie}
x:=pp/dpi;
y:=-funkcja(x);
y:=y*sy;
x:=x*sx;
line(0,trunc(getmaxY/2),trunc(x+getmaxX/2),trunc(getmaxY/2));
line(trunc(sx*(kk/dpi)+getmaxX/2),trunc(getmaxY/2),getmaxX,trunc(getmaxY/2));
moveto(trunc(x+getmaxX/2),trunc(y+getmaxY/2));
x:=0;
for i:=trunc(pp) to trunc(kk) do
begin
     x:=(x+i)/dpi;
     y:=-funkcja(x);
     lineto(trunc(x*sx+getmaxX/2),trunc(y*sy+getmaxY/2));
end;
klawisz:=readkey;
if klawisz = '6' then sx:=sx+2;         {powiekszanie}
if klawisz = '4' then sx:=sx-2;         {pomniejszanie}
if klawisz = '8' then sy:=sy+2;         {powiekszanie}
if klawisz = '2' then sy:=sy-2;         {pomniejszenie}
until (klawisz<>'6') and (klawisz<>'4') and (klawisz<>'8') and (klawisz<>'2') or (sx<1) or (sy<1);
closegraph;
End.