Warum ergibt das eine Endlosschleife?
-
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

mitcin.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.