3

如果您能为我的 Java 课作业提供一些帮助,我将不胜感激。问题的提示是:

编写一个程序来读取一个非负整数列表并显示最大整数、最小整数和所有整数的平均值。用户通过输入一个不用于查找最大值、最小值和平均值的负标记值来指示输入的结束。平均值应该是 double 类型的值,以便用小数部分计算。

我的代码遇到的问题是,在运行时,循环不会完成,除非输入的第一个值是负数,在这种情况下它会返回:

输入的最大数字是:0 输入的最小数字是:0 输入数字的平均值是:NaN

请帮忙!谢谢。-山姆

代码:

package blah;
import java.util.Scanner;
public class blahblah
{
    public static void main(String[] args) 
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println ("Please enter a list of positive integers.");
        System.out.println ("Please enter a negative integer when finished.");

        int in = 0;
        int max = 0;
        int min = 0;
        int sum = 0;
        int count = 0;
        in = keyboard.nextInt();

        while (in>=0)
        {
            if (in > max) {
                in = max;
            }
            if (in < min) {
                in = min;
            }
            sum += in;
            count++;
            if (in < 0) {
                 break;
            }
        }

        System.out.println("The maximum number entered was: " + max);
        System.out.println("The minimum number entered was: " + min);
        System.out.println("The average of the numbers entered was: " + (double)sum/count);
    }
}
4

7 回答 7

3

您需要在循环内再次读取 nextInt :

while (in>=0)
{
    if (in>max){
        max=in;
    }
    if (in<min){
        min=in;
    }
    sum += in;
    count++;
    in = keyboard.nextInt();
    //Check not needed here, handled by while loop
    //if (in<0){
    //     break;
    //}
}

从评论中编辑:您的分配方向错误,因此您将输入设置为最小值/最大值,而不是设置最小值/最大值等于输入

于 2013-03-28T20:58:28.373 回答
1

将输入的读取移动到循环内,并在负数处中断:

while (true) {
    in = keyboard.nextInt();
    if (in < 0) break;
    // rest of loop
}

更好的方法是使用for循环,它很好地捆绑了所有与循环相关的逻辑:

for (int in = keyboard.nextInt(); in >= 0; in = keyboard.nextInt()) {
    // your current loop code
}

分离出迭代代码可以清楚哪些代码是迭代代码,让循环代码完全专注于程序的任务,从而更容易阅读和理解

这也意味着您不需要声明int in,并且尽可能减少变量的范围是一种很好的做法 - 在这种情况下in,它只存在于循环中,这是唯一使用/需要它的地方。

于 2013-03-28T20:58:36.140 回答
1

您读取值的语句不在 while 循环内,因此它仅读取第一个条目:

in = keyboard.nextInt ();
while (in>=0)
{

}

改成:

in = keyboard.nextInt ();
while (in>=0)
{
   ... stuff ...
in = keyboard.nextInt ();
}
于 2013-03-28T21:01:48.890 回答
0

您必须重新读取用户的输入。代替:

in = keyboard.nextInt ();
while (in>=0) {
    if (in>max){
       in=max;
    }
    if (in<min){
        in=min;
    }

    sum += in;
    count++;
    if (in<0){
         break;
    }
}

利用:

in = keyboard.nextInt ();
while (in>=0) {
    if (in>max){
        in=max;
    }
    if (in<min){
        in=min;
    }

    sum += in;
    count++;

    // removed if, since loop checks it.

    in = keyboard.nextInt (); // read on!
}
于 2013-03-28T20:58:34.280 回答
0

将您的代码更改为

in = keyboard.nextInt ();
while (in>=0){
    if (in>max){
        in=max;
    }

    if (in<min){
        in=min;
    }

    sum += in;
    count++;
    in = keyboard.nextInt ();
}

如您所见,我已添加in = keyboard.nextInt ();以从用户那里获得更多价值

于 2013-03-28T20:59:26.267 回答
0

您将值放在同一个变量“in”中

在=最大值;

应该是其他方式

最大=在;

于 2013-03-28T21:11:07.377 回答
0
Scanner input =new Scanner(System.in);
double a= 0;
int i=0;
double sum=0;
double average=0;
double smallest=0;
double largest=0;
double range=0;

while(a>=0){
    System.out.print("Enter the value : ");
    a=input.nextDouble();
    if(a<0){
    break;
}
i++;
sum+=a;
average=sum/i;
if(smallest==0){
    smallest=a;
}
if(smallest>a){
    smallest=a;
}

if(largest<a){
    largest=a;
}

range=largest-smallest;


}
System.out.print("\n The average of all the values is : "+average);
System.out.print("\n The smallest of the values is : "+smallest);
System.out.print("\n The largest of the values is : "+largest);
System.out.print("\n The range of the values is : "+range);
于 2020-04-18T16:48:09.817 回答