Zweidimensionale arrays
-
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 istx
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 deinsudoku
Array diese Zeilen ja gar nicht enthält. Vor deiner zweitenfor (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 Eingabetexteingabe[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.
-
Habs jetzt so
#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; } for (int s = 0; s < 9; s++) { for (int p = 0; p < 9; p++) { cout << ";" << sudoku[s][p]; if (p == 2 || p == 5) { cout << "//"; } else if (s == 2 || s == 5) { cout << endl; cout << "="; } } cout << endl; } system("PAUSE"); return 0; }
Aber funktioniert ja nicht weil man da ja irgendwie eine komplette Zeile zwischen machen muss
-
InvictusBlue schrieb:
Aber funktioniert ja nicht weil man da ja irgendwie eine komplette Zeile zwischen machen muss
Dann tu das doch! Es verbietet dir doch niemand, mehr als nur ein Zeichen oder mehr als eine Zeile in einem Durchlauf auszugeben.
-
Das stimmt natürlich ..
Hab's fertig. Danke für eure Unterstützung und ganz besonders an sebi!Fertiges Programm:
#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; } cout << endl; cout << "Das Sudoku lautet:"; cout << endl; for (int s = 0; s < 9; s++) { for (int p = 0; p < 9; p++) { cout << ";" << sudoku[s][p]; if (p == 2 || p == 5) { cout << ";//"; } else if (s == 2 && p == 8 || s == 5 && p == 8) { cout << endl; cout << "=======//=======//======="; } } cout << endl; } system("PAUSE"); return 0; }