2012-02-12 3 views
0

私はmagicsquareを形成するために、数字> 0を入力できるmagicsquareプログラムをやっています。マジックスクエアは、かなり正方形です。つまり、nはn(2乗)の数字を持つ必要があります。 ticTacToeのように、すべての行、列、対角線のそれぞれが同じ魔法の四角形とみなされるために同じ合計を持っています。私のプログラムを実行すると、2D配列セットが混乱し、通常は数字の集合がmagicsquare必ずしもそうではありません。助けてください!プログラムが正常に実行されない

import java.util.Scanner; 

public class SquareRunner 
{ 
public static void main(String[] args) 
{ 
    Scanner in = new Scanner(System.in); 
    Square test = new Square(); 
    System.out.println("Enter a row of integers. When you are finished, type 'n' in a new line"); 
    boolean flag = false; 
    while(!flag) 
    { 
     String numbers = in.next(); 
     if(numbers.equals("n")) 
     flag = true; 
     else 
     test.add(numbers); 
    } 
    test.isMagic(); 

} 
} 

public class Square 
{ 
    private int[][] values; 
    private int row; 

public Square() 
{ 
    row = 0; 
} 

public void add(String numbers) 
{ 
    int b = 1; 
    int amount = numbers.length(); 
    values = new int[amount][amount]; 

    for(int j =0;j<amount;j++) 
    { 
     String a = numbers.substring(j,b); 
     int convert = Integer.parseInt(a); 
     values[row][j] = convert; 

     b++; 
    } 
    row++; 

} 


public Boolean isMagic() 
{ 
    int checkAmountColumns = values[0].length; 
    int checkAmountRows = values.length; 
    int isSquare = checkAmountColumns * checkAmountRows; 

     for(int q = 0;q<values.length;q++) 
     { 
      for(int w=0;w<values[0].length;w++) 
      { 
       int checkZero = values[q][w]; 
       if(checkZero == 0) 
       { 
        System.out.print("To be a perfect square, your number of rows and columns, n must be a perfect "); 
        System.out.println("Square i.e. 9 total numbers is 3 numbers per row"); 
        return false; 
       } 
      } 
     } 
    if(checkAmountColumns != checkAmountRows || Math.sqrt(isSquare) != checkAmountColumns) 
    { 
     System.out.print("To be a perfect square, your number of rows and columns, n must be a perfect "); 
     System.out.println("Square i.e. 9 total numbers is 3 numbers per row"); 
     return false; 
    } 

    else 
    { 
     int magicNumber = 0; 
     int counter = 0; 
     int compareTo = 0; 

     //row to row 
     for(int i =0;i<values.length;i++) 
     { 
      for(int j = 0;j<values[0].length;j++) 
      { 

       values[i][j] += compareTo; 
       if(counter == 0) 
       values[i][j] += magicNumber; 

      } 
      counter ++; 
      compareTo = 0; 
      if(compareTo != magicNumber) 
      { 
       System.out.println("This Selection of numbers is not a perfect square"); 
       return false; 
      } 
     } 

     //column to column 
     for(int i =0;i<values[0].length;i++) 
     { 
      for(int j = 0;j<values.length;j++) 
      { 

        values[j][i] += compareTo; 
        if(counter == 0) 
        values[j][i] += magicNumber; 

       } 
       counter ++; 
       compareTo = 0; 
       if(compareTo != magicNumber) 
       { 
       System.out.println("This Selection of numbers is not a perfect square"); 
       return false; 
       } 

     } 
     System.out.println("This selection of numbers is a MagicSquare!"); 
     return true; 

    } 
} 
} 
+3

この宿題はありますか? –

答えて

0

最初に気づくのは、add()メソッドが正しく動作しない可能性があることです。あなたがそれを呼び出すたびに、前のvaluesメンバーを新しく割り当てられた配列で上書きします。これにより、入力した前の行が破棄されます。

+0

私はそれがやったと感じていた。私はこの方法を解決する方法がわからない。あなたは何か考えていますか? – James

+0

コンストラクタで 'values'配列* once *を割り当てて(' size'パラメータを渡して)、 'add()'メソッドの値を埋めてください。 –

+0

お二人のおかげで – James

0

Gregと同じ回答です。 これをaddメソッドに追加し、values配列の初期化を削除します。

if(values == null){values = new int[amount][amount];} 
関連する問題