PDA

Visualizza la versione completa : [Programmazione C] Cronometro in ANSI C


Vakkovich
15-06-2016, 18:52
Salve a tutti, vorrei una piccola mano con del codice in ANSI C.
Praticamente dovrei creare un cronometro che una volta fermato, dopo averlo avviato, mi restituisca il tempo e me lo salvi in un file.
void stopwatch(){ time_t start_time;
time_t stop_time;
int hour,h = 0;
int sec;
int min,m = 0;
int s=0;
int n=0;
int c;
CLEAR();
int id=0;
char weather[15];
FILE *fp;
fp=fopen(file3,"a");
printf("Write Pilot ID: ");
scanf("%d", &id);
printf("\nInsert weather conditions: ");
scanf("%s",weather);
CLEAR();
printf("\tPress any number to START stopwatch\n");
scanf("%d",&n);


while(( c = getchar() ) != '\n' && c != EOF );
start_time = time(NULL);


do{
printf("\tPress the Enter Key to Stop the stopwatch");
}while(( c = getchar() ) != '\n' && c != EOF );
stop_time = time(NULL);


sec = difftime( stop_time , start_time );


while( sec >= 60 ){
min++;
sec = sec - 60;
}
while( min >= 60){
hour++;
min = min -60;
}
CLEAR();




fprintf(fp,"%d\t%s\t%02d:%02d:%02d\n",id,weather,hour,min,sec);
printf("Pilot ID: %d\n",id);
printf("Weather: %s\n",weather);
printf("Time: %02d:%02d:%02d\n",hour,min,sec);


fclose(fp);


}
Questo è il codice, ma non mi visualizza il cronometro in tempo reale. Ho provato ad aggiungerlo, ma non saprei come bloccarlo senza utilizzare librerie non standard.
Qualcuno potrebbe aiutarmi? :confused:

torn24
16-06-2016, 11:38
Ti do qualche consiglio, il programma postato non va bene se devi stampare a video il tempo ad intervalli regolari, visto che calcola il tempo solo dopo aver fermato il "cronometro".

Devi calcolare il tempo di un secondo, avendo lo scorrere dei secondi è facile costruirsi un orologio-cronometro.

Un problemino, senza usare librerie esterne, la stampa in output del c è limitata, stampa una riga dopo l'altra, quindi per stampare una sola informazione aggiornata bisognerebbe cancellare lo schermo con system("cls") in ambiente dos-windows, ma questo pone problemi, quindi o prevedere la stampa di un certo numero di righe, e poi effettuare una chiamata "cls" o ...


per calcolare lo scorrere di un secondo dovresti usare un codice simile a questo







do{
time(&stop);// nel loop acquisisco sempre il nuovo tempo
if( difftime (stop, start)>=1){// Se è passato un secondo


secondi++;

time(&start); // azzero la differenza tra stop e start, portandoli allo stesso valore
} // end if
}while(1);

Vakkovich
16-06-2016, 12:08
Ciao e grazie mille per il consiglio. Per quanto riguarda il problema del dover cancellare lo schermo ogni secondo ho risolto con
#ifdef WIN32#define CLEAR() (system("cls"))#else#define CLEAR() (system("clear"))#endifCosì con una semplice chiamata di CLEAR() dovrebbe funzionare sia su ambiente Linux che Dos-Windows.Ora il problema rimane dover bloccare il cronometro e stampare a video il tempo. Ho provato con kbhit() ma fa parte di conio.h e non è una libreria standard.

torn24
17-06-2016, 07:36
Ciao, perché devi usare solo la libreria standard del C, per renderlo portabile sia su linux che Windows, o perché ti è stato proibito di usare altro?
Secondo me, per stampare in Output e contemporaneamente "gestire" la tastiera, ho usi funzioni o usi thread, e tutti i metodi non fanno parte della libreria standard.

Per rendere il programma portabile, potresti usare i thread e il pre processore come fai con system(), includi header necessario , e imposti una costante di selezione, if(COSTANTE==1) funzioneThreadWindows() else funzioneThreadLinux()...

Loading