有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java计算数组的平均值

这是一个代码,用于获取用户输入的分数,查找其平均值、偏差,并以表格样式显示此信息。我的程序接受用户输入并很好地显示信息,但它无法正确计算平均值和偏差。运行时,它表示平均值为0。我也这么做为什么我的老师教我们,但我找不到我的错误

import java.util.Scanner;

public class ClassScores{
public static void main(String[] args){
String[] names = {"Bashful","Doc","Dopey","Grumpy","Happy","Sleepy","Sneezy"};
double[] grades = new double[7];
double mean=0;
double[] difference = new double[7];

getScores(grades);
average(grades, mean);
deviation(grades,mean,difference);
displayResults(names, grades, difference, mean);
} 



public static double[] getScores(double[] grades)
{
Scanner kb= new Scanner(System.in);
System.out.println("Enter grades for students in alphabetical order.");
for (int i=0;i<grades.length; i++)
{
    grades[i]=kb.nextDouble();
}
return grades;  
}

public static double average(double[] grades, double mean)
{
double total = 0;
for (double i : grades)
{
    total += i;
}
if (grades.length>0)
{
    mean = total/grades.length;
}
return mean;
}

public static double[] deviation(double[] grades, double mean, double[] difference)
{
for (int i=0; i<grades.length; i++)
{
    difference[i]=grades[i]-mean;
}
return difference;
}

public static void displayResults(String[] names, double[] grades, double[] difference, double mean)
{
System.out.println("The average score is" +mean);
System.out.println("Student Name   Grade    Mean Deviation");

for (int i=0; i<names.length; i++)
{
    System.out.printf(names[i]);
    System.out.printf("%20f", grades[i]);
    System.out.printf("%20f", difference[i]);
    System.out.println();
}

}   

}

这是为好奇的人编辑的代码

导入java。util。扫描仪

public class ClassScores{
public static void main(String[] args){
String[] names = {"Bashful","Doc","Dopey","Grumpy","Happy","Sleepy","Sneezy"};
double[] grades = new double[7];
double mean=0;
double[] difference = new double[7];

getScores(grades);
mean = average(grades);
deviation(grades,mean,difference);
displayResults(names, grades, difference, mean);
}



public static double[] getScores(double[] grades)
{
Scanner kb= new Scanner(System.in);
System.out.println("Enter grades for students in alphabetical order.");
for (int i=0;i<grades.length; i++)
{
    grades[i]=kb.nextDouble();
}
return grades;  
}

public static double average(double[] grades)
{
double total = 0;
for (double i : grades)
{
    total += i;
}
return total/(grades.length);
}

public static double[] deviation(double[] grades, double mean, double[] difference)
{
for (int i=0; i<grades.length; i++)
{
    difference[i]=grades[i]-mean;
}
return difference;
}

public static void displayResults(String[] names, double[] grades, double[] difference, double mean)
{
System.out.println("The average score is" +mean);
System.out.println("Student Name   Grade    Mean Deviation");

for (int i=0; i<names.length; i++)
{
    System.out.printf(names[i]);
    System.out.printf("%20f", grades[i]);
    System.out.printf("%20f", difference[i]);
    System.out.println();
}

}   

}

共 (5) 个答案

  1. # 1 楼答案

    实际上,您从未使用过average方法的返回结果。您可能打算将其传递给displayResults,或者在main()方法中将其分配给mean

  2. # 2 楼答案

    首先,你的平均方法应该更像这样:

    public static double average(double[] grades)
    {
        // Error check up front.
        if (grades.length == 0) { 
            throw new InvalidArgumentException("length is 0");
        }
    
        // These next lines are good.
        double total = 0;
        for (double i : grades)
        {
            total += i;
        }
    
        // Then you can just divide and return.
        return total / (grades.length);
    }
    

    没有理由将mean参数传递给average方法。这就像将Dog传递给createDog方法一样

    但更重要的是,当您调用average时,您不会将结果存储在任何地方。你只是忽视了它

    如果您来自一个有指针的背景,请记住Java通过值传递原语——在方法内部更改mean,即double,将不会影响方法外部的值。相反,你有

    double mean = average(grades);
    

    因此mean为零的根本原因是您将其设置为零,并且从不更改它:

    double mean = 0;
    
  3. # 3 楼答案

    您已声明此方法以返回一个值:

    public static double average(double[] grades, double mean)
    

    但在main方法中,不使用返回的结果。然后打印出 另一个“平均值”变量的值,该变量是该函数的全局变量,且赋值为0

    double mean=0;
    double[] difference = new double[7];
    
    getScores(grades);
    **average(grades, mean);**
    deviation(grades,mean,difference);
    displayResults(names, grades, difference, mean);
    

    我想你想要:

    getScores(grades);
    **mean = average(grades, mean);**
    deviation(grades,mean,difference);
    displayResults(names, grades, difference, mean);
    
  4. # 4 楼答案

    您正在返回mean值,但没有将方法调用average的结果赋值给任何对象。您想要的是将方法的结果分配给变量:

    mean = average(grades);
    

    average方法中,不需要将mean作为参数,只需在本地声明并返回它

  5. # 5 楼答案

    average(grades, mean);将变量的副本发送到average()方法。尽管名称相同,但average()内的mean变量与main()内的mean变量无关。要解决此问题,您需要执行以下操作

    mean = average(grades, mean);
    

    我还建议您删除mean参数,并在average()内声明一个局部变量。那你就做吧

    mean = average(grades);