2017-11-21 2 views
0

So sollte es funktionieren, setze ich für das erste Array ein wie: 2 3 1 2 3 4 5 6 dann 2 und 3 sind Zeile und colum und der Rest sind die Werte. Problem ist die erste Array-Arbeit, aber wenn ich EOF (ctrl + z) erreiche, gibt es eine Ausnahme außerhalb der Grenzen. Welcher Mittelwert kann ich nicht für den 2. Array wie den ersten eingeben. Ich weiß, dass es einen anderen Weg gibt, wo ich Arraygröße zuerst dann Wert erklären kann. Aber wie könnte ich das beheben, ich möchte immer noch StdIn.readAllInts() usr?Wie create 2 Array mit Benutzereingabe mit Std.readAllInts()

public class MatrixMult { 
public static void main(String[] args){ 

    System.out.println("First Matrix Config"); 
    int[] einGabeMatrix1= StdIn.readAllInts(); 
    int zeileM1 = einGabeMatrix1[0]; 
    int spalteM1 = einGabeMatrix1[1]; 
    int[][] ersteMatrix= new int [zeileM1][spalteM1]; 
    int k=2; 
    int sum; 
    for(int i=0;i<zeileM1-1;i++){ 
     for(int j=0;j<spalteM1-1;j++){ 
      ersteMatrix[i][j]=einGabeMatrix1[k]; 
      k++; 
     } 
    } 


    System.out.println("Second Matrix Config"); 
    int[] einGabeMatrix2 = StdIn.readAllInts(); 
    int zeileM2 = einGabeMatrix2[0]; 
    int spalteM2 = einGabeMatrix2[1]; 
    int h=2; 
    int[][] zweiteMatrix= new int [zeileM2][spalteM2]; 
    for(int m=0;m<zeileM2-1;m++){ 
     for(int n=0;n<spalteM2-1;n++){ 
      zweiteMatrix[m][n]=einGabeMatrix2[h]; 
      h++; 
     } 
    } 

    int[][] ergebnisMatrix= new int [zeileM1][spalteM2]; 
    for (int t = 0; t < zeileM1; t++) { 
     for (int c = 0; c < spalteM2; c++) { 
      sum = 0; 
      for (int d = 0; d < spalteM1; d++) { 
       sum = sum + ersteMatrix[t][d] * zweiteMatrix[d][c]; 
      } 
      ergebnisMatrix[t][c] = sum; 
     } 
    } 

    for(int i=0;i<zeileM1;i++){ 
      for(int j=0;j<spalteM1;j++){ 
       System.out.println(ergebnisMatrix[i][j]); 
      } 
     } 

} 

} // Das ist StdIn.readAllInts(), Standard-Methode von Java.

public static int[] readAllInts() { 
    String[] fields = readAllStrings(); 
    int[] vals = new int[fields.length]; 
    for (int i = 0; i < fields.length; i++) 
     vals[i] = Integer.parseInt(fields[i]); 
    return vals; 
} 

Antwort

0

Es sieht aus wie das Problem aus der Tatsache kommt, dass StdIn.readAllInts() bis zum EOF liest. Wenn der Code zum zweiten Anruf gelangt, werden keine Werte mehr gelesen.

Ich würde stattdessen vorschlagen, mit dem StdIn.readInt() Aufruf, um jede ganze Zahl einzeln zu lesen und dann können Sie es innerhalb Ihrer Schleife verwenden, um die genaue Anzahl der Werte zu lesen, die Sie brauchen. Hier

ist ein Beispiel dafür, wie man die ersten zwei ganzen Zahlen erhalten könnte Ihre Matrixgröße zu finden:

int zeileM1 = StdIn.readInt(); 
int spalteM1 = StdIn.readInt(); 

Sie auch in Ihrem diese Methode anwenden müssen für Schleifen, die Daten in die Matrix zu lesen.

+0

Ja, aber ich muss bestimmen, welche Größe der Matrix ich zuerst erhalten möchte, aber ich möchte die Größe und den Wert zusammen als 1 Array setzen dann wählen Sie die ersten beiden Index als die Größe. –

+0

Sie sollten weiterhin alle Werte gleichzeitig an die Standardeingabe senden können, auch wenn der Code sie nur einzeln liest. Das Problem mit readAllInts() ist, dass es nicht aufliest, bis es EOF von der Standardeingabe erreicht, was bedeutet, dass nichts mehr für den nächsten Anruf übrig bleibt. Alternativ könnten Sie auch nur den ersten Aufruf verwenden und die zweite Matrix analysieren, wobei k aufgehört hat: int zeileM2 = einGabeMatrix1 [k ++]; int spalteM2 = einGabeMatrix1 [k ++]; – Jeff