用于计算均值和偏差的几乎完整代码

时间:2019-01-28 17:15:16

标签: java mean standard-deviation

我只是对如何存储用户输入的数字数组感到困惑。用户可以在数组中输入他们想要的数字,但它本身并不需要输入数字。

import java.util.Scanner;

public class Exercise_0_2 {

public static void main(String[] args) {

Scanner input = new Scanner(System.in);

System.out.print("How many numbers: ");
int n = input.nextInt();

System.out.println("Enter  " + n + " numbers : ");
double[] numbers = new double[n];

//Call and print methods
System.out.println("Mean: " + mean(numbers, n));
System.out.println("Standard Deviation: " + deviation(numbers, n));

}
// Calculate Mean
public static double mean(double[] numbers, int n) {

    double sum = 0;

    for (int i = 0; i < n; i++) {
        sum += numbers[i];
    }
    double mean = sum / n;
    return mean;
    }
    //Calculate deviation from the mean
    public static double deviation(double[] numbers, int n) {

            double mean = mean(numbers, n);
            double sqSum = 0;
            for (int i = 0; i < n; i++) {
                sqSum += numbers[i] * numbers[i];
            }

                double variance = sqSum / n - mean * mean;
                double sd = Math.sqrt(variance);
                return sd;

    }
}

2 个答案:

答案 0 :(得分:1)

让我们从顶部开始解决错误。

    int arr[] = new int[(int) n];

目前n尚未声明,因此您不能在此处使用它。在从扫描仪进行声明并读取arr之后,只需将n的声明移至。另外,请为int输入ndouble毫无意义。

    System.out.println("Mean: " + mean);

如果这应该是对方法mean的调用,则需要像mean(arr)一样在方法名称和必需的参数之后放置方括号。 mean(arr)仍然不起作用,因为arr的类型为int[],而该方法要求的类型为double[]。我不能告诉您这里正确的解决方法是什么,因为我不确定您是要读取方法外还是方法内的数字。在我看来,外面看起来更自然。

    System.out.println("Enter" + n + " numbers: ");

您不能在此处使用变量n,因为它是main方法中的局部变量。再说一次,如果您打算在其他地方读取数字并将填充的数组传递给方法,我不确定您是否需要它。

        array[i] = input.nextDouble();

这里有两个错误:您没有名为array1的数组变量。我不确定您可能是说numbers。而且您不能在此处使用变量input,因为它是main方法中的局部变量(与上述n的问题相同)。要么将其声明为静态字段,要么将其作为参数传递给方法。

deviation方法中的错误类似,因此不再赘述。

由于我知道这对您来说应该是一种练习,所以我不会为您解决它并剥夺您的学习经验。希望您能再走一两步。

编辑

在您的问题编辑中有一些改进。您似乎还没有决定要读取main还是mean中的数字?

    System.out.println("Mean: " + mean(numbers, n));

您的numbers方法中没有声明变量main(下一行存在相同问题)。否则很好。

        sum += a[i];

您可能是指meanSumnumbers?还是您想在sum循环上方声明meanSum而不是for

在上述行之后,缺少右花括号以结束第一个for循环。

    double dqDiff = 0;

简单的错字:您稍后将这个变量称为sqDiff,因此需要在声明中使用相同的拼写。

    return Math.sqrt(mean(number, n));

s上缺少numbers。我不相信这个简单的数学版本是正确的。

请不要指望我再对此代码进行回合。

答案 1 :(得分:0)

我建议您先使用ArrayList而不是array[],在这种情况下,您无需指定数字数量(n),并且可以随意输入任意数量的数字。其次,使用try-catch块停止输入数字并初始化计算。例如:

public class MeanAndDeviation {

public static void main(String[] args) {

    Scanner scn = new Scanner(System.in);

    System.out.println("Enter the numbers then press any letter to calculate Mean and Sd");
    /*Use an ArrayList to freely enter so much numbers as you need*/
    ArrayList <Double> arr = new ArrayList <>();
    /*Use try-catch block to start calculations by entering any letter*/
    try {
        while (scn.hasNext()) {
            double i = scn.nextDouble();
            arr.add(i);
        }
    }
    /*Use catch (Exception e) to catch any type of exceptions*/
    catch (Exception e) {}

    System.out.println(arr + "\nMean: " + mean(arr) + 
            "\nStandard Deviation: " + deviation(arr));
    }

private static double mean(ArrayList<Double> arr) {
    double sum = 0;
    for (int i = 0; i < arr.size(); i++) {
        sum += arr.get(i);}
    double mean = sum/arr.size();
    return mean;       
}

private static double deviation (ArrayList<Double> arr) {
    double sumOfDiff = 0;
    for (int i = 0; i < arr.size(); i++) {
        sumOfDiff += Math.pow(arr.get(i) - mean(arr), 2);
    }
    double deviation = Math.sqrt(sumOfDiff/arr.size());
    return deviation;
}
}