Графики на Pascale

  • Автор темы trend
  • Дата начала
Статус
Закрыто для дальнейших ответов.
T

trend

Гость
#1
Помогите разобраться с программой, что какая процедура(функция) делает, для чего нужен тот или иной оператор, вообщем нужны пояснения что как делалось, заранее благодарен.
p.s.сессия началась, выручайте :confused:

вот полностью сделанная и рабочая прога:
Код:
uses graph, crt;
type TPoint=record
x,y:word;
end;
arr=array[0..1000] of real;
foo=function(x:real):real;
var f:text;
ch:char;
{	x,y:arr;}
h,w,num,pow:integer;
a,b:real;
p:array [0..1000] of TPoint;
pol:arr;
t:array[1..10] of real;

function func(x:real):real; far;
begin
func:=sin(x);
end;


function poly(x:real):real; far;
var i:integer;
ret:real;
power:real;
begin
ret:=pol[pow+1];
power:=x;
for i:=pow downto 1 do
begin
ret:=ret+pol[i]*power;
power:=power*x;
end;
poly:=ret;
end;

function trig(x:real):real; far;
begin
trig:=t[1]*cos(t[2]*(x+t[3]))+t[4]*sin(t[5]*(x+t[6]))+t[7]*exp(t[8]*(x+t[9]))+t[10];
end;

procedure menu;
begin
writeln('1. a1*cos(b1*(x+c1))+a2*sin(b2*(x+c2))+a3*exp(b3*(x+c3))+c');
writeln('2. a1*x1+a2*x2^2+...+an*xn^n+a');
writeln('3. From program');
writeln('4. End');
end;

procedure FillCoords(var x:arr; var y:arr; a,b:real; n:integer; ff:foo);
var i:integer;
h:real;
begin
h:=abs(b-a)/n;
for i:=0 to n do
begin
x[i]:=a+h*i;
y[i]:=ff(x[i]);
write(f,'No.',i,': x:',x[i]:4:2,'; y:',y[i]:4:2);
writeln(f);
end;
end;

procedure GetMinAndMax(var y:arr; n:integer; var max,min:real);
var i:integer;
begin
max:=y[1];
min:=y[1];
for i:=0 to n do
if y[i]<min then min:=y[i]
else if y[i]>max then max:=y[i];
write(f,'---------------------');
writeln(f);
write(f,'Minimal y:',min:2:2,'. Maximal:',max:2:2);
end;

procedure DrawAxis(xmin,xmax,ymax,ymin:real; var ax:integer; var ay:integer);
var xscale,yscale:real;
s:string;
dtx,dty:integer;
begin
xscale:=(xmax-xmin)/w;
yscale:=(ymax-ymin)/h;
if ((xmin<0) and (xmax>0)) then ay:=round(abs(xmin)/xscale)
else if (xmax<0) and (xmin<0) then ay:=w
else ay:=0;
if (ymin<0) and (ymax>0) then ax:=h-round(abs(ymin)/yscale)
else if (ymax<0) and (ymin<0) then ax:=0
else ax:=h;
setcolor(white);
setlinestyle(0,1,3);
line(ay,0,ay,h);
str(ymin:2:2,s);
outtextxy(ay+5,h-10,s);
str(ymax:2:2,s);
outtextxy(ay+5,2,s);
line(0,ax,w,ax);
str(xmin:2:2,s);
outtextxy(0,ax+5,s);
str(xmax:2:2,s);
outtextxy(w-(length(s)-1)*10,ax+5,s);
if (xmax>1) then
begin
line(ay+round(1/xscale),ax+4,ay+round(1/xscale),ax-4);
outtextxy(ay+round(1/xscale)-2,ax+4,'1');
end;
if (ymax>1) then
begin
line(ay+4,ax-round(1/yscale),ay-4,ax-round(1/yscale));
outtextxy(ay+4,ax-round(1/yscale),'1');
end;
end;

procedure DrawFunc(xmin,xmax,ymax,ymin:real; ax,ay,n:integer; var x,y:arr);
var i:integer;
xscale, yscale:real;
kx,ky:integer;
begin
xscale:=abs(xmax-xmin)/w;
yscale:=abs(ymax-ymin)/h;
for i:=0 to n do
begin
if xmin>0 then p[i].x:=ay+round(abs(x[i]-xmin)/xscale)
else if xmax<0 then p[i].x:=ay-round(abs(x[i]-xmin)/xscale)
else if x[i]<0 then p[i].x:=ay-round(abs(x[i])/xscale)
else p[i].x:=ay+round(abs(x[i])/xscale);

if ymin>0 then p[i].y:=ax-round(abs(y[i]-ymin)/yscale)
else if ymax<0 then p[i].y:=ax+round(abs(y[i]-ymax)/yscale)
else if y[i]<0 then p[i].y:=ax+round(abs(y[i])/yscale)
else p[i].y:=ax-round(abs(y[i])/yscale);
end;
setcolor(lightgreen);
setlinestyle(0,1,2);
drawpoly(n+1,p)
end;

procedure draw(ff:foo);
var gd,gm:integer;
ymin,ymax:real;
x,y:arr;
ax,ay:integer; {axis coords}
begin
gd:=detect;
initgraph(gd,gm,'');
setcolor(white);
rectangle(0,0,w,h);
FillCoords(x,y,a,b,num,ff);
GetMinAndMax(y, num, ymax,ymin);
DrawAxis(a,b,ymax,ymin,ax,ay);
DrawFunc(a,b,ymax,ymin,ax,ay,num,x,y);
readln; readln;
closegraph;
end;

var i:integer;

begin
assign(f,'points.txt');
rewrite(f);
while true do
begin
clrscr;
menu;
ch:=readkey;
if (ch>=chr(ord('1'))) and (ch<=chr(ord('3'))) then
begin
write('Enter width and height of the field:');
readln(w,h);
write('Enter min and max X:');
readln(a,b);
write('Enter number of points:');
readln(num);
end;
case ch of
'1': begin
write('Enter a1,b1..b3,c3; c0:');
for i:=1 to 10 do read(t[i]);
draw(trig);
end;
'2':begin
write('Enter polynomial power:');
read(pow);
write('Enter koefficients:');
for i:=1 to pow+1 do read(pol[i]);
draw(poly);
end;
'3':draw(func);
'4':break;
end;
end;
close(f);
end.
 
Статус
Закрыто для дальнейших ответов.