2015-01-28 5 views
-1

매직 스퀘어 코드에 문제가 있습니다. 그것은 긍정적으로 보일지라도 "이것은 마술 광장"입니다. 16 개의 정수를 입력하면 코드가 실행되어 입력 된 정수가 매직 스퀘어를 생성하는지 (즉, 모든 행, 열 및 대각선의 합이 모두 같은지) 결정됩니다.매직 스퀘어 코드 (자바)

인쇄를 허위로 만드는 방법을 알아낼 수 없습니다.

import java.util.*; 
public class MagicSquare { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     Scanner keyboard = new Scanner (System.in); 

     int [] [] square = new int [4][4]; 
     for (int row = 0; row < 4; row++) 
     { 
      for (int col = 0; col < 4; col++) 
      { 
       System.out.println("Input value for row " + (row+1) + " column " + (col+1)); 
       square[row][col] = keyboard.nextInt(); 
      } 
     } 

     int [] sumRow = new int [4]; 
     int [] sumCol = new int [4]; 

     int sum = 0; 

     for (int row = 0; row < 4; row ++) 
     { 
      for (int col = 0; col < 4; col ++) 
      { 
       sum = sum + square[row][col]; 
       sumRow[row] = sum; 
      } 
      System.out.println("sum row " + row + "\n" + sumRow[row]); 
      sum = 0; 
     } 

     sum = 0; 

     for (int col = 0; col < 4; col ++) 
     { 
      for (int row = 0; row < 4; row ++) 
      { 
       sum = sum + square[row][col]; 
       sumCol[col] = sum; 
      } 
      System.out.println("sum columns " + col + "\n" + sumCol[col]); 
      sum = 0; 
     } 

     int [] sumDiag = new int [4]; 
     sum = 0; 

     for (int row = 0; row < 4; row++) 
     { 
      for (int col = 3; col > -1; col--) 
      { 
       sum = sum + square [row][col]; 
       sumDiag[row] = sum; 
      } 
      System.out.println("sum diagonal " + row + "\n" + sumDiag[row]); 
      sum = 0; 
     } 

     int [] sumDiag2 = new int [4]; 
     sum = 0; 

     for (int col = 0; col < 4; col ++) 
     { 
      for (int row = 3; row > -1; row --) 
      { 
       sum = sum + square[row][col]; 
       sumDiag2[col] = sum; 
      } 
      System.out.println("sum diagonal 2 " + col + "\n" + sumDiag2[col]); 
     } 

     boolean bool = false; 

     int k = 0; int j = 1; 
     do 
     { 
      if (sumRow[k] == sumRow[j]) 
      { 
       k = j; 
       j += 1; 
       bool = true; 
      } 
      else 
      { 
       bool = false; 
       System.out.println("Not a magic square"); 
       break; 
      } 
     } while ((k < 4) && (j >- 1)); 

     k = 0; j = 1; 
     do 
     { 
      if (sumCol[k] == sumRow[j]) 
      { 
       k = j; 
       j += 1; 
       bool = true; 
      } 
      else 
      { 
       bool = false; 
       System.out.println("Not a magic square"); 
       break; 
      } 
     } while ((k < 4) && (j >= -1)); 



     String TorF = ""; 
     if (bool = true) 
     { 
      TorF = "is"; 
     } 
     else if (bool = false) 
     { 
      TorF = "is not"; 
     } 

     System.out.println("This " + TorF + " a magic square."); 

    } 

} 
+1

'for (i = 1; i <4; i ++)'에주의해야합니다. 'i = 0'이 맞습니까? –

+1

디버거를 사용하여 마법 사각형에 의도 한 데이터가 있는지 확인 하시겠습니까? –

+0

대문자 'TorF'로 변수 이름을 시작하지 않는 것이 좋습니다 – Roger

답변

1

의견에 언급 된 것처럼 코드에는 여러 가지 문제가 있습니다.

먼저 main and secondary diagonals 만 확인하면됩니다.

두 번째로, 합계를 비교하는 코드가 모든 경우에 작동하지 않고 대각선을 비교하지 않습니다.

또한 if도 잘못되었습니다.

if (bool) { 
} else { 
} 

을 그리고 여기에 솔루션입니다 : 대신이 작업을 수행

int order = square.length; 

int[] sumRow = new int[order]; 
int[] sumCol = new int[order]; 
int[] sumDiag = new int[2]; 

Arrays.fill(sumRow, 0); 
Arrays.fill(sumCol, 0); 
Arrays.fill(sumDiag, 0); 

for (int row = 0; row < order; row++) { 
    for (int col = 0; col < order; col ++) { 
    sumRow[row] += square[row][col]; 
    } 
    System.out.println("sum row " + row + "\n" + sumRow[row]); 
} 

for (int col = 0; col < order; col++) { 
    for (int row = 0; row < order; row ++) { 
    sumCol[col] += square[row][col]; 
    } 
    System.out.println("sum columns " + col + "\n" + sumCol[col]); 
} 

for (int row = 0; row < order; row++) { 
    sumDiag[0] += square[row][row]; 
} 
System.out.println("sum diagonal 0 " + "\n" + sumDiag[0]); 

for(int row = 0; row < order; row++) { 
    sumDiag[1] += square[row][order - 1 - row]; 
} 
System.out.println("sum diagonal 1 " + "\n" + sumDiag[1]); 

boolean bool = true; 

int sum = sumRow[0]; 
for (int i = 1; i < order; i++) { 
    bool = bool && (sum == sumRow[i]); 
} 
for (int i = 0; i < order; i++) { 
    bool = bool && (sum == sumCol[i]); 
} 
for (int i = 0; i < 2; i++) { 
    bool = bool && (sum == sumDiag[i]); 
} 

String tOrF = ""; 
if (bool) { 
    tOrF = "is"; 
} else { 
    tOrF = "is not"; 
} 
System.out.println("This " + tOrF + " a magic square."); 

또한,이 코드를 최적화 할 수있는 몇 가지가 있습니다.