Stoppuhr in C
-
Dann hänge doch ein
cout << meine_gestoppte_zeit << endl;
an?
-
Hallo
Solang man nicht Stop drückt, gibt es aber noch keine Zeit.
-
DarthZiu schrieb:
start = clock(); while(!ABBRUCHBEDINGUNG_FÜR_DIE_STOPPUHR_ZUM_BEISPIEL_TASTENDRUCK) { cout << clock() - start << endl; } ende = clock(); meine_gestoppte_zeit = ende - start;
Beschreib uns doch mal genau, was dein Prog machen soll. Und auch, was du damit bezweckst. Vielleicht gibts ja bessere Ansätze.
-
Durch die Befehle, die zwischen start = clock() und ende = clock() liegen, geht doch auch Zeit verloren. Das ist die Zeit die Dir dort fehlt... Wie wärs mit sowas (angelehnt an DarthZiu):
start = jetzt(); while(!ABBRUCHBEDINGUNG_FÜR_DIE_STOPPUHR_ZUM_BEISPIEL_TASTENDRUCK) { ende = jetzt(); verstrichen = ende - start; /* Ausgabe aufbereiten */ Sleep(100 - (jetzt() - ende)); /* Die beim Berechnen und Ausgeben verstrichene Zeit von einer Sekunde abziehen */ } ende = jetzt() - start;
Viel genauer wirst Du es nicht hinbekommen.
(Habe für die Übersicht clock() durch jetzt() ersetzt, welches Millisekunden statt Clockticks liefert)EDIT: Die Berechnung bei dem Sleep dient nur dazu damit die Zwischenschritte auch wirklich jede Sekunde kommen, der Genauigkeit der Gesamtzeitnahme tut das keinen Abbruch.
EDIT2: Und sorry wegen cout, hier im ANSI C Forum natürlich printf
-
LordJaxom schrieb:
Durch die Befehle, die zwischen start = clock() und ende = clock() liegen, geht doch auch Zeit verloren.
Das is aber egal. IMHO soll der Befehl 'clock()' (is ja Pseudocode) ja irgend einen internen Zähler ausgeben. Was zwischen den Abfragen von 'clock()' geschieht ist da ja egal.
edit: Ups, clock() is doch kein Pseudocode. Is aber egal, dass ändert nichts an der Tatsache, dass du zwei fixe Werte hast, die nicht vom Programmablauf beeinflusst werden.
-
Hallo an alle
Das Programm soll bei beim Tastentruck von s eine Stopuhr starten. Am Konsolenfenster soll die verstrichene Zeit angezeigt werden. in HH : MM : SS. Beim Tastendruck irgendeiner Taste soll der Zähler stoppen und die verstrichene Zeit angezeigt werden. Beim nächsten Tastendruck wieder eine Rückkehr zum Menü. Und das möglichst genau.
-
Genau dies leistet mein Code, wenn Du ihn adaptierst.
@DarthZiu:
Klar, hast Recht. Aber der Ursprungscode misst eh nur die Zeit der einzelnen Schleifendurchläufe und bestimmt keine Gesamtzeit
-
Pseudocode:
gibZeitAus(zeit_zum_anzeigen) { verstrichene_sekunden = zeit_zum_anzeigen / CLOCKS_PER_SEC; // weiter umrechnen um auf min und std zu kommen printf(formatierte_zeit); } starteStoppuhr() { startzeit = clock(); do { gibZeitAus(clock() - startzeit); // warten, damit du den Proz nicht extrem auslastest // alle 500 ms aktualisieren sollte reichen, da du eh nur ganze // Sekunden zeigen willst Sleep(500); } while(!TASTENDRUCK); }
Wie du auf Tastendruck reagierst findest du hier im Forum in diversen Posts.
-
#define CPS (float)CLOCKS_PER_SEC #include <math.h> int h, m, s, i; float start, end, now, diff; start = clock() / CPS; // garnicht verkehrt, um clock() zu initialisieren while (!kbhit()) // bei tastendruck wird abgebrochen { for(i = random() * 1e5; i; --i); // macht n bisschen unfug und schlaegt zeit tot now = clock() / CPS; diff = ceil(now) - now; // zeit zur naechsten vollen sekunde (ceil rundet auf); hier passt man auch die aufloesung mit gut platzierten faktoren an sleep(diff); // sollte sleep denn floats fressen, ansonsten eben... // Sleep(diff*1000); // oder... // usleep(diff*1e6); /* zeit bestimmen fuer h/m/s */ printf("\r%d:%d:%d", h, m, s); } end = clock() / CPS; printf(gemessene zeit); // koernung haengt vom berechneten "diff" und darauf folgendem sleep ab
euer gefrickel macht mich krank.
-
wtf unser gefrickel? Ich dachte wir machen hier keine Hausaufgaben?!
-
ich hab aber nun auch nicht wirklich erkennen koennen, dass die diskussion zu einer akzeptablen loesung gefuert haette...
-
Hallo an alle
Danke für die Tipps
Ich hab das ganze gestern am Abend noch ausprogrammiert und es funktioniert. Ich werde das ganze heute noch einem Langzeittest unterziehen
Die formatierte Ausgabe wird noch geändert (Modulo).
Hier der Code
/*************************************************************************** Stoppuhr Autor: Robert Schilling Datum: 27.04.2006 ****************************************************************************/ #include <stdio.h> #include <conio.h> #include <time.h> #include <windows.h> /****************************************************************************/ //Prototypendeklaration void zeit_ausgabe(double verstrichene_zeit); void menue(void); char input(void); void stoppuhr(void); /*****************************************************************************/ int main (void) { char eingabe; do { system("cls"); menue(); eingabe = input(); switch(eingabe) { case 's': stoppuhr(); break; case 'x': case 'X': printf("Und Tschuess\n\n"); break; default: printf("Falsche Eingabe\n"); getch(); break; } } while(!(eingabe == 'x' || eingabe == 'X')); getch(); return 0; } void stoppuhr(void) { clock_t startzeit; startzeit = clock(); do { zeit_ausgabe(clock() - startzeit); Sleep(500); } while(!kbhit()); } char input(void) { char eingabe; eingabe = getch(); return eingabe; } void zeit_ausgabe(double verstrichene_zeit) { double zeit_anzeige; int stunden, minuten, sekunden; system("cls"); zeit_anzeige = verstrichene_zeit / CLOCKS_PER_SEC; stunden = zeit_anzeige / 3600; zeit_anzeige -= (stunden * 3600); minuten = zeit_anzeige / 60; zeit_anzeige -= (minuten * 60); sekunden = zeit_anzeige; printf("%d : %d : %d\n", stunden, minuten, sekunden); } void menue(void) { printf("==============\n"); printf("Stoppuhr V1.0\n"); printf("==============\n"); printf("\nStoppuhr starten\t[s]\n"); printf("Programm beenden\t[x]\n"); printf("---------------------------\n"); printf("Ihre Wahl: "); }
Gruß Robert
-
Tja da kann man mal sehen, wir haben c.rackwitz krankgefrickelt und den OP trotzdem auf eine Lösung gebracht....
-
Seid lieb zueinander ...