Re: [問題] 想把 > 和 < 在迴圈中動態給定

看板Programming作者 (喲)時間11年前 (2013/02/16 23:03), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串4/4 (看更多)
※ 引述《BBSealion (海獅)》之銘言: : 有點不清楚怎麼敘述 : 就是我有一個判斷是要跑 : if(a>1) : else if(a>2) : ... : else if(a>10) : 另一個就是反過來 : if(a<1) : else if(a<2) : ... : else if(a<10) : 因為兩個判斷是裡面做的事情很像 : 我想寫成一個i=0~1跑兩次的迴圈解決 : 但要怎樣控制那個判斷式的 > 和 < 記號呢? : 是可以另外寫一個function丟參數i進去實作 > 和 < : 但為了一個大於小於多開一個function感覺還是不太漂亮 : 想知道有沒有更精簡的寫法呢 如果目標是要能做最少程度的程式碼copy-paste-edit, 首先我會把主要段落寫成: switch(convergence(a)) { case 0: f_0(a); break; case 1: f_1(a); break; case 2: .... case 10: f_10(a); break; } 數線被分為11個部份, x < 1 的部份代號為0, 9 < x <= 10 或 9 <= x < 10 的部份代號是9, x > 10 的部份代號為10. 當你的判斷準則是 greater 時, f_1, f_2, ..., f_10 是有效的結果. 反之,當判斷準則是 less 時, g_0, g_1, ..., g_9 是有效的結果. convergence 函數是把任意實數 a 收斂到上述11個數線區間中, 則 greater 和 less 二種準則,顯然該使用不同的 convergence. 所以 conv_greater(a) 的定義就是讓 9 < x <= 10 時, x 收斂到 9, 用 C 語言特性,會寫成: if (a <= 1) return 0; else if ((int)a == a) return a - 1; else return (int)a; 然後主程式是 switch(conv_greater(a)) { case 0: f_0(a); //空函數 break; case 1: f_1(a); break; ...... case 10: f_10(a); break; } 而要複製並修改為 less 準則時,則是依下列演算法: 1. 將 greater 主程式 copy-paste 過來,做為 less 主程式. 2. 將 less 主程式的 conv_greater(a) 此呼叫修改為 conv_less(a). 3. 將 less 主程式的 f_ 文字全部替換為 g_ . 4. 將 conv_less(a) 定義寫出來,為: if (a >= 10) return 10; else return (int)a; 綜合以上,假如你要程式寫得非常容易複製修改,你真正需要的是因應程式修改特性 而寫出的程式風格,而不是所謂精簡的寫法. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.167.45.9

02/17 08:09, , 1F
推,寫得清楚比寫得短還重要
02/17 08:09, 1F
文章代碼(AID): #1H7v-fM6 (Programming)
討論串 (同標題文章)
文章代碼(AID): #1H7v-fM6 (Programming)