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:
readSudoku


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

user profile iconSymbroson hat folgendes geschrieben Zum zitierten Posting springen:

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);
    }
  }
}