先看下面的例题:
编写程序,计算将水从初始温度加热到最终温度所需的能量。程序应该提示用户输入水的重量(以千克为单位),以及水的初始温度和最终温度。计算能量的公示是:
Q= M × (最终温度 − 初始温度) × 4184
这里的M是以千克为单位的水的重量,温度以摄氏度为单位,而能量Q以焦耳为单元。
实现代码:
package com.smallfish;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
//水的重量
double weight=getInputDouble(scanner,"水的重量(单位:kg)",0.0,null);
//水的最终温度
double finalTemperature=getInputDouble(scanner,"水的最终温度(单位:℃)",0.0,374.3);
//水的初始温度
double initialTemperature=getInputDouble(scanner,"水的初始温度(单位:℃)",-22.0,finalTemperature);
scanner.close();
//Q = 𝑀 × (最终温度 − 初始温度) × 4184
double energy=weight*(finalTemperature-initialTemperature)*4184;
//输出将水从初始温度加热到最终温度所需的能量
System.out.println(weight+"kg的水从"+initialTemperature+"℃加热到"+finalTemperature+"℃所需的能量是:"+energy+"(单位:J)。");
}
/**
* 获取输入的符合要求的double类型的数据
* @param scanner scanner
* @param tip 输入提示
* @param min 限制的最小值
* @param max 限制的最大值
* @return 符合要求的double类型的数据
*/
public static double getInputDouble(Scanner scanner,String tip,Double min,Double max){
//输入提示语
System.out.println("输入"+tip+":");
double value=0.0;
//输入的是否是double类型
boolean isDouble;
if(scanner.hasNextDouble()){
isDouble=true;
value= scanner.nextDouble();
//mismatchedFlag=true 为不符合条件,默认 mismatchedFlag=false(符合)
boolean mismatchedFlag=false;
if(min!=null&&(mismatchedFlag=(value<=min))){
System.out.print(tip+"必须大于"+min+",");
}
//如果已经不满足,就不用继续判断下面的条件了
if(!mismatchedFlag&&max!=null&&(mismatchedFlag=(value>max))){
System.out.print(tip+"必须小于等于"+max+",");
}
if(!mismatchedFlag){
return value;
}
}else{
isDouble=false;
System.out.print(tip+"输入格式不正确,");
}
//因为不是double类型,未被读取,光标仍停留在刚才的输入行,读取这一行
String nextLine=scanner.nextLine();
System.out.print("您输入的是:["+(isDouble?value:nextLine)+"],请检查并重新");
return getInputDouble(scanner,tip,min,max);
}
}