该程序将计算整数序列的最大值和最小值

时间:2019-07-18 16:58:39

标签: java

在我的代码中,我试图从用户输入的数字序列中找到序列的平均值,最大数和最小数。我的问题是我不知道如何编写代码,因此当用户键入0或负整数来停止并进行计算时。

public class Sequence2
{

    public static void main(String[] args)
    {
        Scanner keyb = new Scanner(System.in);
        int count = 0;
        double sum = 0;
        double avg = 0;
        int n;

        System.out.println("Enter a sequence of positive integers, which will end with either 0 or a negative integer. ");
        int max = keyb.nextInt();
        int min = keyb.nextInt();
        while (keyb.hasNextInt())
        {
            n = keyb.nextInt();
            if (n > max)
            {
                max = n;
            }
            if (n < min)
            {
                min = n;
            }
            count++;
            sum += n;
        }
        System.out.println("The maximum value is: " + max);
        System.out.println("The minimum value is: " + min);
        avg = sum / count;
        System.out.println("Average = " + avg);
    }
}

5 个答案:

答案 0 :(得分:1)

解决此问题的关键是保持状态,保持在 循环之外定义的最小值和最大值。特别是,最小值应该以 maximum 可能的整数值作为种子,最大值可以以零作为种子。

public static void main(String[] args) {
    int minimum = Integer.MAX_VALUE;
    int maximum = 0;
    int total = 0;
    int counter = 0;
    Scanner keyb = new Scanner(System.in);

    while (true) {
        int num = keyb.nextInt();
        if (num <= 0) {
            System.out.println("Exiting input loop.");
            break;
        }

        if (num < minimum) {
            minimum = num;
        }
        if (num > maximum) {
            maximum = num;
        }
        total += num;
        ++counter;
    }

System.out.println("minimum: " + minimum);
System.out.println("maximum: " + maximum);
System.out.println("average: " + (total / counter));

我省略了一些内容,例如处理了用户未在扫描仪中输入有效整数的可能性。另外,我假设用户将始终输入至少一个有效整数。如果没有,我们将不得不在最后处理平均算术,以免被零除。

答案 1 :(得分:0)

如果您想使其更具Java-8风格,这只是一个想法。

  1. 首先,您从List<Integer>的用户中收集所有整数
  2. 然后,您计算IntSummaryStatistics并提取最小值,最大值和平均值:
result = list.stream().collect(Collectors.summarizingInt(Integer::intValue));

min = result.getMin();
max = result.getMax();
average = result.getAverage();

答案 2 :(得分:0)

您处在正确的轨道上,但是您无需在代码顶部预先声明变量avg,因为该变量只是在末尾计算得出的。

对于循环退出条件,当输入小于或等于零时,使用if语句中断while循环:

import java.util.Scanner;

public class Sequence2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int count = 0, overallMax = 0, overallMin = Integer.MAX_VALUE;
        double sum = 0;
        System.out.println("Enter a sequence of positive integers, which will end with either 0 or a negative integer. ");

        while (scanner.hasNext()) {
            if (scanner.hasNextInt()) {
                int num = scanner.nextInt();
                if (num <= 0) {
                    scanner.close();
                    break;
                }
                overallMax = Math.max(overallMax, num);
                overallMin = Math.min(overallMin, num);
                count++;
                sum += num;
            } else {
                System.out.println("ERROR: Invalid Input. Enter a integer!");
                scanner.next();
            }
        }

        System.out.println("The maximum value is: " + overallMax);
        System.out.println("The minimum value is: " + overallMin);
        double avg = sum / count;
        System.out.println("Average: " + avg);
    }
}

用法示例:

Enter a sequence of positive integers, which will end with either 0 or a negative integer.
4
a
ERROR: Invalid Input. Enter a integer!
2
6
-1
The maximum value is: 6
The minimum value is: 2
Average: 4.0

答案 3 :(得分:0)

有几种方法可以做到这一点。如果我们希望对现有代码进行最小的更改,那么我想说,最简单的选择是添加一个布尔标志,指示是否继续循环:

在while循环之前

boolean userWantsToQuit = false;

这应该是您的循环条件:

while (keyb.hasNextInt() && !userWantsToQuit)

然后在while循环中,您需要在其他if语句之前添加此if语句

if(n<=0){userWantsToQuit=true}

您可能还希望将其他if语句切换为此条件附加的else if语句-否则,您始终会得到0或以前退出的负数作为输入的最低数。

您也可以使用break语句代替布尔标志-这是个人喜好问题。总是被告知要避免由于某些原因而导致break语句,因此我通常使用标志,但这两种方法都是有效的方法。

这不是最惯用的解决方案,但是它是最相似地遵循您已经设置的模式的解决方案。

答案 4 :(得分:0)

这个想法是使用while循环检查每个输入是否小于/等于0。

0