입력값을 double 로 형변환
입력값에 문자가 포함된 경우 (NumberFormatException e) 오류 안내메세지 출력
입력값이 누락된 경우 (ArrayIndexOutOfBoundsException e) 오류 안내메세지 출력
온도/습도/산소농도 체크 함수 호출, 함수값이 false인 경우 범위를 벗어난 요인 출력 ← 함수 호출을 세 번 한 게 좋은 방법은 아닌 것 같다
모두 정상범위에 있을 경우 안내메세지 출력
계산한 건강지수를 소숫점 셋째자리까지 출력
$$ x_{n+1} = \frac{(x_{n}+\frac{S}{x_n})}{2} $$
바빌로니아 방법
이용 : 수용 가능한 오차 범위에 근사값이 존재한다면 반복 종료public class HelloBiodome04 {
/* 입력한 환경 값의 범위를 검토하기 위한 함수
* 조건문을 활용해 boolean 값을 반환하는 메소드*/
// 1. 온도 체크
public static boolean checkTemp(double temp) {
return (10 <= temp && temp < 27.5);
}
//2. 습도 체크
public static boolean checkHum (double hum) {
return (40 < hum && hum < 60);
}
//3. 산소농도 체크
public static boolean checkOxy (double oxy) {
return (19.5 <= oxy && oxy <= 23.5);
}
/*건강지수 함수*/
public static double healthLevel(double hum, double temp, double oxy) {
return coefficient * myAbs(mySqrt(hum), temp) + (oxy/(PI * PI));
} //생명나무의 건강지수를 계산하는 수식
public static final double PI = 3.14; //상수 pi
public static final double coefficient = 0.415; //계수
//원하는 정밀도를 만족할 때까지 반복 진행
public static double mySqrt(double humidity) {
double precision = 0.0001;
double x = 1.0;
while(!(x*x - precision < humidity && humidity < x*x + precision)) {
x = (x + (humidity / x)) / 2;
}
return x;
} //습도값을 받아와 루트 계산 결과를 반환하는 메서드
public static double myAbs(double rootHumidity, double temp) {
return rootHumidity - temp > 0 ? (rootHumidity - temp) : -(rootHumidity - temp);
} //sqrt(습도)와 온도를 입력받아 절대값을 계산하고 결과 반환하는 수식
// main 함수
public static void main(String[] args) {
double temp; //온도
double hum; //습도
double oxy; //산소
try {
temp = Double.parseDouble(args[0]);
hum = Double.parseDouble(args[1]);
oxy = Double.parseDouble(args[2]);
}
catch (NumberFormatException e) {
System.out.println("입력된 값이 올바르지 않습니다. [온도][습도][산소농도] 순서대로 숫자 값을 입력해주세요");
return;
} //입력값에 문자가 포함되는 경우
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("입력된 값이 올바르지 않습니다. [온도][습도][산소농도] 순서대로 숫자 값을 입력해주세요");
return;
} //숫자값 3개가 모두 입력되지 않은경우
if (!checkTemp(temp)) {
System.out.println("온도값이 정상 범위를 벗어났습니다. 확인이 필요합니다");
}
else if (!checkHum(hum)) {
System.out.println("습도값이 정상 범위를 벗어났습니다. 확인이 필요합니다");
}
else if (!checkOxy(oxy)) {
System.out.println("산소 농도값이 정상 범위를 벗어났습니다. 확인이 필요합니다");
}
else {
System.out.println("생명의 나무는 안정적인 상태입니다 :)");
System.out.printf("생명지수 = %.3f", healthLevel(hum, temp, oxy));
}
}
}