在我的代码中,我试图从用户输入的数字序列中找到序列的平均值,最大数和最小数。我的问题是我不知道如何编写代码,因此当用户键入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);
}
}
答案 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风格,这只是一个想法。
List<Integer>
的用户中收集所有整数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