1. 입력값을 double 로 형변환

  2. 입력값에 문자가 포함된 경우 (NumberFormatException e) 오류 안내메세지 출력

    입력값이 누락된 경우 (ArrayIndexOutOfBoundsException e) 오류 안내메세지 출력

  3. 온도/습도/산소농도 체크 함수 호출, 함수값이 false인 경우 범위를 벗어난 요인 출력 ← 함수 호출을 세 번 한 게 좋은 방법은 아닌 것 같다

  4. 모두 정상범위에 있을 경우 안내메세지 출력

  5. 계산한 건강지수를 소숫점 셋째자리까지 출력

    Untitled

    $$ x_{n+1} = \frac{(x_{n}+\frac{S}{x_n})}{2} $$

    Untitled

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));
        }
    }

}