2013-10-09 2 views
1

입력 내용이 마법 사각형 행렬을 만들거나하지 않는다는 숙제를 작성했습니다. 매직 스퀘어 행렬에서는 모든 행, 열 및 대각선 합이 동일해야합니다. 행, 열 및 대각선의 합을 계산하는 함수를 작성했습니다. 코드의 끝에서 나는 그것들이 동등한 지 아닌지를 비교할 필요가있다. 함수의 결과를 다른 변수에 할당하고 코드 끝의 if 문에서 함수의 결과를 비교했습니다. 비교를 위해 똑똑한 방법이 있는지 궁금합니다. if 문에는 변수가 너무 많고 평등이 너무 많습니다. 나는 이것을 위해 더 똑똑한 방법이 있다고 믿습니다.if 문에서 너무 많은 변수 비교

package lab03; 

import java.util.Scanner; 

public class E7_15 { 

public static boolean checkNumbers(int[][] array){ 
    for(int i=0; i<4; i++){ 
     for(int j=0; j<4; j++){ 
      if (array[i][j] < 1 || array[i][j] > 16){ 
       System.out.println("You entered a wrong value"); 
       return false; 
      } 
     } 
     } 
    return true; 
} 

public static int sumRow(int[][] array, int i){ 
    int sum = 0; 
    for(int j=0; j<array[i].length; j++){ 
     sum += array[i][j]; 
    } 
    return sum; 
} 

public static int sumColumn(int[][] array, int j){ 
    int sum = 0; 
    for(int i=0; i<array[j].length; i++){ 
     sum += array[i][j]; 
    } 
    return sum; 
} 

public static int diagonalSumRightToLeft(int[][] array){ 
    int sum = 0; 
    for(int i=0; i<array.length; i++){ 
     sum += array[i][array.length-1-i]; 
    } 
    return sum; 
} 

public static int diagonalSumLeftToRight(int[][] array) { 
    int sum = 0; 
    for(int i=0; i<array.length; i++){ 
     sum += array[i][i]; 
    } 
    return sum; 
} 

public static void main (String [] args){ 

    int[][] intArray = new int [4][4]; 
    Scanner in = new Scanner(System.in); 
    for (int i=0; i<4; i++) { 
     for (int j=0; j<4; j++) { 
      System.out.println("!!!Please enter your numbers between 1-16!!!"); 
      System.out.println("Enter your number for row " + (i+1) + " and column " + (j+1) + ": "); 
      intArray[i][j] = in.nextInt(); 
     } 
    } 
    boolean done = checkNumbers(intArray); 
    int sumLRD = diagonalSumLeftToRight(intArray); 
    int sumRLD = diagonalSumRightToLeft(intArray); 
    int r1 = sumRow(intArray, 0); 
    int r2 = sumRow(intArray, 1); 
    int r3 = sumRow(intArray, 2); 
    int r4 = sumRow(intArray, 3); 
    int c1 = sumColumn(intArray, 0); 
    int c2 = sumColumn(intArray, 1); 
    int c3 = sumColumn(intArray, 2); 
    int c4 = sumColumn(intArray, 3); 

    if (done == true){ 
     if(sumLRD==sumRLD && sumLRD==r1 && sumLRD==r2 && sumLRD==r3 && sumLRD==r4 && 
     sumLRD==c1 && sumLRD==c2 && sumLRD==c3 && sumLRD==c4 && sumRLD==r1 && sumRLD==r2 && 
     sumRLD==r3 && sumRLD==r4 && sumRLD==c1 && sumRLD==c2 && sumRLD==c3 && 
     sumRLD==c4 && r1==r2 && r1==r3 && r1==r4 && r1==c1 && r1==c2 && r1==c3 && r1==c4 && 
     r2==r3 && r2==r4 && r2==c1 && r2==c2 && r2==c3 && r2==c4 && r3==r4 && r3==c1 && 
     r3==c2 && r3==c3 && r3==c4 && r4==c1 && r4==c2 && r4==c3 && r4==c4 && c1==c2 && 
     c1==c3 && c1==c4 && c2==c3 && c2==c4 && c3==c4){ 
      System.out.println("This is a magic square matrix"); 
     } 
     else { 
      System.out.println("This is NOT a magic square matrix"); 
     } 
    } 
    if (done == false){ 
     System.out.println("WRONG VALUE! START AGAIN!"); 
    } 
    in.close(); 
} 

은}

답변

3

당신이 모든 숫자가 동일한 있는지 확인하려는 것 같다. 그냥 다음 중 하나를 사용하여 목록에있는 모든 변수를 비교하는 루프를 사용 :

public boolean allEqual(int... values) { 
    for (int i = 0; i < values.length-1; i++) { 
     if (values[i] != values[i+1]) { 
      return false; 
     } 
    } 
    return true; 
} 

그 다음으로 megacondition 교체 : 평등이기 때문 작동

if (allEqual(sumLRD, sumRLD, r1, r2, ...)) { 
    // ... 
} 

이적 - 즉 a == b 경우와 b == c 다음 a == c. (변수의 수에 대한 동일.)

대안이 같은 무언가로 전체 검사를 리팩토링하는 것입니다 : 당신은 배열에 모든 금액을 넣을 수

boolean isMagicSquare(int[][] intArray) { 
    // check diagonals 
    int sum = diagonalSumLeftToRight(intArray); 
    if (sum != diagonalSumRightToLeft(intArray)) { 
     return false; 
    } 

    // check rows and columns 
    for (int i = 0; i < 4; i++) { 
     if (sum != sumRow(intArray, i) || sum != sumColumn(intArray, i)) { 
      return false; 
     } 
    } 

    return true; 
} 

// ... 
if (isMagicSquare(intArray)) { 
    // ... 
} 
+1

영업으로 : 모든 값이 같은지 여부를 확인하기 위해'...'아마 모두를위한 평등을 확인하는 가장 간결한 방법입니다 (변수 인수, 또는 가변 인자로 알려진) allEquals의 구문 숫자의 한 번에, 그러나 당신은 아직 당신의 학문에서 그것에 도착하지 않을지도 모른다. 전달한 모든 인수 중에서 배열을 자동으로 작성합니다. [이 기사에서 java.net] (https://today.java.net/pub/a/today/2004/04/19/varargs.html)은 유용한 문맥을 제공 할 수 있습니다. –

+0

나는 체크를 할 도우미 메서드에서 같은 접근 방식을 사용하는 "테이크 해제 된"대체 테이크를 추가했습니다. – millimoose

0

및 이와 같은 기능을 사용

public static boolean allElementsTheSame(int[] array) { 
    if (array.length == 0) { 
     return true; 
    } else { 
     int first = array[0]; 
     for (int element : array) { 
      if (element != first) { 
       return false; 
      } 
     } 
     return true; 
    } 
}