【问题标题】:Almost complete code for calculating mean and deviation计算均值和偏差的几乎完整代码
【发布时间】:2019-06-21 18:11:04
【问题描述】:

我只是对如何存储用户输入的数字数组感到困惑。用户可以在数组中输入他们想要多少个数字,但它并不要求自己输入数字。

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;

    }
}

【问题讨论】:

  • 来自帮助中心:寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误以及重现所需的最短代码它在问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅: minimal reproducible example
  • 你没有调用卑鄙的方法
  • 求多少个数 -> 创建数组 -> 求数并添加到数组 -> 以数组为参数调用均值 -> 以数组为参数调用偏差。
  • ...不要忘记:return 声明! (任何非void(返回类型)方法必须返回声明的类型(在任何“逻辑分支”中!(if/else))...或抛出异常;)
  • ..但数学看起来不错! ...这真的是“唯一的语法”

标签: java mean standard-deviation


【解决方案1】:

让我们从头开始检查错误。

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

此时n 尚未声明,因此您不能在此处使用它。只需将arr 的声明移动到从扫描仪声明并读取n 之后。顺便说一下,为n 输入intdouble 说不通。

    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));

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

        sum += a[i];

您可能是指meanSumnumbers?或者您的意思是在for 循环上方声明sum 而不是meanSum

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

    double dqDiff = 0;

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

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

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

请不要指望我对这段代码进行更多轮次。

【讨论】:

    【解决方案2】:

    我可以建议首先使用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;
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 2020-07-27
      • 2013-09-06
      • 2012-02-17
      • 1970-01-01
      • 2022-06-27
      • 1970-01-01
      相关资源
      最近更新 更多