練習 - Humidex

題目:濕熱指數(humidex)是加拿大氣象學家用來反映溫度和濕度的綜合影響的度量衡。當溫度為30oC(86oF)和露點為15oC(59oF)時,濕熱指數是34(注意濕熱指數是一個沒有度量單位的數,這個值表示大約的攝氏溫度值)。

輸入:輸入包含了許多行,除了最後一行,每行由空格分開的4個項目組成:一個字母,一個數字,第二個字母,第二個數字。每個字母說明後面跟著的數字的含義:T表示溫度,D表示露點,H表示濕熱指數。輸入結束行為字母E。

輸出:對於每行輸入,除了最後一行,產生一行輸出。輸出的形式如(T 數字 D 數字 H 數字)。

import java.util.Scanner;

public class Humidex {
	static String a, b; //定義兩個測試旗標字元
	static double A, B, temp, hum, dew;

	public static double dohum(double tt, double dd){ //根據溫度tt和露點dd計算濕熱指數
		double e= 6.11 * Math.exp(5417.7530 * ((1/273.16) - (1/(dd+273.16))));
		double h = (0.5555) * (e - 10.0);

		return tt + h;
	}

	public static double dotemp(double hh, double dd){ //根據濕熱指數hh和露點dd計算溫度
		double e= 6.11 * Math.exp(5417.7530 * ((1/273.16) - (1/(dd+273.16))));
		double h = (0.5555) * (e - 10.0);

		return hh - h;
	}

	public static double dodew(double hh, double tt){ //根據濕熱指數hh和溫度tt計算露點
		double x = 0; //露點值及其增量值初始化
		double delta = 100;
		for(delta = 100; delta > .00001; delta *= .5){ // 迴圈:增量值從100開始,每次迴圈減少一半,若根據目前溫度tt和露點x得出的濕熱指數大於濕熱指數hh,則露點x減少一個增量值,否則露點x增加一個增量值,這個迴圈過程直至增量值<=0.001為止
			if(dohum(tt, x) > hh)
				x -= delta;
			else
				x += delta;
		}
		return x;
	}

	public static void main(String[] args) {
		Scanner scanIn = new Scanner(System.in); //輸入第1組的資料
		if(scanIn.hasNext())
			a = scanIn.next();
		if(scanIn.hasNext())
			A = scanIn.nextDouble();
		if(scanIn.hasNext())
			b = scanIn.next();
		if(scanIn.hasNext())
			B = scanIn.nextDouble();

		while(a != "E"){ //依次輸入每次天氣預報的兩個測試量,直至輸入結束旗標E
			temp = hum = dew = -99999;
			if(a.equals("T")) temp = A;
			if(a.equals("H")) hum = A;
			if(a.equals("D")) dew = A;
			if(b.equals("T")) temp = B;
			if(b.equals("H")) hum = B;
			if(b.equals("D")) dew = B;

			if(hum == -99999) hum = dohum(temp, dew);
			if(dew == -99999) dew = dodew(hum, temp);
			if(temp == -99999) temp = dotemp(hum, dew);
			System.out.printf("T %.1f D %.1f H %.1f\n",  temp, dew, hum);

			scanIn = new Scanner(System.in); //繼續輸入資料
			if(scanIn.hasNext())
				a = scanIn.next();
			if(scanIn.hasNext())
				A = scanIn.nextDouble();
			if(scanIn.hasNext())
				b = scanIn.next();
			if(scanIn.hasNext())
				B = scanIn.nextDouble();
		}
		System.out.println("End");
	}
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*

驗證碼 * Time limit is exhausted. Please reload CAPTCHA.

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料