Java 为什么赢了';在计算平均值时,程序是否包括用户的第一次输入?

Java 为什么赢了';在计算平均值时,程序是否包括用户的第一次输入?,java,if-statement,do-while,Java,If Statement,Do While,如果用户输入的第一个值为-1,则此代码的平均值为-1。如果输入的值不是-1,则它将计算给定值的平均值,当输入值-1时,它将停止,并将成为程序的停止信号。任务是修改现有的DoWhile循环-我已经完成了 现在,在编写了代码之后,我似乎无法理解为什么程序不包含用户的第一个输入,以计算平均值 Scanner input = new Scanner(System.in); float grade; float sumGrades, average; int studentCount = 0; sumG

如果用户输入的第一个值为-1,则此代码的平均值为-1。如果输入的值不是-1,则它将计算给定值的平均值,当输入值-1时,它将停止,并将成为程序的停止信号。任务是修改现有的DoWhile循环-我已经完成了

现在,在编写了代码之后,我似乎无法理解为什么程序不包含用户的第一个输入,以计算平均值

Scanner input = new Scanner(System.in);

float grade;
float sumGrades, average;
int studentCount = 0;
sumGrades = 0;

final int STOP = -1;

System.out.printf("\nEnter a grade (%d to finish): ", STOP);
grade = input.nextFloat();
if(grade == STOP)
{
      sumGrades = sumGrades + grade;
      studentCount++;
}
else
    do
    {
    System.out.printf("\nEnter a grade (%d to finish): ", STOP);
    grade = input.nextFloat();

    if(grade != STOP)
      {
      sumGrades = sumGrades + grade;
      studentCount++;
      }
    } while(grade != STOP);

average = sumGrades / studentCount;
System.out.printf("The average obtained is %.1f\n", average);
输出:

Enter a grade (-1 to finish): 2

Enter a grade (-1 to finish): 3

Enter a grade (-1 to finish): 4

Enter a grade (-1 to finish): 5

Enter a grade (-1 to finish): 2

Enter a grade (-1 to finish): 3

Enter a grade (-1 to finish): -1

The average obtained is 3.4
产出2:

Enter a grade (-1 to finish): 2

Enter a grade (-1 to finish): -1

The average obtained is NaN


仔细看看你写的东西

System.out.printf("\nEnter a grade (%d to finish): ", STOP);
grade = input.nextFloat();
好的,到目前为止

if(grade == STOP)
{
      sumGrades = sumGrades + grade;
      studentCount++;
}
所以。。。如果等级表示“停止”。。。你把它加到总数上,然后数一数

else
    do
    {
但是如果上一个年级不是终点站。。。你把它扔掉,读下一个年级

    System.out.printf("\nEnter a grade (%d to finish): ", STOP);
    grade = input.nextFloat();
看到问题了吗?

主要问题如下:

   final int STOP = -1;


        System.out.printf("\nEnter a grade (%d to finish): ", STOP);
      grade = input.nextFloat(); 
if(grade == STOP)
{
      sumGrades = sumGrades + grade;
      studentCount++;
}
在这里,您阅读输入,只需检查输入是否停止,如果输入未停止,则不执行任何操作 下一个

您再次读取输入,然后处理它,如果不停止,您将丢失第一个输入

一个周期的解决方案:

do
    {
    System.out.printf("\nEnter a grade (%d to finish): ", STOP);
    grade = input.nextFloat();
        if(grade != STOP)
          {
            sumGrades = sumGrades + grade;
            studentCount++;
          }

      } while(grade != STOP);

请不要添加图像,而是复制您的代码。如果太长,则应将其简化为一个示例。在将
平均值
格式化为
%.1f
之前,请调试并查看平均值的值。
如果(grade==STOP)
仅当它等于
停止
时才添加第一个数字。你为什么要在
do while
之前要求分数?即使平均值的格式不是%.1f,它仍然输出错误的平均值。如果第一次输入是-1,代码必须输出-1的平均值。这就是添加第一个if语句的原因。如果没有第一个if语句,一旦它输入DOWLE,它将输出获得的平均值为NaN,如果输入值为-1。好的,我理解。非常感谢。在修复代码时,您是否有任何可能的建议,以便它不会丢失第一个输入,但如果是第一个输入,仍然输出-1?简单的修复方法是移动第二个
grade=input.nextFloat()就在
}之前,而(等级!=停止)当然还有其他解决方案:)我明白,你们只能在一个周期内完成。非常感谢。好的,我明白了。非常感谢。在修复代码时,您是否有任何可能的建议,以便它不会丢失第一个输入,但如果是第一个输入,仍然输出-1?
do
    {
    System.out.printf("\nEnter a grade (%d to finish): ", STOP);
    grade = input.nextFloat();
        if(grade != STOP)
          {
            sumGrades = sumGrades + grade;
            studentCount++;
          }

      } while(grade != STOP);