Java练手小项目——BMI计算器
最近有一個減肥的朋友想要知道自己的BMI是多少,問我能不能給他做一個計算BMI的工具(無中生友)。于是用Java簡單寫了一個。一起來看看吧。
身體質量指數是BMI指數(身體質量指數,簡稱體質指數),是目前國際上常用的衡量人體胖瘦程度以及是否健康的一個標準。
計算公式為:BMI=體重(千克)除以身高(米)的平方。
為了方便使用我把整個小項目整合成了一個文件,復制到記事本里可以直接運行。
import java.io.*; /*** 本程序實現簡單的BMI計算器。* |-實現了用戶鍵盤輸入數據;* |-實現了BMI保留一位小數點* |-實現了Java標準輸出到文件* |-實現了工廠設計模式,減少耦合* |-添加了對異常的處理* @author chuchu**/ public class Test {public static void main(String[] args) {new Menu();} }class Menu {private Person per = null;private BMIService bs = null;private double BMI = 0.0;private PrintUtil out = null;public Menu() {this.show();}public void show() {System.out.println("***歡迎使用BMI計算器,請輸入相關信息***");String name = InputUtil.getInfo("請輸入姓名:");int age = Integer.parseInt(InputUtil.getInfo("請輸入年齡:"));double height = Double.parseDouble(InputUtil.getInfo("請輸入身高(米):"));double weight = Double.parseDouble(InputUtil.getInfo("請輸入體重(kg):"));bs = Factory.getInstance();double b = bs.getBMI(height, weight);BMI = Math.round(b * 100) / 100;String Evl = bs.getEvaluate(BMI);per = new Person(name, age, height, weight, BMI, Evl);System.out.println("***信息創建成功***");System.out.println("您的BMI為:" + BMI);System.out.println("您的身體狀況:" + Evl);System.out.println("正在將您的文件輸出為文本。。。。");out = Factory.getPrintInstance(per);if (out.print())System.out.println("文件輸出成功,地址為" + out.getPATH());else {System.out.println("文件輸出失敗!");show();}} }class Factory {private Factory() {}public static BMIService getInstance() {return new BMIServiceImpl();}public static PrintUtil getPrintInstance(Person per) {return new PrintUtil(per);} }interface BMIService {public double getBMI(double height, double weight);public String getEvaluate(double BMI); }class BMIServiceImpl implements BMIService {private static final String THIN = "您的體型偏瘦,請增加營養攝入,加強鍛煉!";private static final String NORMAL = "您的體型正常,請繼續保持!";private static final String FATTY = "您已偏胖,請改變不健康的生活習慣,加強鍛煉!";private static final String OBESITY = "您的體型肥胖,相關疾病風險顯著增加!";@Overridepublic double getBMI(double height, double weight) {return weight / (height * height);}@Overridepublic String getEvaluate(double BMI) {if (BMI < 18.5)return THIN;else if (BMI < 24)return NORMAL;else if (BMI < 28)return FATTY;else if (28 < BMI)return OBESITY;elsereturn "數據有誤,請重新輸入相關信息!";}}class InputUtil {private static final BufferedReader BR = new BufferedReader(new InputStreamReader(System.in));private InputUtil() {}public static String getInfo(String promot) {String str = null;boolean flag = true;while (flag) {try {System.out.println(promot);str = BR.readLine();if ("".equals(str) || str == null)System.out.println("輸入的信息不能為空,請檢查后重新輸入!");elseflag = false;} catch (IOException e) {e.printStackTrace();}}return str;} }class PrintUtil {private Person per;public PrintUtil(Person per) {this.per = per;}public boolean print() {OutputStream os = null;try {os = new FileOutputStream(new File("D:" + File.separator + per.getName() + "的評測報告.txt"));os.write(("姓名:" + per.getName() + "\n").getBytes());os.write(("年齡:" + per.getAge() + "\n").getBytes());os.write(("身高:" + per.getHeight() + "\n").getBytes());os.write(("體重:" + per.getWeight() + "\n").getBytes());os.write(("BMI:" + per.getBMI() + "\n").getBytes());os.write(("健康評測:" + per.getEvl() + "\n").getBytes());return true;} catch (Exception e) {e.printStackTrace();return false;} finally {try {os.close();} catch (IOException e) {e.printStackTrace();}}}public String getPATH() {return "D:" + File.separator + per.getName() + "的評測報告.txt";} }class Person {private String name;private int age;private double height; // kgprivate double weight; // mprivate double BMI;private String Evl;public Person(String name, int age, double height, double weight, double bMI, String evl) {this.name = name;this.age = age;this.height = height;this.weight = weight;BMI = bMI;Evl = evl;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}public double getWeight() {return weight;}public void setWeight(double weight) {this.weight = weight;}public void setBMI(double bMI) {BMI = bMI;}public void setEvl(String evl) {Evl = evl;}public double getBMI() {return BMI;}public String getEvl() {return Evl;}}主類設計思路
整個程序的設計思路是通過偽菜單界面的方式提醒用戶一次輸入數據,計算出來結果之后將其返回,并利用Java的輸入輸出流保存文件到特定的位置。既然是偽菜單界面,那么必不可少的就是寫一個Menu類來作為整個程序的入口。
public class Test {public static void main(String[] args) {new Menu();} }class Menu {private Person per = null;private BMIService bs = null;private double BMI = 0.0;private PrintUtil out = null;public Menu() {this.show();}public void show() {System.out.println("***歡迎使用BMI計算器,請輸入相關信息***");String name = InputUtil.getInfo("請輸入姓名:");int age = Integer.parseInt(InputUtil.getInfo("請輸入年齡:"));double height = Double.parseDouble(InputUtil.getInfo("請輸入身高(米):"));double weight = Double.parseDouble(InputUtil.getInfo("請輸入體重(kg):"));bs = Factory.getInstance();double b = bs.getBMI(height, weight);BMI = Math.round(b * 100) / 100;String Evl = bs.getEvaluate(BMI);per = new Person(name, age, height, weight, BMI, Evl);System.out.println("***信息創建成功***");System.out.println("您的BMI為:" + BMI);System.out.println("您的身體狀況:" + Evl);System.out.println("正在將您的文件輸出為文本。。。。");out = Factory.getPrintInstance(per);if (out.print())System.out.println("文件輸出成功,地址為" + out.getPATH());else {System.out.println("文件輸出失敗!");show();}} }主方法非常簡單,就是一句話,生成一個匿名的Menu類對象,調用Menu無參構造方法。然后依次顯示提示語句。
輸入流輸出流設計
既然要引導依次輸入不同的數據,那么就想到我們可以使用System.in實現鍵盤輸入。每次要輸入的內容又不同,我們可以將提示信息作為一個字符串傳入到輸入方法中,并將獲取到的數據返回。
而輸出流,本來計劃要用Hutool的jar包,里面封裝了非常好用的輸出Map對象的方法。但是考慮到要將整個程序打包成一個文件發給我的朋友,還是決定自己寫。于是,我將Person類對象作為一個參數傳入到輸出工具類之中。這個設計其實不好,因為工具類應該是私有構造的,通過調用不同的靜態方法執行相應的功能,Person類對象應該作為參數傳入到print()方法中,而不是作為類的私有屬性以構造方法參數的形式傳入。但是當時寫的時候犯困就胡亂寫成這個樣子。
接口與服務類設計
其實對于計算一個BMI這種簡單到只要一行return語句的業務來說,只需要在Person類之中的getBMI()方法的返回值寫就可以解決。但是還是想按照標準的流程來進行開發,于是將其專門寫了一個接口和接口實現類。在獲取健康評價環節,我將幾個要返回的評價設置成了常量,放在程序最上邊,方便日后的修改。
class Factory {private Factory() {}public static BMIService getInstance() {return new BMIServiceImpl();}public static PrintUtil getPrintInstance(Person per) {return new PrintUtil(per);} }interface BMIService {public double getBMI(double height, double weight);public String getEvaluate(double BMI); }class BMIServiceImpl implements BMIService {private static final String THIN = "您的體型偏瘦,請增加營養攝入,加強鍛煉!";private static final String NORMAL = "您的體型正常,請繼續保持!";private static final String FATTY = "您已偏胖,請改變不健康的生活習慣,加強鍛煉!";private static final String OBESITY = "您的體型肥胖,相關疾病風險顯著增加!";@Overridepublic double getBMI(double height, double weight) {return weight / (height * height);}@Overridepublic String getEvaluate(double BMI) {if (BMI < 18.5)return THIN;else if (BMI < 24)return NORMAL;else if (BMI < 28)return FATTY;else if (28 < BMI)return OBESITY;elsereturn "數據有誤,請重新輸入相關信息!";}}實體類
這里其實就沒什么好說的了,就是最簡單的簡單Java類,實現構造,getter,setter方法。
class Person {private String name;private int age;private double height; // kgprivate double weight; // mprivate double BMI;private String Evl;public Person(String name, int age, double height, double weight, double bMI, String evl) {this.name = name;this.age = age;this.height = height;this.weight = weight;BMI = bMI;Evl = evl;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}public double getWeight() {return weight;}public void setWeight(double weight) {this.weight = weight;}public void setBMI(double bMI) {BMI = bMI;}public void setEvl(String evl) {Evl = evl;}public double getBMI() {return BMI;}public String getEvl() {return Evl;}}本次的文章就到這里啦,其實不是什么復雜的業務,閑暇時間練手還是不錯的。
總結
以上是生活随笔為你收集整理的Java练手小项目——BMI计算器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 携程网涉嫌非法经营案宣判 携程最终胜诉
- 下一篇: Java用awt编写计算器(只有加减乘除