2016-11-30 8 views
0

私は、3つのユーザー作成メソッドに問題があり、mainメソッドでこれらを正しく呼び出すようです。私は私が知っている構文エラーがないので、論理的なものを残すように、パラメータもうまく見えます。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メソッドの3番目の引数はnでなければならず、代わりにn *(n * n + 1)/ 2(targetSum)を渡します。この値は、1より大きい任意のnに対して常にn以上になるため、コードに基づいてインデックスから範囲外の例外が発生します。

代替(完了)オプションがないので、無限回帰(次のバグ)であるrowsEqTargetSum(null、0、合計、合計、合計)のテールコールのメソッド内で、この方法ではこれは、あなたのコードが適切な引数を持つメソッドを呼び出すように修復された場合、スタックオーバーフローの次のエラーにつながると私は信じています。

+0

return rowsEqTargetSum(null、0、sum、sum、sum、sum)を変更しました。 (a、0、sum ...)と私は、あなたが話しているものであればスタックオーバーフローエラーを起こしました。それはAcewinによって示された変更の後です。 – Aramza

+1

はい、スタックオーバーフローは無限再帰によるものです。あなたのコードが正しく理解されていれば、 "sum == 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 - >のint [] rowArr = [行] ;

ステップ2 - >

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

あなたは、コール・リターンrowsEqTargetSum(NULL、0、合計、合計、合計、合計)を作るときには、java.lang.NullPointerExceptionがにつながります。

+0

作成したこのメソッドは、提供された引数に各行の同じ数の列が含まれていることを強制しないため、動作が異なります。この場合、引数nの目的は、入力が常に行と同じ数の列を持つことを保証することです。そうでない場合は、NULLポインタ例外が発生します。 nullポインタ例外がキャッチされて、無効な引数例外のようなより有用なエラーが生成されますが、渡された引数が正方形でない場合、このメソッドは例外をスローする必要があります。 –

+0

実際には、NullPointerExceptionを避けるために、ここまで来ていません。一方で問題全体を理解するのではなく、他の人が指摘しているように私の提案は例外を理解してそこから作業することです。あなたはすべてのステップを視覚化するべきではありませんが、一度に1ステップずつ修正してください。 – Acewin

+0

「あなたはすべてのステップを視覚化するべきではありませんが、一度に1ステップずつ変更するべきではありません」という考えをどこで得たのか分かりませんが、簡単に擁護されている意見は、GPU開発で見られるように並行処理のための余地がなく、主流の開発では60以上のコアプロセッサに直面しているためです。 –

関連する問題