Beliebig häufige Wiederholung



  • Hi!
    Also ich habe es jetzt so ähnlich gemacht, wie Lideric es vorgeschlagen hat. Allerdings habe ich nun das Problem, dass in einer Funktion, die sich in der do...while Schleife befindet, mit "cin.get(r);" ebenfalls auf eine Eingabe gewartet wird, die durch Return beendet wird.
    Wenn ich das Programm nun wiederholen möchte (indem ich "a" eingebe) wird die Eingabe "cin.get(r);" übersprungen.
    Ich kann also die eigentliche Funktion nur einmal ausführen.
    Was kann man tun, um dies zu unterbinden?

    Ein Beispiel:

    #include <iostream.h> 
    
    int main()  
    {  
        char c,r;  
        do  
        {  
            c = '\0';
    		r = '\0';
    		cout << "r:" << endl;
            cin.get(r);
    		cout << "c:" << endl;
            cin >> c;  
        } 
    	while (c == 'a');  
    	cout << r;
    	cout << c;
     }
    

    Vielen Dank im voraus
    Vertigo



  • behandle 'r' wie 'c' mit std::cin... oder mach es mit dem ignore wie HumeSikkins es vorschlug.



  • Also der Befehl "cin.ignore(cin.rdbuf()->in_avail());" soll doch bewirken, dass der gesamte Inhalt, der über cin.get() eingelesen wurde, ignoriert wird. Aber der Zeilensprung '\n' wird trotzdem nicht ignoriert. Gibt es nicht eine Möglichkeit (vielleicht über cin.clear) den gesamten eingelesenen Inhalt (inklusive Zeilensprung) zu löschen?

    Vertigo



  • probiers mal mit:

    std::cin.ignore((std::numeric_limitsstd::streamsize::max)(), std::cin.widen('\n'));

    (benötigt <limits>)



  • Hi!
    Also als Header würde ich gerne bzw darf ich nur die alte Datei iostream.h benutzen. Das Problem ist ja, das "das Return" bei cin.get() gespeichert bleicbt, und man bei einer Wiederholung kein zweites cin.get() durchführen kann. Hier ist nochmal ein Beispielprogramm:

    #include <iostream.h> 
    
    int main()  
    {  
        char c,r;  
        do  
        {  
    
    		r = '\0';
    		cout << "r:" << endl;
            cin.get(r);
    		c = 0;
    		cout << "c:" << endl;
            cin >> c;  
        } 
    	while (c == 'a');  
    	cout << "r:" << r << endl;
    	cout << "c:" << c << endl;
     }
    

    Bei dem Programm kann man einmal das "r" bestimmen. Mit a für die Variable "c" sollte man "r" eigentlich erneut bestmmen können. Aber dies ist ja nicht möglich(s.o.) Und der Befehl cin.ignore(cin.rdbuf()->in_avail()); hilft da auch nciht weiter...



  • Hallo,
    welchen Compiler verwendest du? Wenn die ignore-Methode nicht funktioniert, probier's mal mit cin.sync():

    #include <iostream.h>
    int main()
    {
        char c,r;
        do
        {
    
            r = '\0';
            cout << "r:" << endl;
            cin.get(r);
            cin.sync();
            c = 0;
            cout << "c:" << endl;
            cin >> c;
            cin.sync();
        }
        while (c == 'a');
        cout << "r:" << r << endl;
        cout << "c:" << c << endl;
    }
    

    Warum verwendest du eigentlich einmal cin.get und einmal den op>>? Und warum <iostream.h>?



  • Hallo,
    also dieses Programm, dass ich schreibe ist eine Hausaufgabe. Ich habe seit ca einem halben Jahr C++ an der Schule. Ich habe zwar auch schon mit Basic und Pascal usw programmiert, aber in C++ bin ich noch ein Anfänger. Als Compiler verwende ich MS Visual C++. Und Iostream und namespaces usw hatten wir noch nicht und möchte ich von daher auch nur ungerne verwenden.
    Das Programm soll einen Text, den der Anwender eingibt, auswerten und das Ergebnis ausgeben. Dieser Vorgang soll dann beliebig oft wiederholbar sein (Durch drücken einer bestimmten Taste).
    Im Prinzip habe ich das Programm fertig. Nur die Wiederholschleife bekomme ich nicht hin... 😞
    Das Hauptprogramm:

    int main()								
    {
      int m[5][5];
    
      reset(m);
      auswertung(m);
      ergebnis(m);
    
      return(0);
    }
    

    Das Problem ist nun, das ich in der Prozedur Auswertung den Befehl cin.get(c) verwende. Im Hauptprogramm habe ich die drei Funktionen in eine do...while-schleife geschlossen. Über cin >> e; wollte ich dann eine einfache Abfrage machen, die dann mit dem Wiederholzeichen verglichen wird. Stimmt beides überein werden die Schleifen erneut durchlaufen.
    Wie ich aber mittlerweile herausgefunden habe, wird der terminator (\n) bei cin.get(c) gespeichert. (Obwohl ich c (als char) als Variable in der Funktion jedes mal neue deklariere!!) Dementsprechend klappte die do...while-Schleife und das Programm wird erneut durchgeführt. Ich kann aber in der Funktion "Auswertung" keine Eingabe machen. Stattdessen kann ich nur noch die Eingabe machen, ob ich das Programm erneut starten möchte. Drücke ich dann das entsprechende zeichen werde ich sofort danach erneut gefragt, bis ich ein anderes Zeichen eingebe und das Programm somit beende.
    Ich habe also versucht einen Befehl zu finden, mit dem ich den terminator oder das ganze cin.get() löschen kann (Vielleicht mit cin.clear oder cin.ignore(cin.rdbuf()->in_avail());). Allerdings klappt es mit keine der Funktionen. Soweit ich weiß kann man auch mit cin.getline() den terminator weglassen. Allerdings klappt das auch nicht so wie ich es mir vorstelle. Ich müßte also eine Möglichkeit finden, mit der man den Inhalt von cin.get - am besten komplett - löschen kann...



  • Puhhh...vielleicht etwas mehr Code? Ich verstehe nur die Hälfte...

    Im Hauptprogramm habe ich die drei Funktionen in eine do...while-schleife geschlossen.

    Seh ich auch nicht....entweder ist deine Aussage falsch oder der Code. Tjo, oder ich bin zu müde, soll ja mal vorkommen 🤡



  • Hallo!
    Also der Code der drei Funktionen ist sehr lang, und auch eigentlich nicht besonders interessant, was das Problem angeht. Das entscheidende ist eigentlich nur, dass in der Funktion "Auswertung" der Befehl cin.get() auftaucht, und dies bei einem zweiten Programmdurchlauf nicht funktioniert, da der Terminator scheinbar noch hinterlegt ist.

    Reset: Erstellt ein Array, mit 25 Feldern und setzt alle auf den Wert "0"
    Auswertung: Der Benutzer wird dazu aufgefordert, einen Text einzugeben, der daraufhin nach bestimmten Kombinationen von aufeinanderfolgenden Buchstaben ausgewertet wird. Die Werte werden im erstellten Array hinterlegt
    Ergebnis: Alle gesuchten Kombinationen werden ausgegeben (aus dem Array).



  • Bin gerade mal auf die Idee gekommen, alle Funktionen doppelt durchlaufen zu lassen:
    int main()

    {
      int matrix[5][5];
        matrixreset(matrix);
    	auswertung(matrix);
    	ergebnis(matrix);
    	matrixreset(matrix);
    	auswertung(matrix);
    	ergebnis(matrix);
      return(0);
    }
    

    Und ich habe festgestellt, dass es beide Male funktioniert hat... Liegt der Fehler jetzt doch woanders?? Wenn das stimmt, was ich die ganze Zeit vermutet habe, dann hätte es bei der zweiten "Auswertung" ja nicht klappen dürfen!?!?!?!? 😮



  • Habe es jetzt endlich hinbekommen:

    int main()								
    {
      char e;
      int matrix[8][8];
      e=0;
      do 
      {
    	if (int anz=bcin.rdbuf()->in_avail())							
    		bcin.ignore(anz);											
    	matrixreset(matrix);
    	auswertung(matrix);
    	ergebnis(matrix);
    	bcout << "Geben Sie a ein um erneut zu starten" << endl;
    	bcin >> e;
      }
       while (e == 'a');
    
      return(0);
    }
    

    Danke nochmal an alle!
    Vertigo


Anmelden zum Antworten