小功能的Java标准代码也不容易

/** 任务:从键盘上输入一个人的体重(公斤)和身高(米),计算BMI指数并输出体重状态 体重指标(Body Mass Index)= 体重 / 身高的平方(kg/m2) BMI < 18.5 :偏瘦 BMI < 24:正常 BMI < 27:偏胖 BMI < 30:肥胖 BMI >= 30:重度肥胖 */

自己写的代码

import java.util.Scanner;

class Bmi { private double weight; private double height; private double bmi; private String fat;

text
复制代码
public Bmi(){} public Bmi(double weight, double height){ this.weight = weight; this.height = height; } public void getInfo(){ System.out.println("您的体重是:" + this.weight + " kg,您的身高是:" + this.height + " cm"); } public void setWeight(double weight){ this.weight = weight; } public void setHeight(double height){ this.height = height; } public double getWeight(){ return this.weight; } public double getHeight(){ return this.height; } public double getBmi(){ bmi = weight / ((height / 100) * (height / 100)); return this.bmi; } public String getFat(){ if (bmi < 18.5) {this.fat = "偏瘦";} if (bmi < 24 && bmi > 18.5) {this.fat = "正常";} if (bmi < 27 && bmi > 24) { this.fat = "偏胖";} if (bmi < 30 && bmi > 27) {this.fat = "肥胖";} if (bmi >= 30) { this.fat = "重度肥胖";} return this.fat; }

}

public class Java2026090108 {

text
复制代码
public static void main(String[] args){ Scanner sc = new Scanner(System.in); // 1、接收输入的体重 System.out.print("请输入您的体重(公斤):"); double weight = sc.nextDouble(); // 1、接收输入的身高 System.out.print("请输入您的身高(厘米):"); double height = sc.nextDouble(); Bmi bmi = new Bmi(); bmi.setWeight(weight); bmi.setHeight(height); System.out.println(); System.out.println("===========输入您的体重和身高,输出身体的健康BMI================\n"); // 3、判断BMI bmi.getInfo(); System.out.printf("%n您的BMI指标是:%,.2fkg/m2%n%n",bmi.getBmi()); System.out.printf("您的体型属于:%s%n",bmi.getFat()); }

}

问题

1、空壳对象风险:提供了无参构造器 public Bmi(){},可以创建出 weight=0, height=0 的非法对象 2、边界值黑洞:getFat() 用独立的 if 且条件互斥(如 bmi=18.5 时没有任何条件满足),返回 null 3、getter有副作用:getBmi() 在返回值的同时修改了成员变量 this.bmi 4、调用顺序依赖:getFat() 依赖 getBmi() 先被调用,否则 bmi 为 0.0 5、无参构造器绕过了校验:main 里用 new Bmi() + setter 赋值,完全没有参数合法性检查 6、Scanner未关闭:sc.close() 缺失 7、魔法数字:18.5、24、27、30 直接硬编码在方法里 8、注释与代码单位不一致:注释写"身高(米)",实际按厘米处理(height / 100)

Kimi帮助下写的代码

`import java.util.Scanner;

class BMI { private static final double THIN = 18.5; // BMI阈值 private static final double NORMAL = 24; // BMI阈值 private static final double OVERWEIGHT = 27; // BMI阈值 private static final double OBESE = 30; // BMI阈值

text
复制代码
private final double weight; // 体重,公斤 private final double height; // 身高,厘米 public BMI(double weight, double height) { if (weight <= 0 || height <= 0) { throw new IllegalArgumentException("体重和身高必须大于 0"); } this.weight = weight; this.height = height; } @Override public String toString() { return String.format("您的体重是:%.2f kg,身高:%.2f cm", weight, height); } public double getWeight() { return this.weight; } public double getHeight() { return this.height; } public double getBMI() { return weight / Math.pow((height / 100), 2); } public String getBMIStatus() { double bmi = getBMI(); if (bmi < THIN) { return "偏瘦"; } else if (bmi < NORMAL) { return "正常"; } else if (bmi < OVERWEIGHT) { return "偏胖"; } else if (bmi < OBESE) { return "肥胖"; } else { return "重度肥胖"; } }

}

public class Java2026090109 {

text
复制代码
public static void main(String[] args) { try (Scanner sc = new Scanner(System.in)) { // 判断输入是否合法? double weight = readPositiveDouble(sc, "请输入您的体重(公斤):"); double height = readPositiveDouble(sc, "请输入您的身高(厘米):"); BMI person = new BMI(weight, height); printResult(person); } catch (IllegalArgumentException e) { System.out.println("!系统错误:" + e.getMessage()); } } private static void printResult(BMI person) { System.out.println("\n-------------------------------------------------------"); System.out.println(person); System.out.println("======================================================="); System.out.printf("%n您的BMI指标是:%.2fkg/m\u00B2%n", person.getBMI()); System.out.printf("您的体型属于:%s%n", person.getBMIStatus()); } // 输入的时候就判断数据的合法性 private static double readPositiveDouble(Scanner sc, String prompt) { while (true) { System.out.print(prompt); String line = sc.nextLine().trim(); // 去除两头的空格 if (line.isEmpty()) { System.out.println(">>>错误!输入不能为空,请输入有效的数字!<<<\n"); continue; } try { double value = Double.parseDouble(line); if (value <= 0) { System.out.println(">>>错误!输入值必须大于 0 !!!请重新输入!<<<\n"); } else { return value; } } catch (NumberFormatException e) { System.out.println(">>>错误:\"" + line + "\"不是有效的数字,请重新输入!<<<\n"); } } }

}`

Kimi改的代码

import java.util.Scanner;

/**

  • BMI 体型分类枚举
  • 每个枚举值持有:中文描述、BMI下限、BMI上限 */

enum BMIStatus { THIN("偏瘦", 0, 18.5), NORMAL("正常", 18.5, 24.0), OVERWEIGHT("偏胖", 24.0, 27.0), OBESE("肥胖", 27.0, 30.0), SEVERELY_OBESE("重度肥胖", 30.0, Double.MAX_VALUE);

text
复制代码
private final String description; // 中文描述 private final double min; // 区间下限(包含) private final double max; // 区间上限(不包含) // 枚举构造器默认就是 private,可以省略 private 关键字 BMIStatus(String description, double min, double max) { this.description = description; this.min = min; this.max = max; } public String getDescription() { return description; } /** * 根据 BMI 值查找对应的分类 */ public static BMIStatus fromBMI(double bmi) { for (BMIStatus status : values()) { if (bmi >= status.min && bmi < status.max) { return status; } } throw new IllegalArgumentException("无法识别的 BMI 值: " + bmi); } @Override public String toString() { return description; }

}

class BMI { private final double weight; private final double height;

text
复制代码
public BMI(double weight, double height) { if (weight <= 0 || height <= 0) { throw new IllegalArgumentException("体重和身高必须大于 0"); } this.weight = weight; this.height = height; } @Override public String toString() { return String.format("体重:%.1f kg,身高:%.1f cm", weight, height); } public double getWeight() { return weight; } public double getHeight() { return height; } public double getBMI() { return weight / Math.pow(height / 100.0, 2); } /** * 返回值从 String 升级为 BMIStatus 枚举 */ public BMIStatus getBMIStatus() { return BMIStatus.fromBMI(getBMI()); }

}

public class Java2026090109 {

text
复制代码
public static void main(String[] args) { try (Scanner sc = new Scanner(System.in)) { double weight = readPositiveDouble(sc, "请输入您的体重(公斤):"); double height = readPositiveDouble(sc, "请输入您的身高(厘米):"); BMI person = new BMI(weight, height); printResult(person); } catch (IllegalArgumentException e) { System.out.println("系统错误:" + e.getMessage()); } } private static void printResult(BMI person) { System.out.println("\n-------------------------------------------------------"); System.out.println(person); System.out.println("======================================================="); System.out.printf("%n您的 BMI 指标是:%.2f kg/m\u00B2%n%n", person.getBMI()); // %s 会自动调用枚举的 toString(),输出中文描述 System.out.printf("您的体型属于:%s%n", person.getBMIStatus()); } private static double readPositiveDouble(Scanner sc, String prompt) { while (true) { System.out.print(prompt); String line = sc.nextLine().trim(); if (line.isEmpty()) { System.out.println(">>> 错误!输入不能为空,请输入有效的数字!"); continue; } try { double value = Double.parseDouble(line); if (value <= 0) { System.out.println(">>> 错误!输入值必须大于 0,请重新输入!"); } else { return value; } } catch (NumberFormatException e) { System.out.println(">>> 错误:\"" + line + "\" 不是有效的数字,请重新输入!"); } } }

}

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
鱼友0258
作者分享
🚩Java D5 1、类和对象(含继承、抽象、接口)是Java的一个里程碑,刷题豆包和Kimi,成绩勉强,还需要复习课件和老视频。虽然答案是对的,但似懂非懂。计划再用7-10天,希望能融会贯通。 2、中国大学MOOC的郑州大学"数据结构和算法"课程用Java需要写算法,有点兴趣。目前的进度还在线性表。 3、以为编程题能通过,以为看视频学到的代码就可以,把写好的学习代码扔给豆包和Kimi找茬,学到了。构造方法实例化和用setter方法赋值的区别,重写toString()方法和自定义showInfo()方法的区别,键盘输入时就检查输入的合法性和业务层增加一层检查数据合法性,nextDouble() + next()和nextLine().trim() + Double.parseDouble()干净处理缓冲区,学习了try-catch 4、学习之路任重道远,万里长征第一步,难难难
3
🚩Java D4 1、豆包刷题:类和对象、继承、向下转型、向上转型、抽象类,编程题基本没问题,不使用VS Code的提词补全工具,除了单词写错,个别遗漏分号。简单java类的构造方法、setter/getter方法已经暂时掌握。 2、看了中国大学MOOC的邯郸学院张延军老师的Java程序设计,综合北京林业大学的java课程,完善了基本数据类型的知识点 3、中国大学MOOC的浙江大学面向对象程序设计Java课程听得有点迷糊,报名浙江大学翁恺老师的"零基础学java",期待开课 4、看了一下广州软件学院的java课程,唯一使用jdk25、spring4.x、mysql8.0的视频 🕛豆包刷题:抽象、接口、基本数据类型
2
🚩Java D3 1、在中国大学MOOC参加了一流课程北京林业大学的Java程序设计课程,就当是复习基础内容。 2、在中国大学MOOC参加了浙江大学的《数据结构和算法》课程,因为看了程杰的《大话数据结构》,就当是强化记忆 3、今天没有刷题,没有看相关书籍。 4、学习了IDEA的使用,如果按照步骤写一个类并有文档注释,VS Code就基本不用敲代码,智能输出。 🕛豆包刷题,牢牢掌握类和对象(包括封装、继承、多态、接口、包装类、向上/向下转型后,再继续后面的学习)
2
🚩Java D2 1、《大话数据结构》全书九章,今天看了第二章"算法"和第三章"线性表"。 2、"掘金"的浓缩Java入门教程,快速了解哈希表、集合、队列、栈、IO、反射、箭头函数、JDBC。 3、李兴华视频:抽象类、继承、方法覆写、多态、Object类、包装类、接口 4、细化鱼皮java路线图的知识点 5、阿里云开发者课程中关于java的课程收藏了一堆 🕛D3:《大话数据结构》的第二章第三章豆包刷题,抽象类、继承、覆写、多态、Object类、包装类、接口豆包刷题
1
🚩Java D1 李兴华视频:数据类型、类和方法、抽象类 韩顺平视频:类 《大话数据结构》数据结构基本概念,算法大O阶 1、照抄鱼皮的后端学习路线思维导图,根据视频的讲解细化知识点。 2、豆包this习题、类及继承习题
3
下载 APP