【问题标题】:computing mean and standard deviation计算平均值和标准差
【发布时间】:2023-05-23 08:51:02
【问题描述】:

创建一个程序,使用户能够输入一个整数 N,然后读取 N 个双精度值,并打印它们的平均值(平均值)和样本标准偏差(它们与平均值的差的平方和的平方根,除以 N - 1)。 到目前为止我有这个代码

import java.util.Scanner;

public class AVGDevi

{

public static void main(String[] args) 
{
    Scanner input = new Scanner(System.in);



    double x;

    double sum = 0;

    double average = 0;

    double dev = 0;

    double var = 0;

    double sqrx = 0;

    int n = 0;

    do 
    { 
        System.out.println("Enter an integer:");
        x = input.nextInt(); 
        if (x == -1)
        {
            break;
        }

        sum += x;
        n++;
        average = sum / n;      
        sqrx += Math.pow(x-average,2);
        var = sqrx / (n-1);
        dev = Math.sqrt(var);


    } while (x<= 0);

    System.out.println("Average: " + average);
    System.out.println("Deviation: " + dev);
  }

}

测试用例:

5
1
2
3
4
5

目前正在获取此输出

Enter an integer:
Average: 5.0
Deviation: NaN

输出应该是

Enter an integer: Enter a number: Enter a number: Enter a number: Enter a number: Enter a number: Average value is: 3.0
The standard deviation is: 1.58

我不是 100% 确定我做错了什么,任何帮助都会很棒 :D !

【问题讨论】:

  • 在循环结束后进行计算。否则,您将除以 0。此外,您还需要查找 int 除法,然后避免这样做。
  • 那么在 if 语句之后?
  • 我试图让它,如果它是一个负数它不计算它或什么的
  • if 语句不是循环。想一想——你正在使用什么循环,它在哪里结束?在用户输入所有数字之前进行计算有什么好处?
  • 感谢您的建议!

标签: java


【解决方案1】:

你可以只使用while循环而不是do-while循环,如下:

public static void main(String[] args) 
{
Scanner input = new Scanner(System.in);




double y=-1;

double sum = 0;

double average = 0;

double dev = 0;

double var = 0;

double sqrx = 0;

int n = 0;


    System.out.println("Enter an integer:");
    y = input.nextInt();
    double z=y;
    int i=0;
    double x[] = new double[(int)z];
    while(y-->0){

   x[i] = input.nextDouble();

    sum += x[i];
   i++;         
    n++;
    average = sum / n;      


    }
    i=0;
    while(z-->0){
        sqrx += Math.pow(x[i]-average,2);
        i++;
    }
 var = sqrx / (n-1);
    dev = Math.sqrt(var);

System.out.println("Average: " + average);
System.out.println("Deviation: " + dev);
  }

【讨论】:

  • 当我尝试使用更多测试用例时出现此错误线程“main”java.util.InputMismatchException中的异常我尝试了这些测试用例3 1.5 2 2.5
  • 这是因为,对于双重扫描,您使用的是input.nextInt() 而不是input.nextDouble()
  • 我仍然收到 java.util.InputMismatchException 我必须提出一个异常吗?
【解决方案2】:

你在 do-while 守卫中使用了x &lt;= 0,所以如果你输入一个正数,它将在第一次迭代后退出。此外,当您输入第一个数字时,您将拥有var = sqrx / (n-1),但对于n=1,您将除以 0。正如 Hovercraft Full Of Eels 建议的那样,我将这些数字添加到向量或 ArrayList 中并进行计算收到所有输入后。

【讨论】: