Java练手小项目——BMI计算器
最近有一個(gè)減肥的朋友想要知道自己的BMI是多少,問我能不能給他做一個(gè)計(jì)算BMI的工具(無中生友)。于是用Java簡(jiǎn)單寫了一個(gè)。一起來看看吧。
身體質(zhì)量指數(shù)是BMI指數(shù)(身體質(zhì)量指數(shù),簡(jiǎn)稱體質(zhì)指數(shù)),是目前國(guó)際上常用的衡量人體胖瘦程度以及是否健康的一個(gè)標(biāo)準(zhǔn)。
計(jì)算公式為:BMI=體重(千克)除以身高(米)的平方。
為了方便使用我把整個(gè)小項(xiàng)目整合成了一個(gè)文件,復(fù)制到記事本里可以直接運(yùn)行。
import java.io.*; /*** 本程序?qū)崿F(xiàn)簡(jiǎn)單的BMI計(jì)算器。* |-實(shí)現(xiàn)了用戶鍵盤輸入數(shù)據(jù);* |-實(shí)現(xiàn)了BMI保留一位小數(shù)點(diǎn)* |-實(shí)現(xiàn)了Java標(biāo)準(zhǔn)輸出到文件* |-實(shí)現(xiàn)了工廠設(shè)計(jì)模式,減少耦合* |-添加了對(duì)異常的處理* @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計(jì)算器,請(qǐng)輸入相關(guān)信息***");String name = InputUtil.getInfo("請(qǐng)輸入姓名:");int age = Integer.parseInt(InputUtil.getInfo("請(qǐng)輸入年齡:"));double height = Double.parseDouble(InputUtil.getInfo("請(qǐng)輸入身高(米):"));double weight = Double.parseDouble(InputUtil.getInfo("請(qǐng)輸入體重(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("***信息創(chuàng)建成功***");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 = "您的體型偏瘦,請(qǐng)?jiān)黾訝I(yíng)養(yǎng)攝入,加強(qiáng)鍛煉!";private static final String NORMAL = "您的體型正常,請(qǐng)繼續(xù)保持!";private static final String FATTY = "您已偏胖,請(qǐng)改變不健康的生活習(xí)慣,加強(qiáng)鍛煉!";private static final String OBESITY = "您的體型肥胖,相關(guān)疾病風(fēng)險(xiǎn)顯著增加!";@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 "數(shù)據(jù)有誤,請(qǐng)重新輸入相關(guān)信息!";}}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("輸入的信息不能為空,請(qǐng)檢查后重新輸入!");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() + "的評(píng)測(cè)報(bào)告.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(("健康評(píng)測(cè):" + 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() + "的評(píng)測(cè)報(bào)告.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;}}主類設(shè)計(jì)思路
整個(gè)程序的設(shè)計(jì)思路是通過偽菜單界面的方式提醒用戶一次輸入數(shù)據(jù),計(jì)算出來結(jié)果之后將其返回,并利用Java的輸入輸出流保存文件到特定的位置。既然是偽菜單界面,那么必不可少的就是寫一個(gè)Menu類來作為整個(gè)程序的入口。
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計(jì)算器,請(qǐng)輸入相關(guān)信息***");String name = InputUtil.getInfo("請(qǐng)輸入姓名:");int age = Integer.parseInt(InputUtil.getInfo("請(qǐng)輸入年齡:"));double height = Double.parseDouble(InputUtil.getInfo("請(qǐng)輸入身高(米):"));double weight = Double.parseDouble(InputUtil.getInfo("請(qǐng)輸入體重(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("***信息創(chuàng)建成功***");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();}} }主方法非常簡(jiǎn)單,就是一句話,生成一個(gè)匿名的Menu類對(duì)象,調(diào)用Menu無參構(gòu)造方法。然后依次顯示提示語句。
輸入流輸出流設(shè)計(jì)
既然要引導(dǎo)依次輸入不同的數(shù)據(jù),那么就想到我們可以使用System.in實(shí)現(xiàn)鍵盤輸入。每次要輸入的內(nèi)容又不同,我們可以將提示信息作為一個(gè)字符串傳入到輸入方法中,并將獲取到的數(shù)據(jù)返回。
而輸出流,本來計(jì)劃要用Hutool的jar包,里面封裝了非常好用的輸出Map對(duì)象的方法。但是考慮到要將整個(gè)程序打包成一個(gè)文件發(fā)給我的朋友,還是決定自己寫。于是,我將Person類對(duì)象作為一個(gè)參數(shù)傳入到輸出工具類之中。這個(gè)設(shè)計(jì)其實(shí)不好,因?yàn)楣ぞ哳悜?yīng)該是私有構(gòu)造的,通過調(diào)用不同的靜態(tài)方法執(zhí)行相應(yīng)的功能,Person類對(duì)象應(yīng)該作為參數(shù)傳入到print()方法中,而不是作為類的私有屬性以構(gòu)造方法參數(shù)的形式傳入。但是當(dāng)時(shí)寫的時(shí)候犯困就胡亂寫成這個(gè)樣子。
接口與服務(wù)類設(shè)計(jì)
其實(shí)對(duì)于計(jì)算一個(gè)BMI這種簡(jiǎn)單到只要一行return語句的業(yè)務(wù)來說,只需要在Person類之中的getBMI()方法的返回值寫就可以解決。但是還是想按照標(biāo)準(zhǔn)的流程來進(jìn)行開發(fā),于是將其專門寫了一個(gè)接口和接口實(shí)現(xiàn)類。在獲取健康評(píng)價(jià)環(huán)節(jié),我將幾個(gè)要返回的評(píng)價(jià)設(shè)置成了常量,放在程序最上邊,方便日后的修改。
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 = "您的體型偏瘦,請(qǐng)?jiān)黾訝I(yíng)養(yǎng)攝入,加強(qiáng)鍛煉!";private static final String NORMAL = "您的體型正常,請(qǐng)繼續(xù)保持!";private static final String FATTY = "您已偏胖,請(qǐng)改變不健康的生活習(xí)慣,加強(qiáng)鍛煉!";private static final String OBESITY = "您的體型肥胖,相關(guān)疾病風(fēng)險(xiǎn)顯著增加!";@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 "數(shù)據(jù)有誤,請(qǐng)重新輸入相關(guān)信息!";}}實(shí)體類
這里其實(shí)就沒什么好說的了,就是最簡(jiǎn)單的簡(jiǎn)單Java類,實(shí)現(xiàn)構(gòu)造,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;}}本次的文章就到這里啦,其實(shí)不是什么復(fù)雜的業(yè)務(wù),閑暇時(shí)間練手還是不錯(cuò)的。
總結(jié)
以上是生活随笔為你收集整理的Java练手小项目——BMI计算器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 携程网涉嫌非法经营案宣判 携程最终胜诉
- 下一篇: nginx反向代理配置+lnmp优化+七