Re: [語法] 無規則性固定數值輸入的處理方式?

看板C_and_CPP作者 (迅雷不及掩耳盜鈴)時間15年前 (2010/05/15 09:46), 編輯推噓1(1016)
留言17則, 3人參與, 最新討論串2/7 (看更多)
關於switch與if-else, "一般"規則是超過3個if-else就考慮使用switch, 這是 通則. 實際情況要看你夢裡的公司的Coding Style, 如果公司沒有這東西, 那 就看老闆的喜好, 這也是通則 :) switch的確有排版膨脹問題, 真的很在意的話可考慮K & R的Coding Style : switch { // 跟 if-else一樣寬 case 1: case 2: } 回到你的問題, 現在if-else/switch/array搜尋時間複雜度都是O(n), n是可能 輸入的總數, 如果真的在意效率的話要可以用key-value pair讓時間複雜度降 到O(log n)或O(1) O(log n)可以用2元樹的資料結構達成, 如std::map O(1)的話, 先假設使用者傳入的數字是簡單的1到n好了, 1對應0x1 2對應0x9 ... 那就固定陣列, const int MAP_TABLE[n] = { 0x1, 0x9, ... }; 存取時 void func1(int key) { int value = MAP_TABLE[key - 1]; // 修正bug ... } 如果不是簡單的1到n, 那就寫函式轉換到簡單數字, 類似hash table資料結構, 如std::unordered_map. 不過如果確定n只有10, 那就太大費周章了, 全部掃完 也沒多久. ※ 引述《shadown ()》之銘言: :  這是最近作夢夢到的..我工作上寫了一段 code ,主管看了之 :  後,要求要做更改,但我覺得更改後的可讀性與效能並不會比 :  較好,如果換做大家的話不知道會覺得怎樣寫比較好? :  [問題] : 使用者輸入一個數字,數字是沒有規則性的固定數字(共十個 :  數字,彼此無相依性,所以沒辦法簡化),要經過邏輯判斷後 :  ,呼叫一個固定的 func ,傳入相對應的數值(此數值有規則 :  性,由0x01->0x10),以取得結果。 : [我寫的程式碼] : void main(void) : { : ... : func(x); : ... : } : void func1(int x) : { : if(x==1) func2(0x01); : else if(x==6) func2(0x02); : else if(x==9) func2(0x03); : ...共10個 if 判斷 : } : [主管的要求] : void func1(int x) : { : switch(case) : { : case 1: : func2(0x01); : break; : case 6: : ... : } : } : 或是使用 array 存放數據,再跑迴圈做判斷。 :  我的想法是,用 switch 的方式並不見得比使用 if,else 來 :  得好,可讀性是差不多,但程式碼行數會多不少,要是整個 :  程式裡遇到不少類似的狀況,都用 switch 的方式的話,程式 :  碼就會變得"很大". : 而改用迴圈的方式,因為輸入數值只有十種,所以用迴圈的方 :  式,並無法簡化程式碼,行數也差不多。而且因為多了迴圈與 :  array 的使用,執行效能與記憶體空間使用上反而變差了(我 :  們寫的是系統程式,效能上必須要做考量),可讀性也降低了 :  些.. : 因為是工作,所以主管要求什麼我就只好照辦,但心裡還是有 :  些..,不知道換做是板友的話,會怎麼撰寫這段 code 呢? :  喔~對了~要是我的想法有錯的話,也請板友多多指教,感謝 :  ~^____^ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.24.147.174

05/15 09:58, , 1F
說真的, 公司團體的coding style也是一件要注意的事,
05/15 09:58, 1F

05/15 09:58, , 2F
在人家公司工作, 就不是單純你認為程式想怎麼寫就怎麼寫
05/15 09:58, 2F

05/15 09:59, , 3F
就好, { 寫在哪?? 變數命名原則?? tab還是空白?? 註解
05/15 09:59, 3F

05/15 10:00, , 4F
型式?? 有時候有些style不見得有特別原因, 無論是加入
05/15 10:00, 4F

05/15 10:01, , 5F
team work, 或者當作低頭吃老板頭路; 不是有沒有差的問
05/15 10:01, 5F

05/15 10:01, , 6F
題, 而是沒辦法證明你的比較好時, 就要有心理準備接受
05/15 10:01, 6F

05/15 10:02, , 7F
團體的style, 也可能單純是老板喜歡的style, 如此而已XD
05/15 10:02, 7F

05/15 10:03, , 8F
話說, Debug mode的時候, switch step起來比一堆else if
05/15 10:03, 8F

05/15 10:04, , 9F
快一點吧@_@"
05/15 10:04, 9F

05/15 16:53, , 10F
我們的程式碼一直沒有一個固定的style,直到這兩天,主管突
05/15 16:53, 10F

05/15 16:54, , 11F
然開始囉嗦起來..因為以前很自由,所以突然這樣就很難接受.
05/15 16:54, 11F

05/15 16:54, , 12F
當然,這一切都是在夢中發生的..XDDDDDD
05/15 16:54, 12F

05/15 16:56, , 13F
就像V大說的,我沒辦法證明我的方法比較好,而叫我們這樣做
05/15 16:56, 13F

05/15 16:56, , 14F
的主管,也說不出為何那樣做比較好的原因..只說別人都是那
05/15 16:56, 14F

05/15 16:56, , 15F
樣做..囧
05/15 16:56, 15F

05/15 16:57, , 16F
沒想到map的效率會這麼高..@@
05/15 16:57, 16F
※ 編輯: flamo 來自: 114.24.147.174 (05/15 17:31)

05/15 17:32, , 17F
修一下bug
05/15 17:32, 17F
文章代碼(AID): #1BxVpwYt (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BxVpwYt (C_and_CPP)