2016-06-03 4 views
0

У меня есть следующий код, в котором матрица определяется через вход системы:объект Сканер держит ожидает ввода

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


    } 
} 

Код выше работает в том, что оно позволяет пользователю определить матрицу NxN через ввод N как size - поэтому в случае size = 2 пользователь будет определять 4 элемента матрицы. Однако, после комментирования кода вторичной диагонали, объект сканера продолжает ожидать входные данные из 4 целых чисел - я понятия не имею, почему это повлияет на программу, когда я закрываю входной поток до того, как этот блок кода будет достигнут.

+2

Только представьте себе ваш пример, вы работаете в бесконечном цикле: Matrix размер = 2. Как вы думаете, 'I + = (размер - 2) 'будет увеличивать' i'? Обратите внимание, что каждый размер> 2 снова будет работать. – SomeJavaGuy

+0

Нет, но в случае size = 3 и за его пределами будет – BenWS

+0

Да, но тогда условие 'i SomeJavaGuy

ответ

1

Вы написали потенциально бесконечный цикл. То есть если размер не превышает 2, то i будет отсчитывать или оставаться 0. Вы должны покрыть эти угловые случаи, тогда ваш код будет в порядке.

Насколько я могу судить, вы эмулируете двумерный массив на одномерном. Это то, что трудно понять и легко испортить. Вы лучше с двумерным массивом и некоторых вложенных циклов:

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

Ваша эта часть кода:

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

вызывает метод nextInt, который требует ввода до тех пор, пока массив заполнен.

Смежные вопросы