2016-10-13 3 views
0

다차원 배열 (표)의 평균을 계산하도록 요청 받았습니다. 내가 제대로 모든 것을 구축 (적어도 난 그렇게 기분이) 생각 :다차원 배열의 평균을 계산하십시오.

import java.util.Scanner; 

public class Exam { 
    static int NROWS = 5; 
    static int NCOL = 6; 
    static int[][] data = new int[NROWS][NCOL]; 

public static void main(String[] args) { 
    Scanner scan = new Scanner(System.in); 
    enterData(scan); 
    countAvg(); 
} 

static void enterData(Scanner in) { 
    System.out.println("How many rows ? (up to " + NROWS + ")"); 
    int rows = in.nextInt(); 
    System.out.println("How many cols ? (up to " + NCOL + ")"); 
    int cols = in.nextInt(); 
    for (int i = 0; i < rows; i++) { 
     System.out.println("Row" + i + ": "); 
     for (int j = 0; j < cols; j++) { 
      System.out.print("Enter Data for Column " + j + ":"); 
      data[i][j] = in.nextInt(); 
     } 
    } 
} 

static void countAvg() { 
    int total = 0; 
    int count = 0; 
    for (int i = 0; i < NROWS; i++) { 
     for (int j = 0; j < NCOL; j++) { 
      total = total + data[i][j]; 
      count = count++; 
     } 
    } 
    int avg = total/count; 
    System.out.println("the average is: " + avg); 
} 

}

하지만 시스템이 여전히 나에게이 메시지를 밀어 : 스레드 "주요"자바

예외. lang.ArithmeticException : Exam.main (Exam.java:9)에서 Exam.countAvg (Exam.java:33) 에 의해 제로 /

내가 뭘 잘못하고 있는지 이해하도록 도와주세요. 많은 감사합니다!

+0

(AN Optional.empty을 반환하여) 비어있는 배열의 가능성을 허용하는 line'int avg = total/count;'그래서 여러분의 coun 여기서 t는 0입니다. 'count = count ++ '가 어떻게 작동하는지 모르겠다.'count ++'를 시도해보십시오. –

+0

예. 그건 분명히 당신 문제입니다. 나는 그것을 시험했다. 'count ='를 꺼내고'count ++; '를 사용하십시오 –

+0

고맙습니다, 마이클! 이제 어떤 이유로 평균은 0으로 잘못 계산합니다. 어떻게 숨겨진 문제가 될 수 있다고 생각하니? –

답변

0

첫째, 단지 count++;

둘째, 정수 나눗셈을하고하는 count = count++; 변경, 그래서 int avg = total/count;

셋째 double int = total/(double) count;에, 당신은 5 × 6 등의 데이터 배열을 설정하는 변경 심지어 입력 뭔가 다른 경우, 이것은 모든 셀에 30이 추가 될 때 평균값을 버립니다.

대신,이

import java.util.Scanner; 

public class Exam { 
    static int[][] data; 
    private static int rows = 0; 
    private static int cols = 0; 

    public static void main(String[] args) { 
     Scanner scan = new Scanner(System.in); 
     enterData(scan); 
     countAvg(); 
    } 

    static void enterData(Scanner in) { 
     System.out.println("How many rows ?"); 
     rows = in.nextInt(); 
     System.out.println("How many cols ?"); 
     cols = in.nextInt(); 
     data = new int[rows][cols]; 
     for (int i = 0; i < rows; i++) { 
      System.out.println("Row" + i + ": "); 
      for (int j = 0; j < cols; j++) { 
       System.out.print("Enter Data for Column " + j + ":"); 
       data[i][j] = in.nextInt(); 
      } 
     } 
    } 

    static void countAvg() { 
     int total = 0; 
     int count = 0; 
     for (int i = 0; i < rows; i++) { 
      for (int j = 0; j < cols; j++) { 
       total = total + data[i][j]; 
       count++; 
      } 
     } 
     double avg = total/(double) count; 
     System.out.println(count + "the average is: " + avg); 
    } 
} 

이 당신이 제대로 평균을 계산할 수 있습니다 입력 행과 COLS와 새로운 데이터 배열을 만들 수하려고합니다.

+0

감사합니다! 나는 ROWS와 COLS에 대해서도 같은 생각을하고 있었지만 그 정적 변수는 변경을 제안한 기본 패키지의 일부입니다. –

0

마이클 피켓 (Michael Pickett)이 위에서 언급 한 것처럼 문제는 count = count++;입니다. post-increment을 사용하고 있기 때문에 카운트가 0이되는 모든 방법으로 라인이 실행 된 후에 증분이 발생합니다. pre-increment 을 사용하면 라인을 실행하는 동안 증분이 발생합니다.

위와 같이 pre-increment 또는 post-increment을 사용할 수 있습니다.이 변수를 count 변수에 할당하지 않아도됩니다. ,

0

다른 답변과 함께 (모두 올바른) 코드의 가독성을 향상시킬 수있는 몇 가지 사항을 메모하십시오. 대신 인덱스를 사용하는 '에 대한-각각'루프를 사용할 수 있습니다 당신이 총에 가치를 추가 +=를 사용할 수 있습니다 당신은 자바 팔에 익숙하다면

for (int[] row: data) { 
    for (int value: row) { 
     total += value; 
     count++; 
    } 
} 

또한,주의, 당신은이 작업을 수행 할 수 있습니다 하나의 문이는 OptionalDouble를 반환

Arrays.stream(data).flatMapToInt(Arrays::stream).average() 

그것은 내가이가에있을 것이라고 생각하면 0으로 나누어 있다고 말했습니다

관련 문제