作者yauhh (哟)
看板Programming
标题Re: [问题] 想把 > 和 < 在回圈中动态给定
时间Sat Feb 16 23:03:02 2013
※ 引述《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
1F:推 dryman:推,写得清楚比写得短还重要 68.181.7.15 02/17 08:09