Schreiben Sie eine Schleife, in der Indexwerte eingelesen und die entsprechenden Feldelemente ausgegeben werden



  • Hallo Coder!

    Die [Erweiterung der] Aufgabe lautet:

    Schreiben Sie eine Schleife, in der Indexwerte eingelesen und die
    entsprechenden Feldelemente ausgegeben werden. Fragen Sie am Ende der Schleife
    ab: " Weiter [j/n]?" und wiederholen Sie bei Eingabe von 'j'. Falls ein Index
    außerhalb des erlaubten Bereichs eingegeben wird, soll eine Fehlermeldung ausgegeben
    werden.

    Sehe langsam nur noch Sternchen, und schaffe es nicht diesen teil korrekt umzusetzen, und die Felder abzufragen.
    Brauche keine endgültige Lösung, mehr einen Hinweis, wie ich den Code (besonders der do-while Teil) vereinfachen kann, sodass die Umsetzung nicht so hakt..Vielen Dank!

    Hier mein Code bisher:

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main(){
    
    const int N = 5;
    int arr[N];
    char x;
    int eingabe;
    
    for (int i = 0; i < N; i++){
        cout << "<";
        cin >> arr[i];
        }
    for (int i = 0; i < N; i++){
         cout << arr[i];
        }
    cout << endl;
    
    do{
            cout << ">>" << endl;
            cin >> eingabe;
            cout << arr[eingabe] << endl;
            
            do {
                    cout << "weitermachen? j/n" << endl;
                    cin >> x;
                    }  
            while(eingabe>N);
                    cout << "Fehler!" << endl;
     }
            while (x != 'j');
                    cout << "ENDE" << endl;
               
    
    system ("pause");
    return 0;
    }
    


  • while(true)
    Index?
    Wenn index ausserhalb => Meldung, continue
    Ausgabe
    Weiter?
    Wenn nichtt j => break



  • @euphor Die Reihenfolge etwas sortieren, das "weitermachen ist etwas deplaziert"

    Die do-while-Schleife wird solange ausgeführt, solange die Bedingung wahr ist.



  • Egal wie ich es auch drehe..

    Momentan sieht eder code so aus und trotzdem bekomm ich das Programm nicht richtig beendet, bzw frei von Endlosloops:

    do{
        cout << ">>" << endl;
        cin >> eingabe;
        
                cout << arr[eingabe] << endl;
                cout <<"weitermachen? j/n" << endl;
                cin >> x;
    }while(eingabe<N);
            
                 if(x!= 'j'){   
                    cout << "Ende" << endl;
                                }
                if(eingabe>N){
                    cout << "Fehler!" << endl;
            }
    


  • Deine Schleife geht von Zeile 1 bis 8. In Zeile 7 fragst du die Antwort nach x ab, vergleichst in Zeile 8 aber eingabe mit N. Scheint nicht korrekt, da die Schleifenbedingung überhaupt nicht von der Antwort x abhängt.

    Außerdem: deine Einrückung ist mangelhaft. Benutze clang-format oder irgendein anderes automatisches Formatierungstool. Wenn korrekt eingerückt ist, siehst du gleich viel besser, welche Schleifen/Befehle zusammengehören.



  • do {
        do {
           Eingabe Index
       while (index ok)
    
      Ausgabe
    
      Frage weitermachen
      Antwort einlesen
    while ( weitermachen == 'j')
    


  • @wob
    Gebe mir Mühe mit der Formatierung. Nur leider hier am BiBrechner kein VS und progge online auf cpp.sh. Muss da alles manuell schieben.



  • @euphor Allgemeiner Tipp wäre: möglichst nicht zu tief verschachten. Wenn es tiefer wird, ist ziemlich sicher die Zeit für eine Funktion gekommen.



  • @wob
    Absolut. Dies hat aber bisher ebenfalls noch nicht funktioniert. Deshalb dachte ich mir das Ganze eben auf diesem Wege zu veranschaulichen.
    Versuche gerade DirkB's vorschlag umzusetzen.



  • @DirkB
    So in etwa? Werds fuer heute liegen lassen. Mir dreht sich schon alles..Danke bis hierhin!

    do{
        do {
            cout << ">>" << endl;
            cin >> eingabe; 
            } 
            while (eingabe <=N);
                    cout << arr[eingabe] << endl;
                    cout << "weitermachen? j/n" << endl;
                    cin >> x;
            if (eingabe >N){
                    cout << "Fehler!" << endl;
                            }
     }
        while(x = 'j');
    


  • @euphor sagte in Schreiben Sie eine Schleife, in der Indexwerte eingelesen und die entsprechenden Feldelemente ausgegeben werden:

    while(x = 'j');

    Du musst Warnungen anschalten...
    PS: Ich finde die Variante von @manni66 leichter zu verstehen.



  • @wob
    Waren an. Komm nur nichtmehr richtig hinterher. Aber klar, hier an der Stelle natürlich while(x!= 'j')



  • @euphor sagte in Schreiben Sie eine Schleife, in der Indexwerte eingelesen und die entsprechenden Feldelemente ausgegeben werden:

    Aber klar, hier an der Stelle natürlich while(x!= 'j')

    Ähm, ich hätte jetzt eher == gedacht...



  • @wob
    Upsi..



  • Nein, denk noch mal nach!

    Und deine erste Schleife macht so auch keinen Sinn (solange die Eingabe kleiner oder gleich N ist wird die Schleife bei dir wiederholt).
    Und die Fehlermeldung sollte dann wohl auch in diese Schleife und nicht dahinter!



  • Last but not least.

    do{
        do {
            cout << ">>" << endl;
            cin >> eingabe;
            if (eingabe >N){
                cout << "Fehler!" << endl;
            } 
        }
            while (eingabe >=N);
                    cout << arr[eingabe] << endl;
                    cout << "weitermachen? j/n" << endl;
                    cin >> x;
            
    }while(x == 'j');
    

    Freu mich gerade sehr. Danke für die tolle Unterstützung. Hoffe ich kann in Zukunft weiter unangenehme Fragen stellen 🙂



  • Fast 😉
    Die Bedingung in Zeile 5 sollte die gleiche sein, wie in Zeile 9.



  • Das eingabe ein [signed] int ist, können auch negative Werte eingegeben werden, die du auch zurückweisen solltest.
    Gültige Eingaben sind also alle Werte zwischen 0 und N-1.



  • Bonusaufgabe: fang ab, wenn ein Buchstabe satt einer Zahl eingegeben wird.



  • Die Erweiterung zum Ausschluss von negativen Zahlen:

    do{
        do {
            cout << ">>" << endl;
            cin >> eingabe;
            if (eingabe >N || eingabe < 0){
                cout << "Fehler!" << endl;
                } 
            }
            while (eingabe >N || eingabe < 0);
                    cout << arr[eingabe] << endl;
                    cout << "weitermachen? j/n" << endl;
                    cin >> x;
            
    }while(x == 'j');
                    cout << "ENDE" << endl;
    

    Wie ich definitieren soll, dass ausschließlich Integer eingegeben werden dürfen erschließt sich mir noch nicht so richtig..



  • Wenn etwas eingegeben wird aus dem kein Integer extrahiert werden kann geht der stream in einen Fehlerzustand und gibt konvertiert zu bool false:

    #include <limits>   // std::numeric_limits<>
    #include <cstddef>  // std::size_t
    #include <cctype>   // std::tolower()
    #include <numeric>  // std::iota()
    #include <array>
    #include <iostream>
    
    std::istream& eat_whitespace_except_newline(std::istream &is)
    {
    	for (int ch; std::isspace(ch = is.peek()) && ch != '\n'; is.get());
    	return is;
    }
    
    std::istream& ignore_line(std::istream &is)
    {
    	return is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    
    std::istream& clear_and_ignore_line(std::istream &is)
    {
    	is.clear();
    	return ignore_line(is);
    }
    
    int main()
    {
    	std::array<int, 8> foo;
    	std::iota(foo.begin(), foo.end(), 42);
    
    	for (char again{ 'y' }; again == 'y'; std::cout.put('\n')) {
    		std::size_t index;
    		while (std::cout << "Index: ",
    		       !(std::cin >> index >> eat_whitespace_except_newline) || index >= foo.size() || std::cin.peek() != '\n')
    		{
    			std::cout << "Input error :(\n\n";
    			clear_and_ignore_line(std::cin);
    		}
    	
    		std::cout << "foo[" << index << "]: " << foo[index] << '\n';
    
    		while (std::cout << "\nAgain? (y/n)\n",
    		       !(std::cin >> again >> eat_whitespace_except_newline) || (again = std::tolower(again)) != 'y' && again != 'n' || std::cin.peek() != '\n')
    		{
    			std::cout << "Input error :(\n\n";
    			clear_and_ignore_line(std::cin);
    		}
    	}
    }
    

Anmelden zum Antworten