Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας,

 

Θέλω να τυπώνω αντίστροφη μέτρηση π.χ. μισής ώρας

 

00:30:00

00:29:59

00:29:58

00:29:57

..

..

 

Είδα την βιβλιοθήκη time.h αλλα δεν κατάφερα κάτι υπάρχουν έτοιμες συνατρήσεις;

 

Ευχαριστώ για όποια βοήθεια.

Δημοσ.

Μέσο time.h θα μπορούσες να το κάνεις ως εξής:

 

>
/* Simple count down (lame - just for demo, no accurate latency checking), xdir */
#include <stdio.h>
#include <time.h>

int main(void) {

struct tm tm_start =
	{ 1, 30, 0, 1, 0, 112, 0, 0, 0 }, 	/* Counter start (00:30:00) */
		  tm_end =
	{ 0, 0, 0, 1, 0, 112, 0, 0, 0 },	/* Counter end   (00:00:00) */
		  *tm_cur= NULL;

/* Convert tm to time_t */
time_t tt_start = mktime(&tm_start),
	   tt_end   = mktime(&tm_end),
	   tt_rtc_a = time(NULL);			/* Chronometer */

int lsec = 1;							/* Seconds to subtract */

while(tt_end != tt_start) {				/* While Counter start <> Counter end */

	tt_start -= lsec;					/* -1 second */
	tm_cur = localtime(&tt_start);		/* Convert time_t to tm */
	/* Print tm clock members on STDOUT */
	printf("%.2d:%.2d:%.2d\n", tm_cur->tm_hour, tm_cur->tm_min, tm_cur->tm_sec);

	/*
	 * Sleep for 1 second
	 *  Notice: !! I do not count possible System Latency in ms, accuracy could suffer !!
	 */
	while((lsec = difftime(time(NULL), tt_rtc_a)) < 1);
	tt_rtc_a = time(NULL);
}

/* End of program */
puts("\nPress Enter to exit..");
getchar();
}

 

Η τιμή 112 συμβολίζει το παρόν έτος (2012), το "-=lsec" αφαιρεί ένα δευτερόλεπτο από την μεταβλητή tt_start. Το lsec είναι ο αριθμός των δευτερολέπτων που θα αφαιρέσουμε (υπό φυσιολογικές συνθήκες θα είναι 1). Η αναμονή (sleep) επιτυγχάνεται με την βοήθεια της difftime.

 

Σημείωση: Υπόψη όμως ότι σε ένα multitasking περιβάλλον υπάρχει πάντα κίνδυνος η εκτέλεση της διεργασία μας να καθυστερήσει μερικά ms λόγο φόρτου εργασίας της CPU, σε αυτή την περίπτωση οφείλουμε να υπολογίσουμε στην αφαίρεση μας την καθυστέρηση αυτή καθώς μπορεί αθροιστικά να είναι πάνω από ένα δευτερόλεπτο καταστρέφοντας την ακρίβεια της χρονομέτρησης μας. Το παραπάνω πρόγραμμα λαμβάνει υπόψη του το γεγονός αυτό σε επίπεδο όμως δευτερολέπτου (βλ. lsec = difftime) οπότε δεν μπορεί να θεωρηθεί ακριβές (παρά μόνο σε ιδανικές συνθήκες) αλλά είναι αρκετό για να πάρεις μια ιδέα για το ζήτημα.

 

Καλή συνέχεια! :)

 

Υ.Γ.

Το πρόγραμμα έχει δοκιμασθεί σε C++ Builder και μπορεί να περιέχει bugs ή άλλες αβλεψίες.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...