Re: [語法] 無規則性固定數值輸入的處理方式?
關於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
05/15 09:58, 1F
→
05/15 09:58, , 2F
05/15 09:58, 2F
→
05/15 09:59, , 3F
05/15 09:59, 3F
→
05/15 10:00, , 4F
05/15 10:00, 4F
→
05/15 10:01, , 5F
05/15 10:01, 5F
→
05/15 10:01, , 6F
05/15 10:01, 6F
→
05/15 10:02, , 7F
05/15 10:02, 7F
→
05/15 10:03, , 8F
05/15 10:03, 8F
→
05/15 10:04, , 9F
05/15 10:04, 9F
→
05/15 16:53, , 10F
05/15 16:53, 10F
→
05/15 16:54, , 11F
05/15 16:54, 11F
→
05/15 16:54, , 12F
05/15 16:54, 12F
→
05/15 16:56, , 13F
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
05/15 16:57, 16F
※ 編輯: flamo 來自: 114.24.147.174 (05/15 17:31)
→
05/15 17:32, , 17F
05/15 17:32, 17F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 7 篇):