Endlosschleife wiedermal



  • Hallo Leute, nach langer Unterbrechung meines Programmieren Lernens melde ich mich nun wieder zurück und natürlich wie könnte es anders sein wieder mit einem Fehler, den ich wirklich nicht nachvollziehen kann. Höchstwahrscheinlich ist es wieder einmal eine Kleinigkeit in meinem Code die ich einfach nur dauernd übersehe... Hier erst mal mein Code Auszug.

    cout << "Wollen Sie fuer eine weitere Strecke arbeiten? (J)a, (N)ein?\n";
     cin >> continput; // char
     switch(continput)
     {
      case ('J'):
      {
       cin.ignore();
      do
      {
       cout << "Bitte waehlen Sie zunaechst Ihren Abfahrtsbahnhof: "; cin.get(depstation.name, 13);
       cout << "Abfahrtszeit: "; cin >> depstation.deptime;
       cout << "Wieviele Passagiere reisen um diese Zeit: "; cin >> depstation.passengerCount;
       cout << "Wieviele Züge stehen im Raum dieser Station zur Verfuegung? " ; cin >> depstation.avtrains;
    
       cin.ignore();
    
       cout << "Nun waehlen Sie bitte noch Ihren Zielbahnhof, an dem die Passagiere abgeliefert werden sollen: "; cin.get(deststation.name, 13);
       cout << "Ankunftszeit: "; cin >> deststation.deptime;
       cout << "Wieviele Passagiere reisen um diese Zeit zurueck: "; cin >> deststation.passengerCount;
       cout << "Wieviele Züge stehen im Raum dieser Station zur Verfuegung? (Für Rueckfahrt)" ; cin >> deststation.avtrains;
    
       cout << endl;
    
       cout << "Ihre eingegebenen Daten lauten:\n\n" << "Abfahrtsbahnhof Name: " << depstation.name << endl;
       cout << "Abfahrtszeit: " << depstation.deptime << "\n";
       cout << "Passagieranzahl: " << depstation.passengerCount << "\n";
       cout << "Verfuegbare Züge: " << depstation.avtrains; cout << "\n\n";
    
       cout << "Zielbahnhof Name: " << deststation.name << endl;
       cout << "Ankunftszeit: " << deststation.deptime << "\n";
       cout << "Passagieranzahl: " << deststation.passengerCount << "\n";
       cout << "Verfuegbare Züge: " << deststation.avtrains; cout << "\n\n";
       cin.ignore();
    
       cout << "Sind Ihre Angaben korrekt? Schreiben Sie 'start'!"; getline(cin, start); // Fehler programm durchläuft schleife dennoch!
      } while(start != startok);
    
       cout << "Alles klar! Starte Berechnung...\n"; sleep(3);
    
      } break;
    

    Bitte um Vorschläge bezüglich evtl auch allgemeiner Optimierung dieses Codes.

    Zunächst habe ich es mit bool gemacht dann cin.ignore zu Beginn der Schleife, da ich mir überlegt habe, dass die Variable bool ja jedes mal neu definiert wird vor der Überprüfung der Bedingung. Dann ahbe ich es mit String versucht weil ich diese Variante für sicherer hielt, weil ja danach auch ein String kommt zu Beginn der Schleife. Wie würdet ihr das lösen? Ich tüftle mittlerweile seit Tagen herum. LG Martin



  • dass man mit switch case am besten nur mit int, bool oder char arbeitet?



  • ich hatte heute in meiner Arbeit das Buch "C++ für Spieleprogrammierer" von heiko Kalista mit. Mein Vorgesetzter, der selbst in seinen früheren Jahren Mobilfunkentwickler war, meinte, dass dieses Buch nicht so geeignet für das Erlernen der professionellen, praxisnahen Entwicklung geeignet sei. (ich würde das Buch ohnehin nur als Einstiegshilfe (Starthilfe) verwenden). Sein Argument war unter anderem, dass sich die Programmierung wie sie in diesem Buch dargestellt wird, sich zu vieler Hilfsmittel wie libraries und Visual Studio etc. bedient. Er meinte: Bibliotheken können Fehler enthalten. Man sollte alles selber machen. Die aufgezeigten Namenskonventionen seien auch nur ein Bruchteil und die Präprozessor Direktiven sind zudem auch fehleranfällig. Ein echtes Programm käme theoretisch mit einem Einsprungspunkt und Klassen aus. Ich möchte mich nur informieren, was Ihr dazu meint und ob ich vl mit den im Buch präsentierten Grundlagen bereits hinsichtlich professioneller Entwicklung tatsächlich schon zu sehr vorgreife?? Auf der Uni bei uns lernt man ja von der Pieke auf wirklich auch die absolute Theorie, das heißt was sind überhaupt verzweigungen wie sehen diese aus ohne Code, wie sieht der Maschinencode aus, also so etwas in der Art (also Binärcode usw.) Ich kann mich an eine Übung erinnern, da mussten wir üblicherweise verwendeten Code in Binärcode umwandeln...



  • venezianer27 schrieb:

    Bibliotheken können Fehler enthalten. Man sollte alles selber machen.

    venezianer27 schrieb:

    Ich möchte mich nur informieren, was Ihr dazu meint

    Kompletter Blödsinn!



  • Ok alles klar 🙂 und hast du zu meinem code ne idee? Ich häng da schon seit tagen 🙂

    Beim zweiten durchlauf der Schleife ende ich in einer endlosschleife


  • Mod

    Lass dir doch mal start ausgeben. Ich wette, da kommt so etwas wie 'art' heraus.



  • (...)

    Verfuegbare Züge: 5

    Sind Ihre Angaben korrekt? Schreiben Sie 'start'!start
    startAlles klar! Starte Berechnung...

    das ist meine Terminalausgabe!



  • soll ich mein cout << start hinschreiben, damit es wirklich überprüft werden kann, eh direkt nach der eingabe? Ich steh grad voll auf der Leitung...



  • vor allem wenn ich das cin.ignore() weglass kann ich ja den string überhaupt nicht eigeben nicht mal beim ersten durchlauf

    ich glaub ich versteh schon mit jedem durchlauf schneidet er ein zeichen ab bis kein string mehr eigegeben werden kann oder ist das komplett falsch



  • aber wenns so ist wie lös ich das dann



  • cin.get und getline holen sich das '\n', mit dem du die Eingabe abschließt. Deshalb das ignore().

    Wenn die Schleife das 2te mal durchlaufen wird, fehlt aber das ignore() vor dem ersten get.
    Wenn du dein erstes ignore() in die do-while Schleife verschiebst, sollte das klappen.

    Prinipiell würdest Du vielleicht bessere Antworten bekommen, wenn Du dir die in diesem Fall wirklich kleine Mühe machen würdest und ein lauffähiges Programm postest.



  • Ja stimmt schon, ich dachte nur, dass das in diesem Fall vl gar nicht nötig sei, weil er ja doch recht lang ist. Ich werds mal so versuchen, sollte es nicht klappen poste ich den vollständigen Code. Hab erstmal vielen Dank für den Hinweis 🙂


  • Mod

    venezianer27 schrieb:

    Ja stimmt schon, ich dachte nur, dass das in diesem Fall vl gar nicht nötig sei, weil er ja doch recht lang ist. Ich werds mal so versuchen, sollte es nicht klappen poste ich den vollständigen Code. Hab erstmal vielen Dank für den Hinweis 🙂

    Vollständig ist weniger wichtig als lauffähig. Siehe:
    Wie man Probleme nachstellbar und nachvollziehbar macht
    Ich hatte jedenfalls wenig Lust, mir die Bahnhofsklasse und 20 weitere Variablen zu definieren, bevor ich deinen Code ausführen konnte, um das Problem nachzuvollziehen. Entsprechend litt die Qualität meiner Hilfestellung. Das trifft sicher nicht nur auf mich zu.



  • [code="cpp"]
    #include <iostream>
    #include <unistd.h>
    #include <fstream>
    #include <stdlib.h>
    #include <cmath>
    #include <string.h>

    using namespace std;

    int main()

    {

    ifstream infile;
    char continput;
    string start;
    string startok = "start";

    struct S_station
    {
    char name[14];
    int deptime; // z.b. 0600 f. 6 Uhr früh
    int passengerCount; // abhängig von eingegebener Tageszeit (dynamic)
    int avtrains;
    };

    S_station depstation;
    S_station deststation;

    sleep(5);

    cout << "Wollen Sie fuer eine weitere Strecke arbeiten? (J)a, (N)ein\n";

    cin >> continput; // char
    switch(continput)
    {
    case ('J'):
    {
    do
    {
    cin.ignore();
    cout << "Bitte waehlen Sie zunaechst Ihren Abfahrtsbahnhof: "; cin.get(depstation.name, 13);
    cout << "Abfahrtszeit: "; cin >> depstation.deptime;
    cout << "Wieviele Passagiere reisen um diese Zeit: "; cin >> depstation.passengerCount;
    cout << "Wieviele Züge stehen im Raum dieser Station zur Verfuegung? " ; cin >> depstation.avtrains;

    cin.ignore();

    cout << "Nun waehlen Sie bitte noch Ihren Zielbahnhof, an dem die Passagiere abgeliefert werden sollen: "; cin.get(deststation.name, 13);
    cout << "Ankunftszeit: "; cin >> deststation.deptime;
    cout << "Wieviele Passagiere reisen um diese Zeit zurueck: "; cin >> deststation.passengerCount;
    cout << "Wieviele Züge stehen im Raum dieser Station zur Verfuegung? (Für Rueckfahrt)" ; cin >> deststation.avtrains;

    cout << endl;

    cout << "Ihre eingegebenen Daten lauten:\n\n" << "Abfahrtsbahnhof Name: " << depstation.name << endl;
    cout << "Abfahrtszeit: " << depstation.deptime << "\n";
    cout << "Passagieranzahl: " << depstation.passengerCount << "\n";
    cout << "Verfuegbare Züge: " << depstation.avtrains; cout << "\n\n";

    cout << "Zielbahnhof Name: " << deststation.name << endl;
    cout << "Ankunftszeit: " << deststation.deptime << "\n";
    cout << "Passagieranzahl: " << deststation.passengerCount << "\n";
    cout << "Verfuegbare Züge: " << deststation.avtrains; cout << "\n\n";
    cin.ignore();

    cout << "Sind Ihre Angaben korrekt? Schreiben Sie 'start'!"; getline(cin, start); // Fehler programm durchläuft schleife dennoch!
    } while(start != startok);

    cout << "Alles klar! Starte Berechnung...\n"; sleep(3);

    } break;
    case('N')
    {
    cout << "Programm wird geschlossen!\n";
    }
    default:
    {
    cout << "Falsche Eingabe\n";
    }
    }
    return 0;
    }



  • Damit das kompiliert fehlt fehlt dem case ('N') ein Doppelpunkt.


Log in to reply