2016-06-03 15 views
0

Ich habe folgenden Code, in dem eine Matrix, durch die Systemeingabe definiert ist:Scanner Objekt hält Eingang erwartet

import java.io.*; 
import java.util.*; 

public class Test { 

    public static void main(String[] args) { 

     Scanner in = new Scanner(System.in); 

     //define size of matrix 
     int size = in.nextInt(); 

     int primeSum = 0; 
     int secSum = 0; 
     int[] matrix = new int[size*size]; 

     //create matrix 
     for (int i=0; i<size*size;i++) { 
      matrix[i] = in.nextInt(); 
     } 

     in.close(); 

     //sum primary diagonal 
     for (int i=0; i < size*size;i += (size + 1)) { 
      primeSum = primeSum + matrix[i]; 
     } 

////sum secondary diagonal 
//  for (int i=(size - 1); i < size*size; i += (size - 2)) { 
//   secSum = secSum + matrix[i]; 
//  } 

     System.out.println(Math.abs(secSum - primeSum)); 


    } 
} 

Der obige Code arbeitet, dass es den Benutzer erlaubt, eine NxN-Matrix durch Eingeben N als definieren Größe - also in der Fallgröße = 2 würde der Benutzer 4 Matrixelemente definieren. Nach dem Zurückkommen im Code für die sekundäre Diagonale erwartet das Scannerobjekt jedoch Eingaben über 4 ganze Zahlen hinaus - ich habe keine Ahnung, warum dies das Programm beeinflussen würde, wenn ich den Eingabestrom schließe, bevor dieser Codeblock erreicht ist.

+2

Stellen Sie sich vor Ihrem Beispiel, Sie sind in einer Endlosschleife läuft: Matrix size = 2. Glauben Sie, 'i + = (Größe - 2) 'wird' i' inkrementieren? Beachten Sie, dass jede Größe> 2 wieder funktioniert. – SomeJavaGuy

+0

Nein, aber in der Fallgröße = 3 und darüber hinaus wird es – BenWS

+0

Ja, aber dann wird die Bedingung 'i SomeJavaGuy

Antwort

1

Sie haben eine potentiell unendliche Schleife geschrieben. I.e. Wenn die Größe nicht größer als 2 ist, wird i rückwärts zählen oder bleiben 0. Sie sollten diese Eckfälle abdecken, dann wird Ihr Code in Ordnung sein.

Soweit ich sehen kann, emulieren Sie ein zweidimensionales Array auf einem eindimensionalen. Dies ist etwas, das schwer zu verstehen und leicht zu vermasseln ist. Sie sind besser mit einem zweidimensionalen Array aus und einige verschachtelte Schleifen:

int[][] matrix = new int[size][size]; 

    //create matrix 
    for (int i=0; i<size; i++) { 
     for (int j=0; j<size; j++) { 
      matrix[i][j] = in.nextInt(); 
     } 
    } 
    // and so on... 
1

Sie diesen Teil des Codes:

for (int i=0; i<size*size;i++) { 
     matrix[i] = in.nextInt(); 
} 

ruft die Methode nextInt die so lange für die Eingabe verlangt als das Array gefüllt ist.

Verwandte Themen