【问题标题】:Exclude a value in Java在 Java 中排除一个值
【发布时间】:2015-12-03 13:22:33
【问题描述】:

我的 Java 程序有点卡住了。 用户可以输入任意数量的值,然后键入“999”来获取他们输入的所有值的总和和平均值。

除了输入“999”之外,这一切都有效。 它确实在输入时显示总和和平均值,但它在总和和平均值计算中还包括“999”值。

我很好奇是否有任何方法可以将这个特定值从计算中排除,并仅使用它来退出循环并显示总和和平均输出。

到目前为止,这是我的代码:

import java.util.Scanner;
public class SumAvg {
static Scanner reader = new Scanner(System.in);

public static void main(String[] args) {

    int sum = 0, newNumber = 0, amount = 0;
    double average;

    System.out.println("Enter a number: ");

    do {
        amount++;
        newNumber = reader.nextInt();
        sum = sum + newNumber;
    } while (newNumber != 999);

    average = (sum / amount) * 1.0;
    System.out.printf("Sum: %s %nAverage: %.2f",sum,average);
    }
}

【问题讨论】:

  • if (newNumber != 999) {...}
  • 除非我遗漏了什么,* 1.0 什么都不做。

标签: java sum average


【解决方案1】:

在您获得有效数字之前不要增加金额。除非你有一个有效的数字,否则不要求和。转换为double之前除法,否则为整数除法。

int sum = 0, amount = 0, newNumber;
System.out.println("Enter numbers. Enter 999 to stop:");
while ((newNumber = reader.nextInt()) != 999) {
    sum += newNumber;
    amount++;
}
double average = (double)sum / amount;

NumberFormat numfmt = NumberFormat.getInstance();
numfmt.setMinimumFractionDigits(0);
numfmt.setMaximumFractionDigits(9);
numfmt.setGroupingUsed(true);
System.out.println("Sum: " + numfmt.format(sum));
System.out.println("Average: " + numfmt.format(average));

【讨论】:

    【解决方案2】:

    发生这种情况的原因是您在检查新号码是否是您要排除的号码之前先读取新号码;如果最后条件不再满足,do-while 循环在运行时不会停止,而是会一直等到代码执行完毕。

    所以,一旦你输入数字999

    do {
        amount++;
        newNumber = reader.nextInt(); // reads in 999
        sum = sum + newNumber; // adds it to your sum
        // and after adding it to the sum, it will execute the while
        // condition again, and check if it should repeat the loop.
    } while (newNumber != 999);
    

    因此,可能的解决方案包括重新排序代码:

    newNumber = reader.nextInt();
    while(newNumber != 999){
        amount++;
        sum += newNumber;
        newNumber = reader.nextInt();
    }
    

    因此,在读入每个新数字后,它将跳转到块的顶部并再次检查 while 条件,因此在每个 sum 之前都会进行检查(这是有道理的;检查就在 this 中的 sum 之前代码块,因此应该遵循只有在满足条件后才能进行求和。)

    您还可以在代码的中心添加一个 if 语句,

    do {
        newNumber = reader.nextInt();
        if(newNumber == 999) break;  // if we get 999, break out of the loop completely
        amount++;
        sum = sum + newNumber;
    } while (true);
    

    或者,您甚至可以考虑使用不同的方法来打破循环;例如,等待一个EOF (^D) 字符可以帮助您防止某人实际上想要将数字 999 添加到总数中的问题,方法是等待一个专门设计用于指定某人输入结束的字符。 (所以这也将允许您使用程序无缝读取文件)。

    try {
        while(true){
            newNumber = reader.nextInt();
            amount++;
            sum += newNumber;
        }
    } catch (NoSuchElementException ex){}
    // continue your code here
    

    这将继续执行内部代码,直到 NoSuchElementExceptionEOF 字符引发,当它出现时,它将跳出内部循环。因此,不需要排除任何数字并用作跳出循环的数字。

    编辑:正如 Andreas 指出的那样,最后一个解决方案还将截取无法读取为整数的输入(如“1”、“2”、“3abc”只会和 @987654331 @ 和 2) by reader.nextInt() 无效,将退出循环,就好像输入已经到达末尾一样,因此需要根据您是否期望输出无效来处理。

    【讨论】:

    • 第二个代码块不会增加amount。第三个代码块增加amount 一次太多。第 4 个块永远不会终止,因为 nextInt 不使用换行符。
    • 哦,谢谢 - 我在发布后立即修复了 amounts,我正在查看 .hasNextLine,感谢您指出这一点
    • 感谢您指出这一点,所有代码块现在都应该按预期工作了。
    • 让它有点松懈,因为它会在第一个无效输入时停止,例如1 2 3g 将处理12,然后退出循环而不处理3g,没有错误消息。
    【解决方案3】:

    我想你可以检查一下 newNumber != 999,像这样计算:

       int sum = 0, newNumber = 0, amount = 0;
        double average;
    
        System.out.println("Enter a number: ");
    
        while(reader.hasNext()) {
            newNumber = reader.nextInt();
            if(newNumber != 999) {
                amount++;
                sum = sum + newNumber;
            } else {
                break;
            }
        }
    
        average = (sum / amount) * 1.0;
        System.out.printf("Sum: %s %nAverage: %.2f",sum,average); 
        return;
    

    希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-29
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      相关资源
      最近更新 更多