Autor |
Beitrag |
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: Do 04.01.18 00:17
Hallo,
ich wollte ein Sudoku von der Konsole einlesen und dann lösen.
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| int Matrix[][]=new int[8][8]; Scanner sc = new Scanner(System.in); int eingabe =sc.nextInt(); for(int m=0; m<Matrix.length; m++) { for(int n=0; n<Matrix.length; n++) { Matrix[m][n]=eingabe; // Wert wird gespeichert } } |
Das Problem ist, das nachdem 81 Zahlen eingelesen wurden man immer noch Zahlen eingeben kann. Nach 81 Zahlen sollte ja eigentlich aufgehört werden.
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Do 04.01.18 01:09
mit deinem Aktuellen Code würdest du nur eine einzige Eingabe zulassen - du kannst die Ziffern bei der eingabe nicht alle hintereinander schreiben, du musst sie dann entweder als Zeichenkette einlesen und zerteilen, oder jede Ziffer einzeln eingeben lassen.
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Do 04.01.18 01:46
Ich habe mal auf die schnelle nen kleinen Reader geschrieben.
Er prüft die Anzahl der angegebenen Ziffern und die einzelnen Zeichen.
Es wird also ein String von Ziffern zwischen einschließlich 0 und 9 der Länge 9 erwartet, die dann nach der Verifizierung in die Matrix eingetragen werden.
nur damit du einen Anhaltspunkt hast
Das könnte dann in etwa so aussehen:
Einloggen, um Attachments anzusehen!
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Für diesen Beitrag haben gedankt: LINUS19
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: Do 04.01.18 02:46
Hast du das auch mit dem Scanner gemacht?
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Do 04.01.18 08:00
Ja: String input = sc.nextLine()
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Für diesen Beitrag haben gedankt: LINUS19
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: Do 04.01.18 21:20
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| int Matrix[][]=new int[8][8]; Scanner sc = new Scanner(System.in); System.out.println("Gib die Zahlen durch ein Komma getrennt ein"); for(int i=0; i<9; i++) { String eingabe = sc.nextLine(); if(eingabe.length()==17 ) { System.out.println(); } String[] Test=eingabe.split(Pattern.quote(",")); System.out.println(Arrays.toString(Test)); } |
Wie kann ich die Eingabe dann in dem Array speichern?
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Do 04.01.18 21:28
Du hast noch immer einen kleinen Denkfehler.
Quelltext 1: 2: 3: 4: 5: 6:
| for(int i=0; i<9; i++) { String eingabe = sc.nextLine(); if(eingabe.length()==17 ) { System.out.println(); } | diese Schleife überschreibt ständig die Variable Eingabe mit dem eingegebenen String - sodass du dort, wo du gerade versuchst die eingegebenen Werte zu speichern, nur die letzte eingegebene Zeichenfolge kennst.
zum Speichern müsstest du durch die Liste von Zahlen durchiterieren, die von einem String in einen Integer umwandeln und dann in die Matrix schreiben, abh. von Reihe und Spalte.
eine StringToInt Funktion wirst du sicherlich schnell durch eine Suche finden
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: Do 04.01.18 21:55
Den String kann ich mit Integer.parseInt("eingabe"); umwandeln, aber ich verstehe immer noch nicht ganz was du meinst.
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Do 04.01.18 22:05
du gehst in einer zweiten Schleife jedes Element des String-Feldes durch, und schreibst den in einen Integer umgewandelten Wert an den gleichen Spaltenindex in der Sudoku-Matrix wo auch dein Ziffern-String in dem String-Feld war.
Den Zeilenindex kennst du, wenn du den angesprochenen Denkfehler behebst
Beachte außerdem, dass du eine Matrix mit den Dimensionen 8×8 erstellt hast, Sudoku hat aber 9×9 Felder
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Für diesen Beitrag haben gedankt: LINUS19
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: Do 04.01.18 22:21
Symbroson hat folgendes geschrieben : |
Beachte außerdem, dass du eine Matrix mit den Dimensionen 8×8 erstellt hast, Sudoku hat aber 9×9 Felder |
Arrays beginnen doch bei 0 oder?
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Do 04.01.18 22:23
Ja, sicher, aber in den eckigen Klammern beim Erstellen eines Feldes gibst du in der Regel die Länge an. Ein Array der Länge 8 hat also die Indizes 0 bis 7
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: Do 04.01.18 23:52
Meintest du so was :
Quelltext 1: 2: 3: 4: 5: 6: 7:
| String Eingabe = sc.nextLine(); for(int i=0; i< 9; i++) { for(int j=0; j< Eingabe.length(); j++ { // Und hier Umwandlung String zu Int und in Array speichern } } |
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Fr 05.01.18 00:00
Naja fast - 'eingabe' soll ja bei dir eine durch Komma getrennte Liste von Ziffern sein - also müsstest du wenn schon die Länge des zerteilten Strings angeben.
Und es mag zwar in diesem Falle irrelevant sein, aber normalerweise ermittelt man erst die Anzahl wie oft die Schleufe wiederholt werden soll, anstatt das immer wieder neu zu ermitteln - weil .length() ja ein Funktionsaufruf ist. Du musst das hier nicht zwingend tun, da das ja hier nur 9 durchgänge sind, aber behalte es in Zukunft im Hinterkopf
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Für diesen Beitrag haben gedankt: LINUS19
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: Fr 05.01.18 00:54
Wenn ich in die beiden Forschleiden Matrix[i][j]= charAt(j) eingebe und i und j kleiner sind 3 und ich das eingegebe:
12
12
Und die Matrix dann ausgebe kommt als Ergebnis:
4950
4950
Woran liegt das?
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Fr 05.01.18 07:15
Kannst du dazu bitte nochmal den Quelltext acgicken?
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: Fr 05.01.18 11:20
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| int Matrix[][]=new int[2][2]; Scanner sc = new Scanner(System.in); System.out.println("Gib die Zahlen so ein:12"); for(int m=0; m<2; m++) { String eingabe = sc.nextLine(); for(int n=0; n<2; n++) { Matrix[m][n]=eingabe.charAt(n); } } for(int m=0; m<2; m++) { System.out.println(); for(int n=0; n<2; n++) { System.out.print(Matrix[m][n]); // die Ausgabe ist : 4950 4950 } } |
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Fr 05.01.18 13:47
Also das Prinzip stimmt jetzt zumindest, nur verwirrt mich, dass du jetzt ein 2×2 Feld hast ^^
Und du solltest beachten, das charAt den Zeichencode des Zeichens zurückgibt, also solltest du vllt, je nachdem wie du es handhaben willst, den code in die Zahl umwandeln (einfach charAt(..) -'0'
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: Fr 05.01.18 14:00
Das mit dem 2*2 Feld war nur zum Test.
Mit dem charAt(n)-'0' funktioniert es,aber ich verstehe nicht warum -'0' das so umwandelt.
|
|
Symbroson
Beiträge: 382
Erhaltene Danke: 67
Raspbian, Ubuntu, Win10
C, C++, Python, JavaScript, Lazarus, Delphi7, Casio Basic
|
Verfasst: Fr 05.01.18 14:50
Der Datentyp char(acter) wird normalerweise als Zeichen interpretiert, speichert aber nur den Zeichencode, weshalb er auch als integer verwendet werden kann.
Somit wird '0' - '0' zu 0, und '8' - '0' zu 8
'0' entspricht dem Zeichencode 48 - '0' ist aber lesbarer
_________________ most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Für diesen Beitrag haben gedankt: LINUS19
|
|
LINUS19
Beiträge: 156
Erhaltene Danke: 1
Windows 10, 7
Java(Eclipse)
|
Verfasst: Fr 05.01.18 16:45
Wie hast du das eigentlich gemacht?
Könntest du vielleicht dein Quelltext Posten?
|
|