案例解析
基础实现案例
编写一个程序,输入1个整数,如果该整数不是0,则继续输入,直到输入0时为止。查找这一组数中最大的数,并输出最大的数出现的次数。如果输入的第一个数为0,就输出:“Only 0 is inputed”。
# 源文件保存为“FindMaxAndCount.java”
import java.util.Scanner;
public class FindMaxAndCount {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入整数(输入0结束):");
int firstNum = scanner.nextInt();
if (firstNum == 0) {
System.out.println("Only 0 is inputed");
return;
}
int max = firstNum;
int count = 1;
while (true) {
int num = scanner.nextInt();
if (num == 0) {
break;
}
if (num > max) {
max = num;
count = 1;
} else if (num == max) {
count++;
}
}
System.out.println("最大的数是: " + max);
System.out.println("它出现的次数是: " + count);
}
}
运行结果 直接输入数字0
请输入整数(输入0结束):0
Only 0 is inputed
输入一系列数字,以0结束
请输入整数(输入0结束):5
4
5
2
0
最大的数是: 5
它出现的次数是: 2
代码解析:
- 先用Scanner获取第一个输入的数字
- 如果第一个数就是0,直接输出提示信息并结束程序
- 初始化max为第一个数,count初始化为1
- 进入无限循环,不断读取输入的数字
- 遇到0就跳出循环
- 每次遇到比当前max更大的数,就更新max并重置count
- 遇到和max相等的数,count加1
- 最后输出结果
这个程序能正确处理各种情况,包括所有数都相同、第一个数就是最大的、或者后面出现更大的数等情况。
找出最小数及其出现次数
稍微修改一下就能实现找最小数的功能:
# 源文件保存为“FindMinAndCount.java”
import java.util.Scanner;
public class FindMinAndCount {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入整数(输入0结束):");
int firstNum = scanner.nextInt();
if (firstNum == 0) {
System.out.println("Only 0 is inputed");
return;
}
int min = firstNum;
int count = 1;
while (true) {
int num = scanner.nextInt();
if (num == 0) break;
if (num < min) {
min = num;
count = 1;
} else if (num == min) {
count++;
}
}
System.out.println("最小的数是: " + min);
System.out.println("它出现的次数是: " + count);
}
}
直接输入数字0
请输入整数(输入0结束):0
Only 0 is inputed
输入一系列数字,以0结束
请输入整数(输入0结束):1
6
1
0
最小的数是: 1
它出现的次数是: 2
变化之处:
- 把max改成了min
- 比较条件从
>变成了< - 其他逻辑完全一致
同时找出最大和最小数
有时候我们需要同时获取最大和最小值:
# 源文件保存为“FindBoth.java”
import java.util.Scanner;
public class FindBoth {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入整数(输入0结束):");
int firstNum = scanner.nextInt();
if (firstNum == 0) {
System.out.println("Only 0 is inputed");
return;
}
int max = firstNum;
int min = firstNum;
int maxCount = 1;
int minCount = 1;
while (true) {
int num = scanner.nextInt();
if (num == 0) break;
if (num > max) {
max = num;
maxCount = 1;
} else if (num == max) {
maxCount++;
}
if (num < min) {
min = num;
minCount = 1;
} else if (num == min) {
minCount++;
}
}
System.out.println("最大的数是: " + max + ",出现次数: " + maxCount);
System.out.println("最小的数是: " + min + ",出现次数: " + minCount);
}
}
运行结果 直接输入数字0
请输入整数(输入0结束):0
Only 0 is inputed
输入一系列数字,以0结束
请输入整数(输入0结束):5
8
4
8
4
4
0
最大的数是: 8,出现次数: 2
最小的数是: 4,出现次数: 3
改进点:
- 同时维护max和min两个变量
- 分别统计它们的出现次数
- 每次输入都要同时更新两套逻辑
使用数组存储后再处理
有时候我们需要保留所有输入数据,可以先用数组存储:
# 源文件保存为“ArrayVersion.java”
import java.util.ArrayList;
import java.util.Scanner;
public class ArrayVersion {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
ArrayList<Integer> numbers = new ArrayList<>();
System.out.print("请输入整数(输入0结束):");
while (true) {
int num = scanner.nextInt();
if (num == 0) break;
numbers.add(num);
}
if (numbers.isEmpty()) {
System.out.println("Only 0 is inputed");
return;
}
int max = numbers.get(0);
int count = 1;
for (int i = 1; i < numbers.size(); i++) {
int num = numbers.get(i);
if (num > max) {
max = num;
count = 1;
} else if (num == max) {
count++;
}
}
System.out.println("最大的数是: " + max);
System.out.println("它出现的次数是: " + count);
}
}
运行结果 直接输入数字0
请输入整数(输入0结束):0
Only 0 is inputed
输入一系列数字,以0结束
请输入整数(输入0结束):5
4
5
2
0
最大的数是: 5
它出现的次数是: 2
特点:
- 使用ArrayList动态存储所有输入
- 处理完输入后再进行计算
- 适合需要多次处理同一组数据的情况
实践练习题
处理负数情况
修改程序,使其能够正确处理所有负数输入的情况。
参考代码:
# 源文件保存为“NegativeNumbers.java”
import java.util.Scanner;
public class NegativeNumbers {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入整数(输入0结束):");
int firstNum = scanner.nextInt();
if (firstNum == 0) {
System.out.println("Only 0 is inputed");
return;
}
int max = firstNum;
int count = 1;
while (true) {
int num = scanner.nextInt();
if (num == 0) break;
if (num > max) {
max = num;
count = 1;
} else if (num == max) {
count++;
}
}
System.out.println("最大的数是: " + max);
System.out.println("它出现的次数是: " + count);
}
}
运行结果 直接输入数字0
请输入整数(输入0结束):0
Only 0 is inputed
输入一系列数字,以0结束
请输入整数(输入0结束):1
-1
1
-1
0
最大的数是: 1
它出现的次数是: 2
说明:
实际上原来的代码已经能正确处理负数了,因为比较逻辑num > max对负数同样适用。这个练习主要是让同学们思考验证一下。
找出第二大的数
修改程序,使其能够找出第二大的数及其出现次数。
参考代码:
# 源文件保存为“SecondLargest.java”
import java.util.Scanner;
public class SecondLargest {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入整数(输入0结束):");
int firstNum = scanner.nextInt();
if (firstNum == 0) {
System.out.println("Only 0 is inputed");
return;
}
int max = firstNum;
int secondMax = Integer.MIN_VALUE;
int maxCount = 1;
int secondMaxCount = 0;
while (true) {
int num = scanner.nextInt();
if (num == 0) break;
if (num > max) {
secondMax = max;
secondMaxCount = maxCount;
max = num;
maxCount = 1;
} else if (num == max) {
maxCount++;
} else if (num > secondMax) {
secondMax = num;
secondMaxCount = 1;
} else if (num == secondMax) {
secondMaxCount++;
}
}
if (secondMaxCount == 0) {
System.out.println("没有第二大的数");
} else {
System.out.println("第二大的数是: " + secondMax);
System.out.println("它出现的次数是: " + secondMaxCount);
}
}
}
运行结果 直接输入数字0
请输入整数(输入0结束):0
Only 0 is inputed
输入一系列数字,以0结束
请输入整数(输入0结束):5
8
6
8
4
5
0
第二大的数是: 6
它出现的次数是: 1