Re: [問題] 想把 > 和 < 在迴圈中動態給定
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 4 之 4 篇):