Zweidimensionale arrays



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



  • Und wie würdest du dass machen? Kein Plan wie man das ohne dieses Eingabe array machen soll 😕



  • Etwa so:

    for (int y = 0; y < 9; y++)
    { 
        for (int x = 0; x < 9; x++)
        {
            cout << ';' << sudoku[y][x];
        }
        cout << endl;
    }
    

    Das Einfügen der Trennstriche an den geeeigneten Stellen überlasse ich dir.



  • Wie soll dass denn gehen? Muss ja dann irgendwie so sein dass ich zwischen den Zahlen nach z.B. 3 Zahlen einen // trennstrich habe. Wie muss man so einen algorithmus aufbauen? Ich glaube ich mache die Aufgabe komplizierter oder anders als wir sie hätten lösen können weil sowas haben wir noch nicht wirklich gehabt 🙂



  • Einfach mit einer if-Bedingung. Wenn x oder y einen entsprechenden Wert erreicht wird ein Trennstrich/zeile eingefügt. Es ist ja durchaus erlaubt, dass einige Durchläufe der Schleifen mehr Zeichen/Zeilen ausgeben als die anderen.



  • Ok die "//" striche waren ja noch einfach aber wie mache ich es, dass zb wenn mein array bei [2][0] ist, dass dann eine komplette reihe "=" kommt? Dann mache ich mir ja den array kaputt weil ich alles verschiebe



  • Wieso verschiebt sich da was? Musst natürlich auch eine neue Zeile anfangen bevor dann wieder Werte aus dem Array kommen.


Anmelden zum Antworten