一、题目描述
本次编程练习要求使用Scanner类解析字符串 “数学 87 分,物理 76 分,英语 96 分”,从中提取三科成绩数据,并计算出总成绩与平均成绩,最终输出结果。
二、解题思路
- 核心问题分析:题目给出的字符串中混合了中文、数字和标点符号,直接截取或分割会比较麻烦。核心需求是从混杂文本中精准提取出三个整数成绩。
- 技术选型:选择使用
Scanner类的useDelimiter()方法,通过正则表达式设置分隔符,一次性过滤掉所有非数字字符,直接读取分数。 - 步骤拆解:
- 定义原始成绩字符串。
- 创建
Scanner对象并设置分隔符为 “非数字字符”。 - 依次读取三科成绩并保存到变量中。
- 计算总成绩和平均成绩。
- 输出各科成绩、总成绩和平均成绩。
三、完整代码![]()
![]()
四、代码逐段解析
- 导入类与定义类
import java.util.Scanner;导入Scanner工具类,用于文本解析。public class Score定义了程序的主类Score,类名与文件名保持一致。 - 主方法入口
public static void main(String[] args)是 Java 程序的入口方法,所有代码逻辑都写在这个方法内。 - 定义原始字符串
String Str = "数学87分,物理76分,英语96分";定义了需要解析的原始成绩字符串。 - 创建 Scanner 并设置分隔符
Scanner sc = new Scanner(Str).useDelimiter("[^0-9]+");创建Scanner对象,并设置正则分隔符[^0-9]+,该表达式表示 “匹配一个或多个非数字字符”,这样所有文字和标点都会被当作分隔符处理。 - 提取成绩数据通过三次
sc.nextInt()方法,依次读取并存储数学、物理、英语三科的成绩到变量中。 - 计算总成绩与平均分
int total = math + physics + english;计算三科成绩的总和。double average = total / 3.0;计算平均成绩,使用3.0而非3,避免整数除法导致的精度丢失。 - 输出结果使用
System.out.println()输出各科成绩和总成绩,使用System.out.printf()输出平均成绩,确保输出格式清晰易读。 - 关闭 Scanner
sc.close();关闭Scanner对象,释放资源。五、心得体会
这次编程练习让我对
Scanner类的应用场景有了更深入的理解。之前我只知道Scanner可以用来读取控制台输入,没想到它还能直接处理字符串,通过自定义分隔符实现高效的文本解析,这让我对 Java 工具类的灵活性有了新的认识。一开始我也考虑过用
substring()手动截取字符串,但需要反复计算每个数字的位置,不仅代码繁琐,而且一旦字符串格式有细微变化就会出错。而使用Scanner结合正则分隔符的方式,代码变得简洁高效,鲁棒性也更强,只要字符串中包含数字就能正确提取,不用再担心下标计算错误的问题。同时,这次练习也让我注意到了浮点数除法的细节。一开始我不小心写成了
total / 3,结果平均成绩直接变成了整数,丢失了小数部分。后来改成total / 3.0才得到了正确的浮点数结果,这让我意识到 Java 中整数除法和浮点数除法的区别,以后在处理数值计算时会更加注意精度问题。通过这道题,我不仅掌握了
Scanner解析字符串的技巧,也体会到了正则表达式在文本处理中的强大作用,为以后处理类似的混杂文本解析问题打下了基础。