课后习题:第九章

课后习题:第九章

一、题目描述

本次编程练习要求使用Scanner类解析字符串 “数学 87 分,物理 76 分,英语 96 分”,从中提取三科成绩数据,并计算出总成绩与平均成绩,最终输出结果。


二、解题思路

  1. 核心问题分析:题目给出的字符串中混合了中文、数字和标点符号,直接截取或分割会比较麻烦。核心需求是从混杂文本中精准提取出三个整数成绩。
  2. 技术选型:选择使用Scanner类的useDelimiter()方法,通过正则表达式设置分隔符,一次性过滤掉所有非数字字符,直接读取分数。
  3. 步骤拆解
    • 定义原始成绩字符串。
    • 创建Scanner对象并设置分隔符为 “非数字字符”。
    • 依次读取三科成绩并保存到变量中。
    • 计算总成绩和平均成绩。
    • 输出各科成绩、总成绩和平均成绩。

三、完整代码

四、代码逐段解析

  1. 导入类与定义类import java.util.Scanner;导入Scanner工具类,用于文本解析。public class Score定义了程序的主类Score,类名与文件名保持一致。
  2. 主方法入口public static void main(String[] args)是 Java 程序的入口方法,所有代码逻辑都写在这个方法内。
  3. 定义原始字符串String Str = "数学87分,物理76分,英语96分";定义了需要解析的原始成绩字符串。
  4. 创建 Scanner 并设置分隔符Scanner sc = new Scanner(Str).useDelimiter("[^0-9]+");创建Scanner对象,并设置正则分隔符[^0-9]+,该表达式表示 “匹配一个或多个非数字字符”,这样所有文字和标点都会被当作分隔符处理。
  5. 提取成绩数据通过三次sc.nextInt()方法,依次读取并存储数学、物理、英语三科的成绩到变量中。
  6. 计算总成绩与平均分int total = math + physics + english;计算三科成绩的总和。double average = total / 3.0;计算平均成绩,使用3.0而非3,避免整数除法导致的精度丢失。
  7. 输出结果使用System.out.println()输出各科成绩和总成绩,使用System.out.printf()输出平均成绩,确保输出格式清晰易读。
  8. 关闭 Scannersc.close();关闭Scanner对象,释放资源。

    五、心得体会

    这次编程练习让我对Scanner类的应用场景有了更深入的理解。之前我只知道Scanner可以用来读取控制台输入,没想到它还能直接处理字符串,通过自定义分隔符实现高效的文本解析,这让我对 Java 工具类的灵活性有了新的认识。

    一开始我也考虑过用substring()手动截取字符串,但需要反复计算每个数字的位置,不仅代码繁琐,而且一旦字符串格式有细微变化就会出错。而使用Scanner结合正则分隔符的方式,代码变得简洁高效,鲁棒性也更强,只要字符串中包含数字就能正确提取,不用再担心下标计算错误的问题。

    同时,这次练习也让我注意到了浮点数除法的细节。一开始我不小心写成了total / 3,结果平均成绩直接变成了整数,丢失了小数部分。后来改成total / 3.0才得到了正确的浮点数结果,这让我意识到 Java 中整数除法和浮点数除法的区别,以后在处理数值计算时会更加注意精度问题。

    通过这道题,我不仅掌握了Scanner解析字符串的技巧,也体会到了正则表达式在文本处理中的强大作用,为以后处理类似的混杂文本解析问题打下了基础。