Abfahrtzeiten



  • Hey Leute,
    Ich bin ein neuer Einsteiger im Programm C++ und ich benötige Hilfe bei dieser Aufgabe.
    Ich habe mich lange mit dieser Aufgabe beschäftigt, aber irgendwie klappt es nicht, wie ich es möchte.
    Es geht um folgendes:
    Erstellen Sie ein Programm, welches nach Eingabe der aktuellen Uhrzeit die Abfahrzeit des nächsten Busses auf dem Bildschirm ausgibt. Der Bus fährt zwischen 0 und 23 Uhr immer zur vollen Stunde (0:00 Uhr, 1:00 Uhr, …, 23:00 Uhr). Zusätzlich fährt der Bus zwischen 8:00 und 17:59 auch zu jeder halben Stunde (8:30 Uhr, 9:30 Uhr, …, 17:30 Uhr).
    Also alles hat funktioniert, außer beim takt=30

    Wenn ich Stunde:59 eingebe => Dann rechnete er, dass der Bus in -29 Minuten kommt.

    ich habe auch unsigned Differenz_Fahrt verwendet, damit nur positive Zahlen rauskommen. Irgendwie hat er komische Zahlen gezeigt.

    Ich werde mich auf jeden Vorschlag freuen.

    Dankeschön

     ... #include <iostream>
    #include<string>
    
    
    // --Project Template for Programming with C++. Have Fun!
    using namespace std;
    int main()
    {
    int aktuelle_Stunde;
    int aktuelle_Minute;
    int startstunde_Bus=0;
    int startminute_Bus=0;
    int takt;
     int Differenz_Fahrt;
    
    
        cout<<"Die aktuelle Stunde ";
        cin>>aktuelle_Stunde;
    
    
        cout<<"Die aktuelle Minute ";
        cin>>aktuelle_Minute;
    
    
       cout<<"Geben Sie die aktuelle Uhrzeit(Stunde Minute) ein: "<<aktuelle_Stunde<<":"<<aktuelle_Minute<<" Uhr"<<endl;
    
       cout<<"Es ist jetzt "<<aktuelle_Stunde<<":"<<aktuelle_Minute<<" Uhr.";
    
      if ((0<=aktuelle_Minute)&&(aktuelle_Minute<=59)&& (0<=aktuelle_Stunde)&&(aktuelle_Stunde<=8)){
               takt=60;
             Differenz_Fahrt=takt-aktuelle_Minute;
    if((aktuelle_Minute==0))
          Differenz_Fahrt=0;
       cout<<"Der naechste Bus kommt in "<<Differenz_Fahrt<<" Minute (n)."<<endl;}
    
    
     if ((8<=aktuelle_Stunde)&&(aktuelle_Stunde<=17)){
               takt=30;
             Differenz_Fahrt=takt-aktuelle_Minute;
    
    if((aktuelle_Minute==0))
          Differenz_Fahrt=0;
       cout<<"Der naechste Bus kommt in "<<Differenz_Fahrt<<" Minute (n)."<<endl;}
    if ((0<=aktuelle_Minute)&&(aktuelle_Minute<=59)&& (18<=aktuelle_Stunde)&&(aktuelle_Stunde<=24)){
               takt=60;
             Differenz_Fahrt=takt-aktuelle_Minute;
    if((aktuelle_Minute==0))
          Differenz_Fahrt=0;
       cout<<"Der naechste Bus kommt in "<<Differenz_Fahrt<<" Minute (n)."<<endl;}
    
    
    
    
    
        else{
        cout<<" Fehlerhaft Eingabe! "<<endl;
        }
    
        return 0;... 
    


  • Vorab: Das hat nix mit CLI zu tun, du bist also im falschen Subforum gelandet.

    Also, das wichtigste für dich sollte sein,
    a) Funktionen einzusetzen
    b) die Gültigkeitsbereich der Variablen zu reduzieren (weniger Variablen => einfacherer Code, geht einher mit Funktionen)
    c) das Einlesen von der Berechnung zu trennen
    d) den Quellcode ordentlich einzurücken!

    Und dann fragt die Aufgabe eigentlich nach der Uhrzeit des nächsten Busses und nicht nach der Dauer bis zur Abfahrt. Gut, da du die Dauer berechnet hast, zeige ich dir hier mal, wie das übersichtlicher geht.

    Erstelle eine Funktion int minutenBisAbfahrt(int h, int m), die ausschließlich die Dauer bis zur nächsten Abfahrt errechnet. Und NICHTS ANDERES tut, insbesondere keine Ausgaben tätigt. Diese Funktion wird dann nämlich ganz einfach.

    Und im main musst du dann nur noch einlesen, auf Gültigkeit überprüfen und die Funktion aufrufen.

    (wenn du deutlich fortgeschrittener bist: es gibt mit std::chrono::duration auch einen speziellen Typ für Zeitdauer - aber der wird aktuell noch zu kompliziert für dich sein)

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    // Gibt Anzahl an Minuten bis zur nächsten Abfahrt zurück
    int minutenBisAbfahrt(int h, int m) {
        if (m == 0)
            return 0;
        if (h >= 8 && h <= 17 && m <= 30)
            return 30 - m;
        return 60 - m;
    }
    
    /*
    // Gibt Stunde und Minute der nächsten Abfahrt zurück
    pair<int, int> naechsteAbfahrt(int h, int m) {
      // geht ähnlich einfach zu implementieren
    }
    */
    
    int main() {
        int aktuelle_Stunde;
        int aktuelle_Minute;
    
        cout << "Die aktuelle Stunde ";
        cin >> aktuelle_Stunde;
    
        cout << "Die aktuelle Minute ";
        cin >> aktuelle_Minute;
    
        if (aktuelle_Minute >= 0 && aktuelle_Minute < 60 && aktuelle_Stunde >= 0 &&
            aktuelle_Stunde < 24) {
            cout << "Es ist jetzt " << aktuelle_Stunde << ":" << aktuelle_Minute
                 << " Uhr. Der naechste Bus kommt in "
                 << minutenBisAbfahrt(aktuelle_Stunde, aktuelle_Minute)
                 << " Minute(n)." << endl;
        } else {
            cout << " Fehlerhaft Eingabe! " << endl;
        }
    
        return 0;
    }
    


  • Hi wob,
    ich danke dir für die Antwort.
    Ich bin noch eine Anfängerin.
    Mit der h und m,
    brauche ich es nicht zu definieren, dass es um Stunden und Minuten geht?
    Kannst du mir bitte diesen Part genauer erklären.
    Ich wäre sehr Dankbar dafür.

    int minutenBisAbfahrt(int h, int m) {
        if (m == 0)
            return 0;
        if (h >= 8 && h <= 17 && m <= 30)
            return 30 - m;
        return 60 - m;
    }
    
    


  • @dooni Bei der Funktion ist (implizit, da keine Dokumentation vorhabden) vereinbart , dass der erste Parameter die Stunden enthält und der Zweite die Minuten.

    h und m sind allgemein übliche Bezeichner dafür.



  • @dooni sagte in Abfahrtzeiten:

    Mit der h und m,
    brauche ich es nicht zu definieren, dass es um Stunden und Minuten geht?

    Verstehe die Frage nicht, sorry.

    Was genau an dem Codefragment ist denn unklar?



  • Ich weiß, ist jetzt vll ein wenig mit Kanonen auf Spatzen geschossen aber ich bin der Meinung, je früher man damit anfängt, umso besser ist es. Deshalb mal der verweis auf std::chrono
    https://en.cppreference.com/w/cpp/chrono/duration

    Hier gibt es hours und auch minutes.

    Allgemein lässt sich das super vereinfachen:

    #include <chrono>
    #include <iostream>
    
    std::chrono::minutes durationUntilNextBus(std::chrono::hours h, std::chrono::minutes m)
    {
        std::chrono::minutes interval(60);
        if (std::chrono::hours(8) <= h && h <= std::chrono::hours(17))
        {
            interval = std::chrono::minutes(30);
        }
        /* oder in etwas kürzer:
        std::chrono::minutes interval(std::chrono::hours(8) <= h && h <= std::chrono::hours(17) ? 30 : 60); */
        return interval - m % interval;
    }
    
    int main()
    {
        int aktuelle_Stunde;
        int aktuelle_Minute;
    
        std::cout << "Die aktuelle Stunde ";
        std::cin >> aktuelle_Stunde;
    
        std::cout << "Die aktuelle Minute ";
        std::cin >> aktuelle_Minute;
    
        if (aktuelle_Minute >= 0 && aktuelle_Minute < 60 && aktuelle_Stunde >= 0 && aktuelle_Stunde < 24)
        {
            std::cout << "Es ist jetzt " << aktuelle_Stunde << ":" << aktuelle_Minute <<
            " Uhr. Der naechste Bus kommt in " <<
            durationUntilNextBus(std::chrono::hours{aktuelle_Stunde}, std::chrono::minutes{aktuelle_Minute}).count() <<
            " Minute(n)." << std::endl;
        } else
        {
            std::cout << " Fehlerhaft Eingabe! " << std::endl;
        }
    
        return 0;
    }
    

Anmelden zum Antworten