作者loveme00835 (朴髮箍)
看板C_and_CPP
標題Re: [問題] if簡化的問題
時間Fri Mar 25 22:44:33 2011
※ 引述《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)