Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - Orologio/cronometro analogico
Forum - Pascal - Orologio/cronometro analogico

Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
Qualcuno mi sa spiegare perchè non funzioni in modalità "Orologio analogico"?


Codice sorgente - presumibilmente Delphi

  1. program cronometro;
  2.  
  3. uses wingraph,wincrt,sysutils,dos;
  4.  
  5. const
  6.         x_origine:integer = 320;
  7.         y_origine:integer = 200;
  8. var
  9.         sg,mg,scelta:integer;
  10.         angolo_secondi,angolo_minuti,angolo_ore:real;
  11.         s,h,m:integer;
  12.         orario:string[8];
  13.         s_s,h_s,m_s:string[2];
  14.         secondi,minuti,ore,cento_secondi:word;
  15.  
  16. var x_termine,y_termine:integer;
  17.  
  18. procedure disegna_lancetta(angolo_in_gradi:real; colore:string);
  19. begin
  20. y_termine:=y_origine+trunc(sin(angolo_in_gradi*pi/180)*100);
  21. x_termine:=x_origine+trunc(cos(angolo_in_gradi*pi/180)*100);
  22. if colore='orange' then setcolor(orange)
  23. else if colore='red' then setcolor(red)
  24. else if colore='blue' then setcolor(blue)
  25.         else writeln('ERRORE COLORE!');
  26. line(x_origine,y_origine,x_termine,y_termine);
  27. end;
  28.  
  29. procedure cancella_lancetta(angolo_in_gradi:real);
  30. begin
  31. setcolor(black);
  32. y_termine:=y_origine+trunc(sin(angolo_in_gradi*pi/180)*100);
  33. x_termine:=x_origine+trunc(cos(angolo_in_gradi*pi/180)*100);
  34. line(x_origine,y_origine,x_termine,y_termine);
  35. end;
  36.  
  37. begin
  38. repeat
  39. for s:=0 to 23 do writeln(' ');
  40. writeln('1- OROLOGIO ANALOGICO          2- CRONOMETRO');
  41. read(scelta);
  42. s:=0;
  43. until (scelta=1) or (scelta=2);
  44.  
  45.  
  46. if scelta=1 then
  47.         begin
  48.         gettime(ore,minuti,secondi,cento_secondi);
  49.         s:=secondi;
  50.         m:=minuti;
  51.         h:=ore;
  52.         angolo_secondi:=270+secondi*6;
  53.         angolo_minuti:=270+minuti*0.1;
  54.         angolo_ore:=270+(ore mod 12)*0.008333333;
  55.         end
  56.  
  57. else begin
  58.         angolo_secondi:=270;
  59.         angolo_minuti:=270;
  60.         angolo_ore:=270;
  61.         s:=0;
  62.         m:=0;
  63.         h:=0;
  64.         orario:='00:00:01';
  65.         end;
  66.  
  67. SetTextStyle(TimesNewRomanFont,90,4);
  68. sg:=detect;
  69. initgraph(sg,mg,'C:\FPC\2.4.0\units\i386-win32\wingraph');
  70. circle(x_origine,y_origine,102);
  71.  
  72.  
  73.  
  74. repeat
  75.  
  76. angolo_secondi:=angolo_secondi+6;
  77. angolo_minuti:=angolo_minuti+0.1;
  78. angolo_ore:=angolo_ore+0.008333333;
  79. disegna_lancetta(angolo_secondi,'orange');
  80. disegna_lancetta(angolo_minuti,'blue');
  81. disegna_lancetta(angolo_ore,'red');
  82. s:=s+1;
  83. if s<10 then s_s:='0'+inttostr(s)
  84.         else s_s:=inttostr(s);
  85. if m<10 then m_s:='0'+inttostr(m)
  86.         else m_s:=inttostr(m);
  87. if h<10 then h_s:='0'+inttostr(h)
  88.         else h_s:=inttostr(h);
  89. orario:=h_s+':'+m_s+':'+s_s;
  90. setcolor(white);
  91. outtextxy(x_origine-300,y_origine,orario);
  92. if s=60 then
  93.         begin
  94.         s:=0;
  95.         m:=m+1;
  96.         end;
  97. if m=60 then
  98.         begin
  99.         m:=0;
  100.         h:=h+1;
  101.         end;
  102. delay(1000);
  103.  
  104. cancella_lancetta(angolo_secondi);
  105. cancella_lancetta(angolo_minuti);
  106. cancella_lancetta(angolo_ore);
  107. setcolor(black);
  108. outtextxy(x_origine-300,y_origine+0,orario);
  109.  
  110. until keypressed;
  111.  
  112. closegraph;
  113.  
  114. end.


PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 23:17
Lunedì, 03/05/2010
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
Codice sorgente - presumibilmente Pascal

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



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 il 03/05/2010 alle 23:37
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 0:17
Martedì, 04/05/2010
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.

PM Quote
Avatar
Phi (Member)
Expert


Messaggi: 241
Iscritto: 30/12/2009

Segnala al moderatore
Postato alle 13:43
Martedì, 04/05/2010
Ho trovato un errore in questa parte

Codice sorgente - presumibilmente Pascal

  1. gettime(ore,minuti,secondi,cento_secondi);
  2.  s:=secondi;
  3.  m:=minuti;
  4.  h:=ore;
  5.  angolo_secondi:=270+secondi*6;
  6.  angolo_minuti:=270+minuti*0.1;
  7.  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:
Codice sorgente - presumibilmente Pascal

  1. gettime(ore,minuti,secondi,cento_secondi);
  2.  s:=secondi;
  3.  m:=minuti*60+s;
  4.  h:=(ore mod 12)*3600+minuti;
  5.  angolo_secondi:=270+s*6;
  6.  angolo_minuti:=270+m*0.1;
  7.  angolo_ore:=270+h*0.008333333;



Ultima modifica effettuata da Phi il 04/05/2010 alle 13:48
PM Quote
Avatar
Phi (Member)
Expert


Messaggi: 241
Iscritto: 30/12/2009

Segnala al moderatore
Postato alle 13:50
Martedì, 04/05/2010
Esiste anche la unit wingraph comunque.

PM Quote