看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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
lsc36:第一個if那邊...6的倍數一定是偶數吧 03/25 23:03
感謝樓上提醒! 我再修改一下..
aup65797:是低我是用數值運算來取代控制訊號,真的程式碼有些不一樣 03/25 23:16
aup65797:謝謝你的講解.. 03/25 23:17
softwind:led=1或0 的空間有重疊 原原po code真的沒錯嗎??? 03/26 02:17
firejox:奇怪?? 如果centa是12的倍數 就是6的倍數啊?? 03/26 12:34
回樓上兩位, 已經修改好了!
stosto:可是他原PO或許就要12的時候=1吧 03/27 17:15
原原PO的程式會先0後1, 我覺得應該做錯了 ※ 編輯: loveme00835 來自: 140.121.197.115 (03/27 18:44)