If Anweisung wiederholen



  • Hallo bin ein Ziemlicher Anfänger und bräuchte für ein Schulprojekt eure Hilfe.

    Undzwar versuche ich die Lokale Rechnerzeit ( Stunden) zu nehmen und wenn diese mit meiner Bedingung für die If Anweisung überein stimmt soll Licht an ausgegeben werden.

    Es klappt auch wenn ich das Programm starte wärend es in dieser Stunde ist.

    Nun will ich aber auch das es Automatisch angeht wenn es die Stunde überschreitet.

    Ich habe es schon mit einer Endlosschleife probiert hier mal mein versuch:

    #include <iostream>
    #include <ctime>
    
    int main()
    {
        using namespace std;
    
        time_t now = time(0);
        tm* uhrzeit = localtime( &now );
        int meow = uhrzeit->tm_hour;
    
    	i = 1;
        while (i == 1) // Bedingung
        {
    
    if (meow == 18) 
    {
    	 while (meow <= 18 or meow >= 6) // Bedingung
        {
            cout << "Licht an" << endl;  // Aktion
    
        }
    }
    
    }
    
        return 0;
    }
    

    Das Problem ist das wenn er von 17:59 auf 18 Uhr springt nicht Licht an ausgegeben wird.


  • Mod

    Da in deinem Beitrag ein paar Wörter zu fehlen scheinen:
    Du möchtest ein Programm, welches um 18 Uhr Ortszeit "Licht an!" und um 6 Uhr Ortszeit "Licht aus!" ausgibt und zwischendurch auf das Eintreffen dieser Bedingung wartet, oder?

    Prinzipiell ist eine Endlosschleife mit time() und Überprüfung der Bedingung eine Möglichkeit. Man muss es bloß richtig machen (Guck dir deine Schleife mal genau an. Kann sich da jemals etwas ändern?). Aber dieses sogenannte busy waiting ist keine besonders gute Möglichkeit.

    Insgesamt ist das Thema Zeitmessung, besonders Uhrzeitmessung (sogenannte wall clock time vs. process time) eher ein heikles Thema, bei dem man leicht in Bereiche kommt, die fortgeschrittenes Wissen über Zeitmessung und den zeitlichen Ablauf von Programmen erfordert. Daher Gegenfragen:
    -Wie genau soll es sein?
    -Auf welcher Art von System soll das laufen?
    -Sind Fremdbibliotheken erlaubt?
    -Sind Betriebssystembibliotheken erlaubt?
    -Ist C++11 (der "neue" C++-Standard von 2011, der vieles mitbringt, was die Aufgabe erleichtert) erlaubt?
    -Geht es eher darum, die Aufgabe an sich zu erfüllen oder eher darum, etwas dabei zu lernen?



  • -Wie genau soll es sein?
    Es sollte +- 59 sec max.

    -Auf welcher Art von System soll das laufen?
    Es sollte auf Windows 7 lauffähig sein .

    -Sind Fremdbibliotheken erlaubt?
    Wenn es dies erleichtert spricht nichts dagegen

    -Sind Betriebssystembibliotheken erlaubt?
    Eig. schon.

    -Ist C++11 (der "neue" C++-Standard von 2011, der vieles mitbringt, was die Aufgabe erleichtert) erlaubt?
    Es ist eig. alles erlaubt.

    -Geht es eher darum, die Aufgabe an sich zu erfüllen oder eher darum, etwas dabei zu lernen?
    Teils, Teils ich möchte schon gerne weiter kommen aber auch verstehen warum mein Quelltext nicht das macht was ich will.

    Edit: BTW Danke für den Tipp das sich da nichts verändern kann Sepp hat mir geholfen. Aber gibt es den noch eine elegantere Lösung? Weil Sie wegen lib. fragen.



  • eine möglichkeit wäre für dich, die Funktion Sleep(int millisec) zu verwenden. die funktion lässt das Programm die angegebene Zahl in millisekunden warten.
    es gibt bestimmt andere möglichkeiten (zb Timer von WINAPI), aber so brauchst du nicht so viel vorwissen (was sepp ja angesprochen hat)

    ich mache jetzt einen pädagogischen Fehler, also versuch bitte _jede_ Zeile zu verstehen.

    #include "time.h"
    #include "windows.h"
    #include "iostream"
    
    int main()
    {
        using namespace std;
        while(true)
        {
            time_t now = time(0);
            tm* uhrzeit = localtime( &now );
            int meow = uhrzeit->tm_hour; //stunden abfragen
            if(meow >= 18 or meow <7) //wenn es nach 18 uhr  oder vor 7(?)ist und das licht aus
            {
                cout << "Licht an" << endl;  // Aktion
            }
            else
            {
                cout << "Licht aus" << endl;  // Aktion
            }
        Sleep(60*1000); // Warte fuer 60 sekunden
        }
        return 0;
    }
    

    das programm gibt alle 60 sekunden an, ob das licht an oder aus sein soll. falls du jedoch nur eine ausgabe um 18 Uhr und eine um 6/7 uhr haben willst, versuch das mal selber reinzubauen. (tip: neue variable (oder minuten/sekunden abfragen))
    mfg



  • #include "time.h"
    #include "windows.h"
    #include "iostream"
    

    Wieso nicht spitze Klammern?
    Diese Anführungszeichen werden verwendet um eigene Header einzubinden, die nicht im Suchpfad des Compilers registriert sind...

    Plattform-unabhängiges Warten (C++11, bzw. Boost.Chrono & Boost.Thread):

    std::this_thread::sleep_for( std::chrono::minutes(1) ); // <chrono> + <thread>
    

    Alternative Tokens sind fragwürdig, siehe auch hier.


Log in to reply