Zweidimensionale arrays



  • Guten Tag,

    ich bin gerade dabei eine Aufgabe für die Uni zu lösen welche wie folgt lautet:

    https://gyazo.com/0263f0b09f35592fe81dd2dc11b2d821

    Leider habe ich keinen Plan wie man in dem Forum hier die Bilder sofort einfügen kann da anscheinend [img] nicht funktioniert. 😕

    Mein Problem ist jetzt das ich versuche mir meinen array an der stelle [0][0] ausgeben will, um zu testen ob es funktioniert. Allerdings kommt immer was falsches raus.
    Ich denke ich zähle irgendwo etwas entweder zu oft oder nicht oft genug hoch. Sieht einer von euch den Fehler? Bin totaler Anfänger und sehe meine fehler noch nicht wirklich.

    Hier mein code:

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    
    {
            int sudoku[9][9] = { 0 };
            string eingabe[11];
    
            cout << "Bitte geben Sie das Sudoku ein:" << endl;
    
            for (int i = 0; i < 11; i++)
            {
                    getline(cin, eingabe[i]);
            }
    
            int pos1 = 0;
            int pos2 = 0;
    
            for (int k = 0; k < 11; k++)
            {
                    for (int j = 0; j <= 21; j++)
                    {
                            if (eingabe[k].at(j) != '.' || eingabe[k].at(j) != '|' || eingabe[k].at(j) != '=')
                            {
                                    int sudoku_zahl = eingabe[k].at(j);
                                    sudoku[pos1][pos2] = sudoku_zahl;
                                    pos2 + 1;
                            }
                    }
                    pos1 + 1;
            }
    
            cout << sudoku[0][0] << endl;
    
            system("PAUSE");
            return 0;
    }
    

  • Mod

    InvictusBlue schrieb:

    Leider habe ich keinen Plan wie man in dem Forum hier die Bilder sofort einfügen kann da anscheinend [img] nicht funktioniert. 😕

    https://www.c-plusplus.net/forum/86364

    Künftig bitte [code="cpp"]…[/code] -tags verwenden und Code ordentlich formatieren.



  • "Was falsches" - aha.

    Das

    int sudoku_zahl = eingabe[k].at(j);
    

    macht vermutlich nicht das, was du denkst. Probier mal

    int sudoku_zahl = eingabe[k].at(j) - '0';
    


  • Warum bist du der Meinung, dass Zeilen 22 Zeichen lang sind? Ich hätte hier eher 11 erwartet wie bei den Zeilen. Sonst einige Fehler die mir aufgefallen sind:
    -Du musst pos2 am Anfang der äußeren Schleife zurücksetzen weil der Wert sonst immer größer wird
    -In deinem if wolltest du wohl eine Verknüfung mit UND statt mit ODER
    -Die beiden Zeilen die nur aus einem Trennstrich (vermutlich soll dafür das = stehen) bestehen darf pos1 nicht hochgezählt werden
    -Die Konvertierung von char zu int fehlt, daher kriegst du vermutlich merkwürdig große Zahlen

    Das ist was mir auf die schnelle einfällt. Könnten noch mehr Fehler sein.



  • Danke erstmal für die Posts. Um etwas klarer zu werden hier mal die Eingabe tests.

    https://gyazo.com/91edb14d391d28ac9e196215b5be6cd1

    Deshalb 22 Zeichen

    Und ich meine es ist wohl ODER weil wenn eingabe[k].at(j) ein "." oder ein "/" ist soll er es nicht in den array werfen.



  • InvictusBlue schrieb:

    Und ich meine es ist wohl ODER weil wenn eingabe[k].at(j) ein "." oder ein "/" ist soll er es nicht in den array werfen.

    Denk nochmal drüber nach. Wenn ich

    if(eingabe[k].at(j) != '.' || eingabe[k].at(j) != '|')
    

    habe und eingabe ist gerade '|' , dann ist die Bedingung eingabe[k].at(j) != '.' wahr und damit wird der Code in dem if Ausgeführt. Nochmal sprachlich: Du willst den Code im if ausführen wenn das Zeichen kein '.' ist UND es auch kein '|' ist.



  • Oh stimmt .. Ja habe noch so total dumme logik Fehler ..

    So siehts jetzt aus:

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    
    {
            int sudoku[9][9] = { 0 };
            string eingabe[11];
    
            cout << "Bitte geben Sie das Sudoku ein:" << endl;
    
            for (int i = 0; i < 11; i++)
            {
                    getline(cin, eingabe[i]);
            }
    
            int pos1 = 0;
            int pos2 = 0;
    
            for (int k = 0; k < 11; k++)
            {
                    for (int j = 0; j <= 21; j++)
                    {
                            if (eingabe[k].at(j) != '.' && eingabe[k].at(j) != '|' && eingabe[k].at(j) != '=')
                            {
                                    int sudoku_zahl = eingabe[k].at(j) - '0';
                                    sudoku[pos1][pos2] = sudoku_zahl;
                                    pos2 + 1;
                            }
    
                    }
                    pos1 + 1;
                    pos2 = 0;
            }
    
            cout << sudoku[0][0] << endl;
    
            system("PAUSE");
            return 0;
    }
    


  • Ja und funktioniert es jetzt oder wenn nicht was wird ausgebeben? Meine dritte Anmerkung von eben hast du noch nicht umgesetzt aber jetzt sollte zumindest der Wert bei sudoku[0][0] schonmal stimmen.



  • Es kommt 1 raus, sollte aber normalerweise bei 0,0 5 sein soweit ich die zweidimensionalen arrays verstanden habe.

    Ich verstehe echt nicht warum da nicht 5 raus kommt. Wenn ich schritt für schritt durch gehe finde ich den Fehler nicht, die if schleife müsste eigentlich die punkte rausfiltern so das im array [0][0] eigentlich 5 kommen müsste 😕 😕



  • Ließt du dir überhaupt die Compiler Warnungen durch? Ich wollte deinen Code gerade mal testen und erhalte da diese Warnungen:

    main.cpp(30): warning C4552: '+': operator has no effect; expected operator with side-effect
    main.cpp(34): warning C4552: '+': operator has no effect; expected operator with side-effect
    

    Als Mensch überließt man sowas schnell. Du wolltest hier wohl ein += schreiben weil einfach pos1 + 1; hat keinen Effekt, wie der Compiler schon gemerkt hat.



  • Ist mir gar nicht bewusst gewesen das sowas da auch steht, dachte er bricht ab wenns nicht geht.

    Allerdings sagt er mir jetzt wenn ich das Programm schließe das mein sudoku stack corrupted ist..



  • InvictusBlue schrieb:

    Ist mir gar nicht bewusst gewesen das sowas da auch steht, dachte er bricht ab wenns nicht geht.

    Es ist ja nicht falsch, hat nur keinen Effekt.

    InvictusBlue schrieb:

    Allerdings sagt er mir jetzt wenn ich das Programm schließe das mein sudoku stack corrupted ist..

    Dann schreibst du vermutlich über die Grenzen deines zweidimensionalen Arrays hinweg. Wohl weil du bei den Zeilen mit horizontaler Linie pos1 auch mit hochzählst. Am Ende schreibst du also auch 11 Zeilen in dein sudoku Array.



  • Ein Freund von mir hat es viel einfacher gemacht...

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
            int sudoku[9][9] = { 0 };
            string eingabe[11];
    
            cout << "Bitte geben Sie ein Sudoku ein:" << endl;
    
            for (int i = 0; i < 11; i++)
            {
                    getline(cin, eingabe[i]);
            }
    
            cout << endl << "Das Sudoku lautet:" << endl;
    
            for (int i = 0; i < 11; i++)
            {
                    string reihe = eingabe[i];
                    int x = 0;
                    int y = 0;
    
                    for (int s = 0; s < reihe.length(); s++)
                    {                              
                            if (reihe.at(s) == '.')
                            {
                                    cout << ";";
                            }
                            else if (reihe.at(s) == '|')
                            {
                                    cout << "//";
                            }
                            else if (reihe.at(s) == '-')
                            {
                                    cout << "=";
                            }
                            else
                            {
                                    sudoku[x][y] = reihe.at(s) - '0';
                                    cout << sudoku[x][y];
                                    x++;
                                    if (x > 9)
                                    {
                                            x = 0;
                                            y++;
                                            cout << endl;
                                    }
                            }                              
                    }
                    cout << endl;
            }
    
            system("PAUSE");
            return 0;
    }
    

    Leider komme ich auf solche Sachen nicht

    Ich versuche das trotzdem mit meinem Programm noch hinzubekommen.
    Also muss ich noch irgendwo ein if einfügen wenn es nur ==== sind das pos nicht gezählt wird?



  • So viel anders wie dein Code ist das jetzt auch nicht wenn man die Ausgabe dort mal weglässt. Dazu ist dort ebenfalls ein Fehler drin wenn ich mich nicht täusche. Bei der Bedingung if (x > 9) . Wenn die Bedingung wahr ist, dann ist x mindestens 10, also vor dem hochzählen die Zeile davor mindestens 9. Aber 9 ist schon außerhalb des Arrays also genauso Stack zerschossen.



  • Bei mir im programm muss doch dann einfach wenn da "----" die Zeichen kommen die erste pos von meinem array hochgezählt werden aber keine sachen drin gespeichert werden oder nicht?



  • Nein pos1 darf genau nicht hochgezählt werden weil dein sudoku Array diese Zeilen ja gar nicht enthält. Vor deiner zweiten for (int j = 0; j <= 21; j++) Schleife kannst du ja einfach testen ob das erste Zeichen ein '-' ist und wenn ja, dann wird die ganze Zeile übersprungen.



  • Kann man das nicht so machen?

    if(eingabe[k].at(0) == '-')
    {
    break;
    }

    Ok habs hinbekommen. Danke aufjedenfall mal für die Hilfe. Ich denke die Ausgabe kriege ich hin 😃

    Gibts nicht eventuell eine Möglichkeit das ich mich mit dir irgendwie andersweitig in Verbindung setzen kann? Werde eventuell in nächster Zeit öfters mal ein paar Schubser in die richtige Richtung brauchen.



  • Statt break einfach continue benutzen, wenn das nicht eh schon deine Lösung war. Fragen kannst du ja weiter hier im Forum stellen.



  • Ok habs doch noch nicht ganz. Meine erste Zeile wird komplett ausgegeben, aber in der zweiten Zeile sind die Zahlen schon falsch. Liegt aber an der Ausgabe und nicht am array. Hab ich mich irgendwo vertan mit dem s oder p +=1?

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    
    {
            int sudoku[9][9] = { 0 };
            string eingabe[11];
    
            cout << "Bitte geben Sie das Sudoku ein:" << endl;
    
            for (int i = 0; i < 11; i++)
            {
                    getline(cin, eingabe[i]);
            }
    
            int pos1 = 0;
    
            for (int k = 0; k < 11; k++)
            {
                    int pos2 = 0;
    
                    if (eingabe[k].at(0) == '-')
                    {
                            continue;
                    }
    
                    for (int j = 0; j <= 21; j++)
                    {
                            if (eingabe[k].at(j) != '.' && eingabe[k].at(j) != '|')
                            {
                                    int sudoku_zahl = eingabe[k].at(j) - '0';
                                    sudoku[pos1][pos2] = sudoku_zahl;
                                    pos2 += 1;
                            }
    
                    }
                    pos1 += 1;
            }
    
            int s = 0;
            int p = 0;
    
            for (int m = 0; m < 11; m++)
            {
                    string reihe = eingabe[m];
    
                    for (int n = 0; n < reihe.length(); n++)
                    {
                            if (reihe.at(n) == '.')
                            {
                                    cout << ";";
                            }
                            else if (reihe.at(n) == '|')
                            {
                                    cout << "//";
                            }
                            else if (reihe.at(n) == '-')
                            {
                                    cout << "=";
                            }
                            else
                            {
                                    cout << sudoku[s][p];
                                    p += 1;
                            }
                    }
                    int p = 0;
                    s += 1;
                    cout << endl;
            }
    
            system("PAUSE");
            return 0;
    }
    


  • Deine Ausgabe hält sich aber nicht an die Aufgabenstellung:

    Die Erzeugung der Ausgabe darf nur unter Verwendung der Werte in sudoku[9][9] geschehen, auf den Eingabetext eingabe[11] darf dann nicht mehr zurückgegriffen werden.

    Wenn du nur das sudoku[9][9] Array nutzt ist es meiner Meinung nach sowieso einfacher, da du dann nicht mehr 4 Zähler sondern nur noch 2 brauchst.


Anmelden zum Antworten