[ Zorzo @ 25.10.2007. 18:10 ] @
U školi sam dobio zadatak od profesora fizike da ispišem program, koji iscrtava harmonijske oscilacije.
Moja skripta izgleda ovako:


Code:
Program oscilacije;
USES CRT, GRAPH;

VAR

GD, GM: smallint;
 X0, Y0, ni1, ni2, fi, dt, x, y, pi,t0, t:real;
 x1, y1 : integer;


BEGIN
write('unesi amplitudu X (do 100) ');
readln(X0);
write('unesi amplitudu Y (do 100) ');
readln(Y0);
write('unesi frekfrenciju NI1 ');
readln(NI1);
write('unesi frekfrenciju NI2 ');
readln(NI2);
write('unesi pocetnu fazu u stepenima ');
readln(NI2);
pi:=3.14;
FI:=FI*PI/180;
X1:=250;
Y1:=100;
t:=0;
X:=x0*sin(2*pi*NI1*T);
y:=y0*sin(2*pi*NI2*T+fi);
x:=x1+x;
y:=y1+y;
initgraph(gd, gm, '..\bgi');
circle(x, y, 1);
readln;
closegraph;
if ni1<ni2 then t0:=1/ni1  else t0:=1/ni2;
dt:=t0/10000;
t:=t+dt;
if t>t0 then repeat until t=1000;
END.


Već duže pokušavam da provalim, ali ne uspijevam.
Glavni problem su mi varijable. Kada x i y stavim integer, neće da računa, kada stavim real, neće da crta.
[ Miroslav Ćurčić @ 25.10.2007. 18:29 ] @
Radi li sa :
circle(round(x), round(y), 1);

Čemu li ti služi ono petljanje na kraju programa?
[ Zorzo @ 25.10.2007. 19:21 ] @
Konačno je kompajlirao, bez greške (kada sam stavio round(x) i (y)). Sada kad pokrenem program ubaci uvijek jedno rešenje.
To je jedna tačkica, uvijek na istom mjestu.
Da li pod petljanjem podrazumijevaš "if t>t0 then repeat until t=1000;"?
To je ponavljanje funkcije, da bi se računalo, u zavisnosti od vremena (u datom sekundu).
Naime u programu se unose konstante (amplitude, frekfrencije, početna faza). Kada ih unesemo, program treba da izračuna koordinate za prvi sekund, i da ih na grafiku predstavi tačkom. Nakon toga, računa za drugu sekundu, dobijamo druga rešenja (koordinate), i iscrtava se druga tačka, onda se računa treća sekunda, i tako u krug, dok ne dobijemo grafik.

Profesor je program ispisao valjda u basicu.
On je za petlju iskoristio komandu goto, koje nema u pascalu. Napisao je if t<t0, then goto 100. 100 je red u kome piše X:=x0*sin(2*pi*NI1*T).
Mislim (gotovo sam siguran) da je greška i kod petlje zato što mi postavlja samo jednu tačku, a ne niz (krivulju).



Ako može biti od koristi, evo program koji je on ispisao:
Code:

10     print "unesi amplitude (do 100)";
20     input x0,y0
30     print "unesi frekfrencije";
40     input ni1,ni2
50     print "unesi početnu fazu (u stepenima)";
60     input fi
61     pi:3.14
62     fi=fi*pi/180
64     x1=250 : y1=100
70     t=0
90     cls
100     X=x0*sin(2*pi*NI1*T)
110     y=y0*sin(2*pi*NI2*T+fi)
115     x=x1+x : y=y1+y
120     screen 2 : circle (x,y),0
125     if ni1<ni2 then t0=1/ni1 else t0=1/ni2
126     dt=r0/10000
127     t=dt+t
128     if t<t0 then goto 100
140     end


Dakle, treba da iscrta više tačaka (da se popravi petlja), a rešenje je uvijek isto (mislim da će da se promijeni, kad se ispravi petlja, jer je t=0 u početku, a tek u sledećem sekundu je veće od nule).
Šta predlažete za petlju?

I da, umalo da zaboravim, veliko hvala mVeliki.
[ Zorzo @ 25.10.2007. 20:55 ] @
Uspio sam da pronađem komandu sličnu goto (label), koji se postavlja u dijelu koda koji treba ponavljati.
Program konačno ponavlja to što se od njega očekuje, ali ne iscrta kompletnu liniju (krivulju), nego prikazuje svaku tačku pojedinačno. A drugu tačku prikaže tek nakon što pritisnem enter, ali se prethodna briše.

Kod sada izgleda ovako:
Code:

Program fizika;
USES CRT, GRAPH;

VAR

GD, GM: smallint;
X0, Y0, ni1, ni2, fi, dt, x, y, pi,t0, t:real;
 x1, y1 : integer;
LABEL Ponovi;
BEGIN
write('unesi amplitudu X (do 100) ');
readln(X0);
write('unesi amplitudu Y (do 100) ');
readln(Y0);
write('unesi frekfrenciju NI1 ');
readln(NI1);
write('unesi frekfrenciju NI2 ');
readln(NI2);
write('unesi pocetnu fazu u stepenima ');
readln(NI2);
pi:=3.14;
FI:=FI*PI/180;
X1:=250;
Y1:=100;
t:=0;
ponovi:
X:=x0*sin(2*pi*NI1*T);
y:=y0*sin(2*pi*NI2*T+fi);
x:=x1+x;
y:=y1+y;
initgraph(gd, gm, '..\bgi');
circle(round(x), round(y), 1);
closegraph;
if ni1<ni2 then t0:=1/ni1  else t0:=1/ni2;
dt:=t0/10000;
t:=t+dt;
if t<t0 then goto  Ponovi;
END.

Dakle pitanje je kako da povežem tačkice.
[ Miroslav Ćurčić @ 25.10.2007. 23:45 ] @
Izvuci initgraph pre glavne petlje i skloni closegraph na sam kraj.
Time ćeš dobiti da ti se ne briše prethodno iscrtano.
[ Zorzo @ 26.10.2007. 12:46 ] @
Još jednom hvala mVeliki.
Radi, a uspio sam i pomoću komande repeat.