Oppure

Loading
03/05/10 17:56
Qualcuno mi sa spiegare perchè non funzioni in modalità "Orologio analogico"?


program cronometro;

uses wingraph,wincrt,sysutils,dos;

const
	x_origine:integer = 320;
	y_origine:integer = 200;
var
	sg,mg,scelta:integer;
	angolo_secondi,angolo_minuti,angolo_ore:real;
	s,h,m:integer;
	orario:string[8];
	s_s,h_s,m_s:string[2];
	secondi,minuti,ore,cento_secondi:word;

var x_termine,y_termine:integer;

procedure disegna_lancetta(angolo_in_gradi:real; colore:string);
begin
y_termine:=y_origine+trunc(sin(angolo_in_gradi*pi/180)*100);
x_termine:=x_origine+trunc(cos(angolo_in_gradi*pi/180)*100);
if colore='orange' then setcolor(orange)
else if colore='red' then setcolor(red)
else if colore='blue' then setcolor(blue)
	else writeln('ERRORE COLORE!');
line(x_origine,y_origine,x_termine,y_termine);
end;

procedure cancella_lancetta(angolo_in_gradi:real);
begin
setcolor(black);
y_termine:=y_origine+trunc(sin(angolo_in_gradi*pi/180)*100);
x_termine:=x_origine+trunc(cos(angolo_in_gradi*pi/180)*100);
line(x_origine,y_origine,x_termine,y_termine);
end;

begin
repeat
for s:=0 to 23 do writeln(' ');
writeln('1- OROLOGIO ANALOGICO		2- CRONOMETRO');
read(scelta);
s:=0;
until (scelta=1) or (scelta=2);


if scelta=1 then
	begin
	gettime(ore,minuti,secondi,cento_secondi);
	s:=secondi;
	m:=minuti;
	h:=ore;
	angolo_secondi:=270+secondi*6;
	angolo_minuti:=270+minuti*0.1;
	angolo_ore:=270+(ore mod 12)*0.008333333;
	end

else begin
	angolo_secondi:=270;
	angolo_minuti:=270;
	angolo_ore:=270;
	s:=0;
	m:=0;
	h:=0;
	orario:='00:00:01';
	end;

SetTextStyle(TimesNewRomanFont,90,4);
sg:=detect;
initgraph(sg,mg,'C:\FPC.4.0\units\i386-win32\wingraph');
circle(x_origine,y_origine,102);



repeat

angolo_secondi:=angolo_secondi+6;
angolo_minuti:=angolo_minuti+0.1;
angolo_ore:=angolo_ore+0.008333333;
disegna_lancetta(angolo_secondi,'orange');
disegna_lancetta(angolo_minuti,'blue');
disegna_lancetta(angolo_ore,'red');
s:=s+1;
if s<10 then s_s:='0'+inttostr(s)
	else s_s:=inttostr(s);
if m<10 then m_s:='0'+inttostr(m)
	else m_s:=inttostr(m);
if h<10 then h_s:='0'+inttostr(h)
	else h_s:=inttostr(h);
orario:=h_s+':'+m_s+':'+s_s;
setcolor(white);
outtextxy(x_origine-300,y_origine,orario);
if s=60 then
	begin
	s:=0;
	m:=m+1;
	end;
if m=60 then
	begin
	m:=0;
	h:=h+1;
	end;
delay(1000);

cancella_lancetta(angolo_secondi);
cancella_lancetta(angolo_minuti);
cancella_lancetta(angolo_ore);
setcolor(black);
outtextxy(x_origine-300,y_origine+0,orario);

until keypressed;

closegraph;

end.
03/05/10 21:17
Poggi Marco
Ciao!
Ho provato il tup programma, con FreePascal e funziona.

Ho trovato solo alcune piccole ingenuità:

Le librerie da dichiarare nella sezione uses sono: graph,wincrt,sysutils,dos

Le variabili sg ed ng (utilizzate per inizializzare la grafica), se usi Free Pascal, devono essere dichiarate necessariamente "smallint" (non integer).

L' istruzione " SetTextStyle ( TimesNewRomanFont, 90, 4 ) ; " va messa dopo aver inizializzato la grafica.

:-| Stranamente, il colore "orange", non è riconosciuto. (Probabilmente è dovuto al fatto che tu usi un compilatore diverso dal mio).

Perchè scrivi
...
  for s:=0 to 23 do writeln(' ');
  writeln('1- OROLOGIO ANALOGICO        2- CRONOMETRO');  
...


Non è meglio usare GoToXY()?

Ho notato, iniltre la funzione delay per l' attesa di un secondo. A mio avviso, non è il metodo migliore.

Ultima modifica effettuata da Poggi Marco 03/05/10 21:37
aaa
03/05/10 22:17
Si, per la funzione delay hai ragione. Ne creo una ad-hoc non appena rimetto mano sul mio pc.

Non ho usato gotoxy perchè in wincrt non c'è ne gotoxy ne clrscr :(..viene comunque una cosa leggermente bruttina da vedere perchè, anche se poco potenti, quelle due funzioni facevano comodo per gestire la "grafica" del terminale.
04/05/10 11:43
Phi
Ho trovato un errore in questa parte

 gettime(ore,minuti,secondi,cento_secondi);
 s:=secondi;
 m:=minuti;
 h:=ore;
 angolo_secondi:=270+secondi*6;
 angolo_minuti:=270+minuti*0.1;
 angolo_ore:=270+(ore mod 12)*0.008333333;


infatti l'angolo di ore e minuti viene calcolato come se fossero secondi: cioè se, per esempio, siamo alle 10:13:12, la lancetta delle ore occupa la posizione che dovrebbe occupare alle 0:0:10 e quella dei minuti la posizione che dovrebbe occupare alle 0:0:13.

Scriverei le variabili s, m e h come longword(per aumentare il range)
quindi:
 gettime(ore,minuti,secondi,cento_secondi);
 s:=secondi;
 m:=minuti*60+s;
 h:=(ore mod 12)*3600+minuti;
 angolo_secondi:=270+s*6;
 angolo_minuti:=270+m*0.1;
 angolo_ore:=270+h*0.008333333;

Ultima modifica effettuata da Phi 04/05/10 11:48
aaa
04/05/10 11:50
Phi
Esiste anche la unit wingraph comunque.
aaa