Re: [問題] if簡化的問題

看板C_and_CPP作者 (朴髮箍)時間13年前 (2011/03/25 22:44), 編輯推噓3(303)
留言6則, 5人參與, 最新討論串2/2 (看更多)
※ 引述《aup65797 (有緣人)》之銘言: : code如網址: : http://codepad.org/mqAb2UuB : 這是控制led燈的程式..如何把if簡化. : 因為感覺程式有點攏長..switcha是開關 : 煩請大大解說... 來看看第一個 if 做了哪些事情: if(switcha==0) { cnta++; if(cnta%6==0) { led=0; } if(cnta%12==0) { led=1; } } 因為 6跟 12有著最大公因數 6, 當 cnta為12的倍數時, 本來開著 的LED燈會被關閉然後再打開, 這是你真正想要的結果嗎? 如果不是, 第一步應該判斷 cnta 是否為6的倍數, 然後才判斷它 是不是12的倍數, 必須構成一個巢狀結構, 以避免上述問題發生 if(switcha==0) { cnta++; if(cnta%6==0) led= (cnta % 12 == 0) ? 1 : 0; } 我認為這樣就夠了,實在沒必要為了個人的特殊嗜好再對剩下的 if 做消除的動作, 那會變成這樣: if(switcha==0) { cnta++; led = (cnta % 6 == 0) ? (cnta % 12 == 0) ? 1 : 0 : led; } 但還是建議你把注意力放在消去這麼多型式一樣, 意義卻不同的 0 和 1, 數值上他們是這樣沒錯, 但你的程式碼看起來卻更像是在做 數值運算; 而非控制燈號. 我偏好的寫法是像這樣: int const light = 1, douse = 0; int const high_potential = 1, low_potential = 0; if(switcha==low_potential) { cnta++; if(cnta%6==0) led= (cnta % 12 == 0) ? douse : light; } 它所帶來的效益遠比你全消去if所產生的還要多, 也提供了另一個 指標: 如果無法給予變數一個對應到問題情境裡的適當命名, 很 可能代表你不了解這個問題 -- ◢████ ◢█ ◢██◣ ◢█ ◢███ ◢█ T-ara版怎麼去 ████◢█████s ~> T-ara ███ █ ◢██ 歡迎您的光臨 ███████████恩靜智妍孝敏 ███ ██ 素妍居麗寶藍 ████◥██◤ █████花英 ψmakigoto123 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.197.115

03/25 23:03, , 1F
第一個if那邊...6的倍數一定是偶數吧
03/25 23:03, 1F
感謝樓上提醒! 我再修改一下..

03/25 23:16, , 2F
是低我是用數值運算來取代控制訊號,真的程式碼有些不一樣
03/25 23:16, 2F

03/25 23:17, , 3F
謝謝你的講解..
03/25 23:17, 3F

03/26 02:17, , 4F
led=1或0 的空間有重疊 原原po code真的沒錯嗎???
03/26 02:17, 4F

03/26 12:34, , 5F
奇怪?? 如果centa是12的倍數 就是6的倍數啊??
03/26 12:34, 5F
回樓上兩位, 已經修改好了!

03/27 17:15, , 6F
可是他原PO或許就要12的時候=1吧
03/27 17:15, 6F
原原PO的程式會先0後1, 我覺得應該做錯了 ※ 編輯: loveme00835 來自: 140.121.197.115 (03/27 18:44)
文章代碼(AID): #1DZAfMaN (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1DZAfMaN (C_and_CPP)