【问题标题】:Why is my code coming out with the wrong output? Is my insert class wrong?为什么我的代码输出错误?我的插入类错了吗?
【发布时间】:2016-04-03 18:30:04
【问题描述】:

我必须创建要使用其他人拥有的主类来实现的类,并且由于某种原因我没有得到正确的输出,我不确定我的计算是否有误,我认为它们没有或我的插入类错误。

预期输出:

中位数 = 44.5

平均值 = 49.300

标准差 = 30.581

实际输出:

中位数 = 0.0

平均值 = 0.967

标准差 = 4.712

public class StatPackage { 
int count; 
double [] scores; 
final int MAX = 500; 


StatPackage() { 
count = 0; 
scores = new double[MAX]; 
} 
public void insert (double value) { 
if (count < MAX){ 
scores[count] = value; 
++ count; 
} 
} 
public double Mean () { 
    double sum = 0; 
    //For loop for calculating average or mean
    for(int i = 0; i < scores.length; i++){
            sum += (scores[i]);
            count++;    
    }
    double average = sum/count;  
    return average;
    } 

public double Median() { 
int min; 
int tmp; 
int size; 

for (int i = 0; i < scores.length - 1; i ++) 
{ 
min = i; 
for (int pos = i + 1; pos < scores.length; pos ++) 
if (scores [pos] < scores [min]) 
min = pos; 

tmp = (int)scores [min]; 
scores [min] = scores [i]; 
scores [i] = tmp; 

} 
double median = 0;
if  (scores.length % 2 == 0){
    median = (scores[scores.length/2-1] + scores[scores.length/2])/2;
}
else {
    median = (scores[((scores.length/2))]);
}
return median;
} 

public double Variance () { 
    double variance = 0;
    double sum = 0;
    //For loop for getting the variance
    for(int i = 0; i < scores.length; i++){
        sum += scores[i];
        variance += scores[i] * scores[i];
        count++;
    }
    double varianceFinal = ((variance/count)-(sum*sum)/(count*count));
    return (varianceFinal);
} 

public double StdDev (double variance) { 
    double sum = 0;
    for(int i = 0; i < scores.length; i++){
        sum += scores[i];
        variance += scores[i] * scores[i];
        count++;
    }
    double varianceFinal = ((variance/count)-(sum*sum)/(count*count));
return Math.sqrt(varianceFinal);

}

}   

【问题讨论】:

  • 尝试在调试器下运行它。

标签: java arrays class


【解决方案1】:

你的 score 数组的长度是 500,所以每次你在计算中使用它时,你都会运行 500 次。您需要使循环继续条件取决于数组中值的数量,而不是数组的实际长度。我也会注意您的变量命名,有时您会在两个地方使用 count 并且它具有全局范围!此方法将数组中值的数量存储在 count 变量中:

public void insert (double value) { 
    if (count < MAX){ 
        scores[count] = value; 
        ++count; 
    } 
} 

因此,当您从数组中获取值时,请使用 count 变量作为循环继续条件,如下所示:

    public double mean() { 

        double sum = 0; 

        //For loop for calculating average or mean
        for(int i = 0; i < count; i++){
            sum += (scores[i]);  
        }

        double average = sum / count;  
        return average;
    } 

这应该会有所帮助,我没有时间检查您的其他方法,但也许这会给您一个良好的起点。我通过在您的方法中插入打印语句以确保值符合预期来弄清楚发生了什么。调试时这样做很有帮助。带有 print 语句的 mean() 方法如下所示:

public double mean() { 

    double sum = 0; 

    //For loop for calculating average or mean
    for(int i = 0; i < count; i++){
        sum += (scores[i]);    
    }

    // print statements for debugging
    System.out.println("count is " + count);
    System.out.println("sum is " + sum);

    double average = sum / count;  
    return average;
} 

【讨论】:

    【解决方案2】:

    因为通过调试很容易找到解决方案,所以我只给你一个提示:

    3、4 和 5 的 mean 是 4:(3+4+5)/3,而不是 (3+4+5)/(n*3),其中 n 是一个正整数。

    如果您查看平均值和标准差并将其除以预期结果,您会看到它是一个四舍五入的数字。

    一旦你找到了 1 个问题的解决方案,你就会立即知道为什么其他结果也是错误的 =)

    【讨论】:

      猜你喜欢
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 2021-04-15
      • 2020-09-03
      • 2020-07-09
      • 2019-10-25
      • 2016-11-01
      相关资源
      最近更新 更多