Timer



  • Heyoo,

    hab aus langeweile ein Timer geschrieben. Kein plan warum das nicht funktioniert. der will einfach nicht die 2te if abfragen mit der variable m. Springt einfach raus nachdem die Sekunden runter gezählt sind.

    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    int main()
    {
        int h, m, s;
    
        cout << "\n\t TIMER" << endl << endl;
    
        cout << " hours : ";
        cin >> h;
    
        cout << "\n\n minutes : ";
        cin >> m;
    
        cout << "\n\n seconds : ";
        cin >> s;
    
        for( h, m, s ; s > 0 && m > 0 && h > 0 ; )
        {
             system("cls");
    
             cout << "\n " << h << " : " << m << " : " << s;
    
             Sleep(1000);
    
             if( s > 0 ){ s--; system("cls"); continue; }
    
             else if( m > 0 ){ m--; s = 59; system("cls"); continue; }
    
             else if( h > 0 ){ h--; m = 59; s = 59; system("cls"); continue; }
    
             else { cout << "\n\n\a time out"; cout << "\a"; Sleep(100); cout << "\a"; 
             Sleep(1000); cout << "\a"; Sleep(1000); cout << "\a"; }    
        }    
        return 0;
    }
    


  • Problem gelöst anstatt && musste da || hin.



  • Trotzdem hätte ich zwei Anregungen:

    Gegen das Flackern \r statt cls.

    Und versuchen, weniger Sonderfälle zu haben, weniger Sprünge, weniger Vergleiche. Also die Runterzähllogik sagt selber schon, wenn Ende ist, das brauche nicht mehr mit || zu suchen.

    #include <iostream>
    #include <iomanip>
    
    //#include <windows.h>
    #include <unistd.h>
    
    using namespace std;
    
    int main() {
    	cout << "\n\t TIMER";
    
    	cout << "\n\n hours : ";
    	int h;
    	cin >> h;
    
    	cout << "\n\n minutes : ";
    	int m;
    	cin >> m;
    
    	cout << "\n\n seconds : ";
    	int s;
    	cin >> s;
    
    	int cs=0;
    
    	cout<<setfill('0');
    
    	for(;;) {
    		cout << '\r' << h << " : " << setw(2)<<m << " : " << setw(2)<<s << '.' << cs << ' ' << flush;
    
    		--cs;
    		if(cs==-1) {
    			cs=9;
    			--s;
    			if(s==-1) {
    				s=59;
    				--m;
    				if(m==-1) {
    					m=59;
    					--h;
    					if(h==-1) {
    						break;
    					}
    				}
    			}
    		}
    		//Sleep(100);
    		usleep(100000);
    	}
    	cout << "\n\n\a time out\n"<<flush;
    }
    


  • Ups, das gibt ja lustigen Code, wenn man mit "if(--cs==-1) cs=9; if(…" anfängt. Fast wingend ist, if(--cs==-1 && (cs=9)) if(…" und verschachtelte ifs sind nur && also

    for(;;) {
    		cout << '\r' << h << " : " << setw(2)<<m << " : " << setw(2)<<s << '.' << cs << ' ' << flush;
    
    		if(--cs==-1 && (cs=9) &&
    			--s==-1 && (s=59) &&
    				--m==-1 && (m=59) &&
    					--h==-1)
    						break;
    		//Sleep(100);
    		usleep(100000);
    	}
    


  • volkard, echt guter code! Wo lernt man diese Befehle die du benutzt. Würde mich sehr interessieren!



  • Und was hat es damit auch sich? cout<<setfill('0');



  • Pierce21 schrieb:

    volkard, echt guter code! Wo lernt man diese Befehle die du benutzt. Würde mich sehr interessieren!

    Ich hoffe das ist Ironie oO

    Denn weder dein Code noch der von volkard, der sich mit dem Code da drüber lustig macht, ist Code, den wir (ich unterstelle das einfach mal allen anderen ernsten Programmierern hier) jemals in der Praxis sehen möchten.



  • Kannst du das besser machen? Ich weis nicht wie man das noch verbessern kann. Außer es gibt ein befehl der selber ein Timer erstellt.

    Ich glaube ich habe den Code in der if anfrage verstanden.

    Millisekunden wird -- gerechnet und gefragt ob es -1 ist. Wenn nicht wird von vorne angefangen bis es stimmt. dann wird es wieder auf 9 zurück gesetzt falls es stimmt und es wird m -- gerechnet. Dann werden die Minuten abgefragt bis es stimmt u.s.w.

    setw(2) bedeutet soviel wie immer 2 Zahlen nebeneinander anzeigen. Also bei 1 01 anzeigen.

    \r verändert die Ausgabe.

    Sollte ich falsch liegen korrigiert mich.

    Was aber flush macht weis ich nicht.



  • cout ist ein gebufferter stream. Flush schreibt den raus. Sonst siehst du nur immer was wenn der Buffer voll ist.



  • Ahh, und was ist ein gebufferter Stream?



  • Nimm dir doch nur die mil.-sec aus und rechne die wieder um, anstatt alles aufgedröselt mit zunehmen. Sleep soll wohl dein Delta sein für die "richtigen Sprünge". Greif doch einfach direkt auf die Clock zu und nimm die zur Hilfe.



  • Skym0sh0 schrieb:

    Pierce21 schrieb:

    volkard, echt guter code! Wo lernt man diese Befehle die du benutzt. Würde mich sehr interessieren!

    Ich hoffe das ist Ironie oO

    Denn weder dein Code noch der von volkard, der sich mit dem Code da drüber lustig macht, ist Code, den wir (ich unterstelle das einfach mal allen anderen ernsten Programmierern hier) jemals in der Praxis sehen möchten.

    Wie arrogant kann man gegenüber einem Anfänger eigentlich sein?



  • Ja. Sowas ähnliches hatte ich auch im Kopf.
    Der Code entspricht zwar keiner Richtlinie die mir so einfällt, aber er hat was. Händisches optimieren, was wir alle Wissen nicht mehr benötigt wird weil der Compiler das viel viel viel besser kann.

    Na und. Trotzdem abgefahren schön. Und wenns funktioniert, OK.



  • Skym0sh0 schrieb:

    Pierce21 schrieb:

    volkard, echt guter code! Wo lernt man diese Befehle die du benutzt. Würde mich sehr interessieren!

    Ich hoffe das ist Ironie oO

    Denn weder dein Code noch der von volkard, der sich mit dem Code da drüber lustig macht, ist Code, den wir (ich unterstelle das einfach mal allen anderen ernsten Programmierern hier) jemals in der Praxis sehen möchten.

    Es ging mir nicht um Praxis-Code, sondern um die Programmierübung. Ich hatte genau wie Pierce21 ein Rollenzählwerk im Kopf und wollte nur das modellieren.
    http://de.wikipedia.org/wiki/Zählwerk
    Ist doch eine nette Übung, es möglichst direkt abzubilden.


Anmelden zum Antworten