2016-11-30 2 views
0

У меня, похоже, возникают проблемы с тремя созданными пользователем методами и их правильное обращение в основном методе. У меня нет никаких синтаксических ошибок, о которых я знаю, поэтому они оставляют логические, параметры тоже выглядят отлично.Java: методы не работают

Программа должна иметь выход, похожий на последний выход ниже. Это программа, которая принимает 2D-массив и проверяет, является ли это magic square. Каждый метод несет ответственность за процесс проверки/проверки, чтобы определить, является ли он магическим квадратом или нет.

Я очень благодарен за помощь в этом, я в тупике.

Код:

import java.util.Arrays; 

public class Magic10 
{ 
    // A method to check whether rows equal the target sum 
    private static boolean rowsEqTargetSum(int[][] a, int targetSum, int n, int row, int col, int sum) 
    { 
    // Calculate the sum of each row ... if magic, then equal to targetSum  
     for(row=0; row<n; row++) 
     { 
      System.out.print("row "+row+": "); 
      for(col=0; col<n; col++) 
      { 
       int value = a[row][col]; 
       sum += value; 
       if (col > 0) 
        System.out.print(" + "); // print plus before all except 1st 
       System.out.print(value); 
      } 
      System.out.println(" = "+sum); 
      if(sum != targetSum) 
      { 
       System.out.println("Row sum incorrect : Not a magic Square!"); 
      } 
     } 
     return rowsEqTargetSum(null, 0, sum, sum, sum, sum); 
    } 
    // A method to check whether diagonals equal the target sum 
    private static boolean diagonalEqTargetSum(int[][] a, int targetSum, int n, int row, int col, int sum) 
    { 
     System.out.print("diagonal: "); 
     for(int pos=0; pos<n; pos++) 
     { 

      row = n-1 - pos; 
      col = pos; 
      int value = a[row][col]; 
      sum += value; 
      if (pos > 0) 
       System.out.print(" + "); // print plus before all except 1st 
      System.out.print(value); 
     } 
     System.out.println(" = "+sum); 
     if(sum != targetSum) 
     { 
      System.out.println("Diagonal is incorrect : Not a magic Square!"); 
     } 
     return diagonalEqTargetSum(null, 0, 0, sum, sum, sum); 
    } 
    // A method to check whether all numbers are used exactly once in the 2D array 
    private static boolean allNumbersRepresented(int[][] a, int n, int col, int row) 
    { 
    // Lastly, we check that every number from 1 to n is represented 
     final int nSquare=n*n; 
     boolean[] flag= new boolean[n*n]; 

     for(row=0; row<n; row++) 
     { 
      for(col=0; col<n; col++) 
      { 
       int num = a[row][col]; 
       if (n < 1 || num > nSquare) 
       { 
        System.out.println("Number out of range : Not a magic Square!"); 
       } 
       if (flag[num-1]) 
       { 
        System.out.println("Duplicate number : Not a magic Square!"); 
       } 
       flag[num-1] = true; 
      } 
     } 
     return allNumbersRepresented(null, 0, 0, 0); 
    } 

    public static void main(String []args) 
    { 
     int[][] a ={{4,9,2}, 
        {3,5,7}, 
        {8,1,6}}; 
     final int n=a.length; 
     final int targetSum=n*(n*n+1)/2; 

     System.out.println(" The following two dimensional array is Magic!"); 
     for (int i = 0;i< a.length;i++) 
     { 
      System.out.println(Arrays.toString(a[i])); 
     } 

     // Calls rowsEqTargetSum Method 
     if (!rowsEqTargetSum(a, targetSum, targetSum, targetSum, targetSum, targetSum)) 
     { 
      return; 
     } 
     // Calls diagonalEqTargetSum Method 
     if (!diagonalEqTargetSum(a, targetSum, targetSum, targetSum, targetSum, targetSum)) 
     { 
       return; 
     } 
     // Calls allNumbersRepresented Method 
     if (!allNumbersRepresented(a, targetSum, targetSum, targetSum)) 
     { 
       return; 
     } 
    } 
} 

Выходной ток (? Что-то не так с вызовом методов)

The following two dimensional array is Magic! 
[4, 9, 2] 
[3, 5, 7] 
[8, 1, 6] 
row 0: 4 + 9 + 2Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 
    at Magic10.rowsEqTargetSum(Magic10.java:14) 
    at Magic10.main(Magic10.java:91) 

выход смотрит несколько как это:

row 0: 4 + 9 + 2 = 15 
row 1: 3 + 5 + 7 = 15 
row 2: 8 + 1 + 6 = 15 
diagonal: 8 + 5 + 2 = 15 
The following two dimensional array is Magic ! 
[4, 9, 2] 
[3, 5, 7] 
[8, 1, 6] 
+1

_ «иметь проблемы» _ - что это значит? Просьба уточнить и объяснить, что именно происходит и что вы ожидаете. Включите любые сообщения об ошибках и/или трассировку стека. –

+0

Я запутался в проблеме, я думал, что правильно назвал методы и правильно их настроил, и я не знаю, что я сделал неправильно. – Aramza

+0

Что не работает. как то, что он должен делать, но не делает. – sbowde4

ответ

0

Ваш метод не является проблемой. Это случай G.I.G.O (Мусор, мусор). Вы вызвали свой метод, используя неправильные аргументы. В этом случае третий аргумент метода rowsEqTargetSum должен быть n, и вместо этого вы передаете n * (n * n + 1)/2 (targetSum). Это значение всегда будет выше n для любого n, большего чем 1, и, следовательно, приведет к исключению индекса из пределов на основе вашего кода.

Эта же проблема возникает снова в методе в хвостовом вызове rowsEqTargetSum (null, 0, sum, sum, sum, sum), который является бесконечной рекурсией (ваша следующая ошибка), поскольку альтернативы (завершения) нет в методе. Это, по моему мнению, приведет к следующей ошибке переполнения стека, если ваш код будет восстановлен, чтобы вызвать методы с правильными аргументами.

+0

Я изменил строки returnEqTargetSum (null, 0, sum, sum, sum, sum); (a, 0, sum ...), и я попал в ошибку переполнения стека, если это тот, о котором вы говорите, - это после изменения, указанного Acewin. – Aramza

+1

Да, переполнение стека происходит из-за бесконечной рекурсии. Если я правильно понимаю ваш код, вы должны «вернуть сумму == targetSum;» вместо выполнения рекурсии. –

0

Вы должны уметь понимать, что такое Исключение, и как его решить. Выполнение кода в его выпуске говорит об ошибке java.lang.ArrayIndexOutOfBoundsException и в какой строке вы его получаете.

Первый шаг, чтобы исправить вашу логику, чтобы избежать java.lang.ArrayIndexOutOfBoundsException

Вы можете контролировать итерации, как показано ниже

for(row=0; row<a.length; row++) 
    { 
     int[] rowArr = a[row]; 
     System.out.print("row "+row+": "); 
     for(col=0; col<rowArr.length; col++) 
     { 
      int value = a[row][col]; 
      sum += value; 
      if (col > 0) 
       System.out.print(" + "); // print plus before all except 1st 
      System.out.print(value); 
     } 
     System.out.println(" = "+sum); 
     if(sum != targetSum) 
     { 
      System.out.println("Row sum incorrect : Not a magic Square!"); 
     } 
    } 

Шаг 1 ->ИНТ [] rowArr = а [строка] ;

Шаг 2>

int[] rowArr = a[row]; 
System.out.print("row "+row+": "); 
for(col=0; col<rowArr.length; col++) 

Это приводит к java.lang.NullPointerException когда вы делаете обратный звонок rowsEqTargetSum (нуль, 0, сумма, сумма, сумма, сумма);

+0

Этот метод, который вы создали, имеет другое поведение, поскольку он не обеспечивает, чтобы предоставленный аргумент содержал одинаковое количество столбцов в каждой строке. В этом случае целью аргумента n является обеспечение того, чтобы на входе всегда было такое же количество столбцов, что и строки, иначе будет исключение нулевого указателя. Исключение нулевого указателя можно было бы поймать, чтобы создать более полезную ошибку, например исключение недопустимых аргументов, но если переданный аргумент не является квадратным, этот метод должен вызывать исключение. –

+0

На самом деле я не пришел к делу, чтобы избежать NullPointerException. Вместо того, чтобы понять всю проблему за один раз, мое предложение, как указано другими, понимает исключение и работу оттуда. Вы не должны кодировать все шаги, но изменять их один шаг за раз – Acewin

+0

Я не знаю, откуда у вас возникла мысль, что «вы не должны кодировать все шаги, но изменять их по одному шагу», но это не легко защищали мнение, поскольку оно не позволяет использовать возможности параллелизма, как вы увидите в процессе разработки графических процессоров, и вскоре в основной разработке, поскольку мы сталкиваемся с более 60 ядрами. –

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