Java布尔逻辑实现考勤判定考试资格代码优化求助
现有代码缺陷说明
- 分支逻辑冲突:两个
if判断相互独立,当出勤率达标且无就医原因时,会先后输出允许考试、不允许考试两条矛盾结果 - 输入不符合需求:需求要求就医原因输入
Y/N,当前代码要求输入true/false,和需求要求不符 - 缺少边界校验:未校验总课程数为0、出勤数大于总课程数等非法输入,可能触发运行异常
- 出勤率输出未格式化,默认展示多位小数,可读性差
优化后代码
package A; import java.util.Scanner; public class Practice5 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 输入校验:总课程数 System.out.println("请输入已举办的课程总数:"); int totalClass = scanner.nextInt(); if (totalClass <= 0) { System.out.println("已举办课程总数不能小于等于0"); scanner.close(); return; } // 输入校验:出勤课程数 System.out.println("请输入学生出勤的课程数:"); int attendClass = scanner.nextInt(); if (attendClass < 0 || attendClass > totalClass) { System.out.println("出勤课程数不能小于0,也不能大于已举办的课程总数"); scanner.close(); return; } // 就医原因输入,适配Y/N的需求 System.out.println("学生是否有就医原因?请输入Y(是)或N(否):"); String medicalInput = scanner.next().trim().toUpperCase(); boolean hasMedicalCause = "Y".equals(medicalInput); // 计算出勤率,保留两位小数 double attendanceRate = (double) attendClass / totalClass * 100; String formattedRate = String.format("%.2f", attendanceRate); // 统一判断考试资格:出勤率≥75% 或者 有就医原因,就允许考试 if (attendanceRate >= 75 || hasMedicalCause) { System.out.printf("你具备考试资格,出勤率为%s%%%n", formattedRate); } else { System.out.printf("你不具备考试资格,出勤率为%s%%%n", formattedRate); } scanner.close(); } }
优化点说明
- 合并了判断逻辑,用
||(或)逻辑统一校验考试资格,避免分支冲突 - 就医原因输入适配需求,支持Y/N输入,自动忽略大小写和首尾空格
- 增加了所有输入项的合法性校验,避免非法输入导致的程序异常
- 出勤率格式化保留两位小数,输出更易读
- 变量名改为语义化命名,代码可维护性更高
内容的提问来源于stack exchange,提问作者Harsh Dalal
相关产品推荐
相关产品推荐

