作者bleed1979 (十三)
看板C_and_CPP
標題Re: [問題] switch問題
時間Sun Apr 3 21:20:04 2011
※ 引述《peterkot (偉仔)》之銘言:
: 問題(Question):
: switch的使用
: 預期的正確結果(Expected Output):
: 在輸入的範圍內應得到下列結果:
: n<5.0 : no damage
: 5.0<=n<5.5 :some damage
: 5.5<=n<6.5 : heavy damage
: 6.5<=n<7.5 : disaster
: 7.5<n heavy : disaster
: 補充說明(Supplement):
: 小弟是初學者,這是書上指定說能用switch最好(東華出版的C語言詳論),
: 有和同學討論說覺得應該用if比較好做,但怕老師說沒有照書上要求被打回票,
: 所以到板上來向板友請教,請板友不吝指教,有任何需要新增或改法均請板有賜教。
個人認為這題使用 switch 不會比較好,而且寫程式不是為用而用就比較高明。
你看完以下三個重點就知道為什麼 switch 不好做。
1.輸入是整數或浮點數。
2.浮點數的精準位數是多少。
3.整數或浮點數的判斷。
我假設:
1.浮點數。
2.小數點以下一位。
3.整數判斷。
基於假設 3 點,用 if 會比較適當。
double d;
std::cin >> d;
int i = (int)(d * 10);
if(i < 50) {
// no damage
} else if(i < 55) {
// some damage
} else if(i < 65) {
// heavy damage
} else if(i < 75) {
// disaster
} else {
// heavy disaster
}
浮點數判斷兩者相等不太適合使用邏輯等於符號,一點點誤差都不能容許。
一般還是以絕對值小於一個很小的數來處理。
if(fabs(d - 5.5) < 1e-9)
這些爬文相信都會有。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.43.118.223
→ TsinTa:原來有"..."這招喔@@" 04/04 01:29
→ uranusjr:我記得 ... 是 GCC 的 extension, 不是標準 04/04 01:30
→ TsinTa:原來如此... 04/04 01:42
推 aecho:咦?一樓的做法真有趣。linux或是mac有支援這extension嗎? 04/04 10:55
→ xatier:4.21 Case Ranges You can specify a range of consecutive 04/04 12:57
→ xatier: values in a single case label, like this: 04/04 12:57
→ xatier:case low ... high: 04/04 12:58