[問題] 區間轉換優雅的寫法

看板C_and_CPP (C/C++)作者 (慢速人)時間13年前 (2012/11/25 23:55), 編輯推噓10(10013)
留言23則, 14人參與, 最新討論串1/1
想到這問題是,ffmpeg做jpeg壓縮用的quality與IJG不一樣 所以要做個轉換, 但不是只用在這種情況。 程式裡常會用到很多區間的時機,區間間距不等時, 寫出來代碼很丑: 好比: 100分到96分 -> A+ 90分到95分 -> A 80分到89分 -> B : 59分以下-> GG 注意區間大小不一樣 我的實作是這樣: enum level {AX, A, B, ..., BB}; enum level GradeToLevel(unsigned int grade) { if(grade >= 96) return AX; if(grade >=90) return A; if(grade >= 80) return B; : return GG; } 這樣若列舉項多點,會寫的很長,實在不雅, 有沒優雅點的寫法呢? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 116.59.239.127

11/25 23:59, , 1F
這樣明白清楚 不是很好嗎
11/25 23:59, 1F
※ 編輯: slowOne 來自: 116.59.239.127 (11/26 00:04)

11/26 00:15, , 2F
區間多的話把區間分界點寫在陣列裡,再用for去跑?
11/26 00:15, 2F

11/26 00:24, , 3F
我一直認為這是不能兩全的問題 @@
11/26 00:24, 3F

11/26 00:26, , 4F
不過討論下去又要發一篇文了Orz
11/26 00:26, 4F

11/26 00:57, , 5F
用查表法就不用一堆IF了
11/26 00:57, 5F

11/26 01:26, , 6F
查表法code更長...
11/26 01:26, 6F

11/26 01:53, , 7F
我也是想到二樓的作法
11/26 01:53, 7F

11/26 02:13, , 8F
hashtable
11/26 02:13, 8F

11/26 02:15, , 9F
先寫一個init到0~100陣列裡,在直接array[90]這樣
11/26 02:15, 9F

11/26 02:35, , 10F
這樣寫最優雅
11/26 02:35, 10F

11/26 05:41, , 11F

11/26 05:41, , 12F
如果只是想要短一點的話可以用 define
11/26 05:41, 12F

11/26 05:42, , 13F
可以試試C++/STL的lower_bound()或upper_bound() :)
11/26 05:42, 13F

11/26 11:46, , 14F
也許MPFI:multiple precision interval 合你需要
11/26 11:46, 14F

11/26 23:32, , 15F
如果真要寫,我想到的也是wa120的方式,先建表,然後判斷的
11/26 23:32, 15F

11/26 23:34, , 16F
部份就只要return map[分數],這樣最好.當然建表要花空間
11/26 23:34, 16F

11/26 23:36, , 17F
如果連分數0~100這個有101個元素的表也要省的話,表可以
11/26 23:36, 17F

11/26 23:38, , 18F
用char或unsigned char來當單位元素大小.
11/26 23:38, 18F

11/26 23:54, , 19F
linotwo 的奇淫怪技讓我研究好久...
11/26 23:54, 19F

11/26 23:55, , 20F
hashtable 有限制,只能吃整數.
11/26 23:55, 20F

11/27 00:09, , 21F
轉換函式若為單調函數可考慮使用二元搜尋法
11/27 00:09, 21F

11/27 00:10, , 22F
速度快的不得了^_<
11/27 00:10, 22F

11/28 21:32, , 23F
gcc的特殊用法 case 95 ... 100: break;
11/28 21:32, 23F
文章代碼(AID): #1GiZzqYj (C_and_CPP)
文章代碼(AID): #1GiZzqYj (C_and_CPP)