Entwickler-Ecke
Alle Sprachen - Alle Plattformen - Java Sudoku von Konsole einlesen
LINUS19 - Do 04.01.18 00:17
Titel: Java Sudoku von Konsole einlesen
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 - 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.
Symbroson - 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:
LINUS19 - Do 04.01.18 02:46
Hast du das auch mit dem Scanner gemacht?
Symbroson - Do 04.01.18 08:00
Ja: String input = sc.nextLine()
LINUS19 - 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 - 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 ;)
LINUS19 - 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 - 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
LINUS19 - 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 - 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
LINUS19 - 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 - 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 ;)
LINUS19 - 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 - Fr 05.01.18 07:15
Kannst du dazu bitte nochmal den Quelltext acgicken?
LINUS19 - 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 - 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'
LINUS19 - 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 - 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 ;)
LINUS19 - Fr 05.01.18 16:45
Wie hast du das eigentlich gemacht?
Könntest du vielleicht dein Quelltext Posten?
Symbroson - Fr 05.01.18 16:57
Funktioniert deibs denn jetzt wie du es dur vorgestellt hast?
ja kann ich machen, wenn ich wieder zu Hause bin (in ner halben Stunde vllt)
LINUS19 - Fr 05.01.18 18:40
Ja es funktioniert, muss halt nur noch verbessert werden. Fehleingaben müssten noch angefangen werden.
Symbroson - Fr 05.01.18 18:55
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| import java.util.Scanner;
public class readSudoku { public static void main(String args[]) { System.out.println("type 9 numbers for each Sudoku row! ex: \"123456789\""); final int maxlen = 9; int Matrix[][] = new int[maxlen][maxlen]; Scanner sc = new Scanner(System.in); for(int y = 0; y < maxlen; y++) { boolean error; do { String input = sc.nextLine(); if(error = input.length() != maxlen) { System.out.print("invalid number length! required: "); System.out.println(maxlen); System.out.print(" got: "); System.out.println(input.length()); } else { for(int x = 0; x < maxlen; x++) { if(error = input.charAt(x) < '0' || input.charAt(x) > '9') { System.out.print("invalid character at pos "); System.out.println(x+1); break; } else Matrix[y][x] = input.charAt(x) - '0'; } } } while(error); } } } |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!