2013-12-08 6 views
0

배열에서 입력 된 숫자의 평균 및 표준 편차를 구하는 프로그램을 만들고 있습니다. 나는 단 한가지에만 붙어 있습니다 : 평균과 표준 편차가 반환 될 때마다 그것은 Not a Number로 나타납니다. 코드에 어떤 문제가 있습니까? 여기 NaN으로 반환하는 평균 및 표준 편차 메서드

는 방법이다 :

public mainFrame() { 
    initComponents(); 
} 

private double avg; 
private double stdDeviation; 
private double[] gradeArray; 

    /** 
    * 
    * @param gradeArray 
    * @param numElem 
    * @return 
    */ 
    public double getAverage (double[] gradeArray, int numElem) { 
    double sum = 0; 

    for(int i=0;i<numElem;i++){ 
     sum = sum + gradeArray[i]; 
    } 
    return (sum/numElem);   
} 

public double getStdDev (double[] gradeArray, int numElem, double avg){ 
    double sum = 0; 

    for(int i = 0;i<numElem;i++){ 
     sum = sum + Math.pow((gradeArray[i]-avg),2); 
    } 
    return Math.sqrt(sum/numElem); 

그리고 여기에 "성적 입력"이벤트 코드가 버튼에 클릭 :

final int SIZE = 25; 
double[] gradeArray = new double[SIZE]; 
String s; 
int numElem = 0; 
double average = 0; 

for(int i=0;i<=SIZE;i++){ 

    s = (String)JOptionPane.showInputDialog("Enter Grade",""); 
    if (s == null || s == ("")){ 
     break; 

    } 
    else{ 
     try{ 
      gradeArray[i] = Double.parseDouble (s); 
      average = getAverage(gradeArray,numElem); 
      stdDeviation = getStdDev(gradeArray,numElem,avg); 
      txtGradeEntered.setText(1 + i + ""); 
      txtMean.setText(average +""); 
      txtStdDev.setText(stdDeviation+""); 

     } 
     catch (NumberFormatException e){ 
      JOptionPane.showMessageDialog(null, "Your input must be numeric!","Bad Data!",0); 
     } 
     catch (ArrayIndexOutOfBoundsException e){ 
      JOptionPane.showMessageDialog (null, "You can only input 25 values!","Too much data!",0); 
     } 


    } 
} 
+0

디버거를 사용해 보셨습니까? –

+0

'numElem'은 0에서 시작합니다.'getAverage'에서는 따라서 0으로 나눕니다. –

답변

1

문제는 문으로 구분 함께 : return (sum/numElem); 경우 numElm은 다음과 같이 실행되지 않으므로 0sum으로 초기화됩니다.

for(int i=0;i<numElem;i++){ //<---- numElem = 0 
     sum = sum + gradeArray[i]; 
    } 

NaN 값은 을 0으로 나눈 값과 같은 잘못된 연산의 결과를 나타내는 데 사용됩니다. float 및 double 유형의 NaN 상수는 Float.NaNDouble.NaN으로 미리 정의됩니다.

따라서 numElem을 초기화하거나 다른 값으로 설정하십시오.