Warum ergibt das eine Endlosschleife?


  • Mod

    😡 Dann war die frage die ganze Zeit, warum das keine Endlosschleife ergibt? Na vielen Dank, das hätten wir dir auch sofort beantworten können. 😡

    Criseas schrieb:

    Die Frage ist nun geklärt. Aber warum Funktioniert es nicht so wie gewünscht?

    Um es mal direkt zu sagen: Weil dein Code ein totales Schlamassel ist. FreakY<3Cpp hat schon ein paar passende Bemerkungen gemacht. Dein Einsatz der Kontrollstrukturen ist total wirr und sinnlos. Schmeiss den ganzen Code weg. Mach dir erstmal Gedanken, wie dein Programm ablaufen soll. Das malst du dir dann auf einem Blatt Papier als Ablaufplan hin. Und diesen Plan übersetzt du dann in C++ Kontrollstrukturen. Und dann wird das auch funktionieren.



  • Auch wenn ich jetzt das Bedürfnis verspüre eine Made zu zerquetschen, würde ich nicht so weit gehen wie der Sepp.

    Die Schleife while(count==1) bricht auf jeden Fall ab, weil du das zweite return 0 innerhalb dieser Schleife positioniert hast und nicht kurz vor Ende der main() wo es vermutlich hin soll.

    Und das cin kannst du vor dem if nicht so einfach verwenden, weil durch den Abbruch mit STRG-Z das Objekt cin noch immer in einem Fehlerzustand ist. Du müsstest also den Puffer leeren und den Fehlerzustand beseitigen. Dann kannst du damit die Variable count einlesen.

    Ansonsten ist dein Programm ganz OK und wird wohl auch tun, was du geplant hast.



  • Nein, SeppJ hat Recht, der Code ist Müll und macht überhaupt keinen Sinn.



  • FreakY<3Cpp schrieb:

    Nein, SeppJ hat Recht, der Code ist Müll und macht überhaupt keinen Sinn.

    Dem kann ich nicht zustimmen.

    Die Kontrollstrukturen sind absolut OK und hätten ohne die allgemeine Vewirrung/Schwierigkeit mit cin wunderbar gearbeitet.

    Als nächstes wird der Fragesteller wohl merken, dass er mit item1, item2, item3 nicht ganz das erreicht was er plant und sich z.B. mit Arrays beschäftigen.

    Programmiertechnisch ist das also schon OK und absolut im Rahmen des Weges den ein Programmieranfänger nun mal gehen muss.

    Ich denke gerade DU kannst dich gut in diese Lage hineinversetzen.



  • Danke euch leute^^,

    Etwas zu meiner Verteidigung.

    Anfangs war es wirklich so das eine Dauerschleife kam. Allerdings habe ich den Fehler irgendwann gefunden, und später ja die andere Version mit dem cin in der While Schleife gepostet. Da hat ich das Problem vergessen neu zu Definieren.

    Danke dir Hmpf für die Verteidigung :). Das Programm tut eigtl schon was es soll nur Hmpf hat mir gerade den Fehler genannt den ich hatte.

    Der Puffer muss geleert werden... das kann ich mit cout tun soweit ich weiß!? Allerdings möcht ich das ja ungern ausgeben, gibt es noch eine andere möglichkeit den Puffer zu leeren sodas ich cin wieder verwenden kann?

    Wie muss ich das mit dem Puffer eigtl genau verstehen, das wurde im Buch noch nicht erläutert, denn ich kann die ganze Zeit Daten eingeben ohne das soetwas passiert?

    Danke schonmal^^

    Grüße
    Criseas



  • Was redest du immer von Kontrollstrukturen? Ich red garnicht von der Klasse, sondern von der main, die Logik fehlt dort doch total.



  • FreakY<3Cpp schrieb:

    Was redest du immer von Kontrollstrukturen? Ich red garnicht von der Klasse, sondern von der main, die Logik fehlt dort doch total.

    Nachdem du sagst der Sepp hat Recht beziehe ich mich auf die Aussage vom Sepp.

    Die Logik ist doch ersichtlich. Eine Schleife liest das ISBN-Zeug ein und die andere wertet aus und fragt dich ob du es nochmal machen willst, oder abbrechen willst.

    Wo ist das Problem?

    Der Umgang mit der Klasse ist noch etwas seltsam (also die If-Bedingungen in der inneren Schleife) und ein paar Schönheitsfehler sind noch dabei (z.B. würde ich keinen Sales_item-Wert vor der inneren Schleife einlesen lassen), aber sonst ist der gute Criseas doch auf dem richtigen Weg.

    @Criseas
    Mit cout geht das nicht. Das Problem ist der Eingabepuffer. Wenn du etwas eingibst liest cin das aus dem Eingabepuffer und verschiebt es in die Variable.

    Hast du etwas eingegeben, das nicht in die Variable passt (z.B. einen Buchstaben wo eine Zahl verlangt wird, oder zwei Zahlen wo nur eine gebraucht wird), bleibt der nicht zu gebrauchende Teil im Eingabepuffer. Beim nächsten cin Befehl ist also eventuell die Eingabe des Vorhergehenden noch im Eingabepuffer.

    Hast du z.B. einen Buchstaben eingegeben wo eine Zahl erwartet wird, wird das cin-Objekt sogar in einen Fehlerzustand gesetzt und kann vorerst nicht mehr zur Eingabe verwendet werden. Dasselbe gilt für die Eingabe von EOF.

    Du musst also den Eingabepuffer leeren und den Fehlerzustand beseitigen. Vielleicht ist es sogar sinnvoll das vor jeder Eingabe zu tun. Allerdings können dann Daten nicht mehr sozusagen in einem Aufwasch eingegben werden.

    Wie man den Puffer von cin löscht und den Fehlerzustand beseitig sagt dir die Forensuche oder Googgle. Das wurde schon unzählige Male beantwortet.

    Bevor du komplizierte Menüs mit cin und cout aufbaust, solltest du zuerst etwas mit denen experimetnieren, denn die verhalten sich nicht immer so, wie man das erwarten würde.



  • Hast du was geraucht oder bist du ein Troll? Oder bin ich blind. Die Logik macht eben kein Sinn. Lies dir meinen Post auf der 1. Seite durch, dann wirst du sehen was ich meine und das kannst du nicht abstreiten, dass das Programm es so macht, wie ich es beschrieben hat.



  • FreakY<3Cpp schrieb:

    Allgemein versteh ich auch nicht so ganz was du da veranstaltest. Du hast 4 Items und eine Eingabe, dann lässt du den Benutzer eine ISBN eingeben, die unter item1 abgespeichert wird. Dann lässt du den Benutzer nochmal eine ISBN eingeben, die unter eingabe gespeichert wird und prüfst über eine Funktion, ob diese gleich sind (wie wärs wenn du den == Gleichheitsoperator überlädst?) und wenn sie gleich sind, dann verbindest du item1 mit der eingabe (ich hoffe du hast den + Operator überladen). Was macht das für einen Sinn? Du verbindest sie nur wenn beide gleich sind und wenn nicht, ist die Eingabe ungültig.

    Naja okey, dann greif ich den Post nochmal auf.

    Ich lasse die ISBN vor der Schleife einlesen damit ich die variable Initialisieren kann. Denn ansonsten kann ich keine Prüfung machen ob die zweite Eingabe mit der ersten passt. Case kannU/wollte ich nicht verwenden weil ich das Buch einfach Strickt durcharbeiten möchte (und nach Vorblättern kann ich bestätigen das dies ehe noch thema wird).

    Was ist mit Überladen gemeint? Wenn item 1 keinen Wert hat brauch ich ihn ja nicht vergleichen mit eingabe, aber genau deswegen initialisier ich ihn vor der schleife.

    ebenso mit + Überladen versteh ich das sowenig wie mit == überladen.

    Genau wenn die eingabe nicht passt. Kann ich sie nicht mit der bestehenden verpassen, in einem späteren Programm wollte ich auf die item 2 3 4 usw verschiedene ISBN verteilen

    Aber solange ist für das Programm 0-201-78345-x != 0-202-78345-x halt noch nicht möglich.

    Ich finde für mein bisheriges Wissen ist das Programm nicht unzureichend logisch Strukturiert. Ich weiß allerdings nicht wie ich es momentan besser umsetzen könnte. Da mit ansonsten einfach manche Sachen noch fehlen. Z.b. Case um mehr als 2 möglichkeiten zu haben und IFs verschachteln ist suboptimal finde ich.

    Eine neue Subfunktion hat irgendwie mit
    Sales_Item subfunktion(Sales_Item blub1, blub2)
    nicht funktioniert, warum weiß ich noch nicht.

    Aber ich denke ich kriege das noch raus... um meine beweggründe mal ein bisschen zu erklären.
    Wenn ich das Programm mit meinen bisherigen mitteln hätte optimaler schreiben können, bitte zeig es mir. 🙂

    @hmpf okey hab ich getan 🙂
    mit

    cin.clear ()
    

    danke dir soweit 🙂



  • Ich zeig dir jetzt mal was dein Programm macht

    int main() {
        Sales_item eingabe, item1, item2, item3, item4; //variablen definition
        int count=1; //count wird auf 1 intialisiert
        while(count==1) // da count zuvor auf 1 gesetzt wurde, passt alles
        {
          cout<<"Geben sie ihre ISBN ein!"<<endl;
          cin>>item1;// ich geb eine ISBN ein, als Beispiel jetzt einfach mal nur "123a"
          cout<<"next"<<endl;
          while(count<=3) // da 1 kleiner als 3 ist, wird es ausgeführt
          {
            cin>>eingabe //ich geb noch eine ISBN ein, sagen wir "321b"
            if(eingabe.same_isbn(item1)) //*1 321b ist nicht das gleiche wie 123a
            { //*2 gebe ich 123a ein, weil item1 123a enthält und das if das verlangt
              item1 = item1 + eingabe;  //*2 wird item1 an eingabe angeknöpft, rauskommen sollte 123a123a, aber der + operator ist nicht überladen
              cout<<"next"<<endl;
              count++; //*2 count wird um eins erhöt und das ganze fängt nochmal von vorne an, wobei am Ende 123a123a123a rauskommt...
            } else { //*1 also komme ich hier hin
              cout<<"Ungültige eingabe!"<<endl;
            }
          }
          cout<<count<<" Transaktionen: "<<item1<<endl;
          cout<<"1. Weiter | 2. Abbruch"<<endl;
          cin>>count; //egal was ich eingebe
          if(count!=1) {
                     return 0; //entweder wird das programm hier beendet
                     }
          return 0; //oder hier...
        }
    }
    

    Wenn du nicht weißt, was mit Überladung gemeint ist, solltest du mal mittlerweile endlich gegooglet haben. Durch die Überladung wird einfach das Standardverhalten verändert.



  • Eine neue Subfunktion hat irgendwie mit
    Sales_Item subfunktion(Sales_Item blub1, blub2)
    nicht funktioniert, warum weiß ich noch nicht.

    Also du solltest den C++ Primer etwas gründlicher lesen.
    blub2 braucht auch noch einen Typ, d.h. so funktioniert es:

    Sales_Item subfunktion(Sales_Item blub1, Sales_Item blub2) { /* Anweisungen */ }
    


  • bnz schrieb:

    Eine neue Subfunktion hat irgendwie mit
    Sales_Item subfunktion(Sales_Item blub1, blub2)
    nicht funktioniert, warum weiß ich noch nicht.

    Also du solltest den C++ Primer etwas gründlicher lesen.
    blub2 braucht auch noch einen Typ, d.h. so funktioniert es:

    Sales_Item subfunktion(Sales_Item blub1, Sales_Item blub2) { /* Anweisungen */ }
    

    Okey danke dir werd ich Probieren, im Primer kam das noch nicht dran.

    @Freaky, schau mal den zweiten Quelltext an, der erste von mir ist komplett hinfällig.



  • Der unterscheidet sich kein Meter vom 1., bis auf das du "while(count <= 3)" zu "while(cin >> eingabe" machst, der Rest ist vollkommen gleich und genau so falsch.


Anmelden zum Antworten