首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个判断,大家如何写

2013-01-21 
一个判断,大家怎么写? [解决办法]引用:C/C++ code?12345678910void jump(int parm1, int parm2){if (0

一个判断,大家怎么写?

 
[解决办法]
引用:
C/C++ code?12345678910void jump(int parm1, int parm2){  if (0 == parm1 && 0 == parm2)    // ... jump1_0()  else if (1 == parm1 && 2 == parm2)    // ... jump1_2();  else if……



欲减少代码,使代码简洁清晰,通常的做法是提高抽象层次,有个著名的FTSE原则,就是软件开发遇到的任何问题,都可以通过增加一层封装去解决。封装的方法有很多种,可以通过模板、函数等,但对于楼主的情况,比较适合的方法是用宏进行封装,我写个例子:

#define IF_GOTO( A, B ) do{  if( A == parm1 && B == parm2 ) goto A##_##B; }while(0)

使用的时候可以这样:
IF_GOTO( 0, 0 );
IF_GOTO( 0, 1 );
……

这样就清晰简洁得多了。
[解决办法]
void jump(int      parm1, int       parm2)
{
       if (   0 == parm1 &&    0 == parm2)
    // ... jump1_0()
  else if (   1 == parm1 &&    2 == parm2)
    // ... jump1_2();
  else if ( 100 == parm1 && 1000 == parm2)
    // ... jump100_1000();
  // ...很长,100多条判断,而且数字大小不定
}

自创C语言填表式编码风格。欢迎大家用各种语言及其编码风格来PK! [推荐] [C/C++ C语言]
http://bbs.csdn.net/topics/380157851
[解决办法]
你们都太不靠谱了.....
当量很大的时候 居然还用switch .....疯了

我一般的做法
谨以29个函数的调用来做个示范

#include <stdint.h>
#include <stdio.h>

uint32_t jump00(){return 0;}//par1 =0  par2=0
uint32_t jump01(){return 1;}
uint32_t jump02(){return 2;}
uint32_t jump03(){return 3;}
uint32_t jump04(){return 4;}
uint32_t jump05(){return 5;}
uint32_t jump06(){return 6;}
uint32_t jump07(){return 7;}
uint32_t jump08(){return 8;}
uint32_t jump09(){return 9;}//par1=0    par2=9


uint32_t jump10(){return 10;}  //par1=1   par2=0
uint32_t jump11(){return 11;}
uint32_t jump12(){return 12;}
uint32_t jump13(){return 13;}
uint32_t jump14(){return 14;}
uint32_t jump15(){return 15;}
uint32_t jump16(){return 16;}
uint32_t jump17(){return 17;}
uint32_t jump18(){return 18;}
uint32_t jump19(){return 19;}//par1=1    par2=9




uint32_t jump20(){return 20;}//par1=2    par2=0
uint32_t jump21(){return 21;}
uint32_t jump22(){return 22;}
uint32_t jump23(){return 23;}
uint32_t jump24(){return 24;}
uint32_t jump25(){return 25;}
uint32_t jump26(){return 26;}
uint32_t jump27(){return 27;}
uint32_t jump28(){return 28;}
uint32_t jump29(){return 29;}//par1=2    par2=9
//以30个函数为例子 


typedef uint32_t (*jumpfun)();


struct jumpTable
{
int32_t par1;
int32_t par2;
//通过参数一和参数二 来调用相应函数
jumpfun fun;
};


jumpTable jumpTables[]=
{
{0,0,jump00},
{0,1,jump01},
{0,2,jump02},
{0,3,jump03},
{0,4,jump04},
{0,5,jump05},
{0,6,jump06},
{0,7,jump07},
{0,8,jump08},
{0,9,jump09},

{1,0,jump10},
{1,1,jump11},
{1,2,jump12},
{1,3,jump13},
{1,4,jump14},


{1,5,jump15},
{1,6,jump16},
{1,7,jump17},
{1,8,jump18},
{1,9,jump19},

{2,0,jump20},
{2,1,jump21},
{2,2,jump22},
{2,3,jump23},
{2,4,jump24},
{2,5,jump25},
{2,6,jump26},
{2,7,jump27},
{2,8,jump28},
{2,9,jump29},
};
#define ARRAY_SIZE(Array) (sizeof(Array)/sizeof(Array[0]))

#define JUMP_MAX_SIZE ARRAY_SIZE(jumpTables)
//方法一 遍历大法

//优点 简单..易用 
//缺点  慢
uint32_t jump(int par1,int par2)
{
for (int i=0;i!=JUMP_MAX_SIZE;i++)
{
if (jumpTables[i].par1==par1&&jumpTables[i].par2==par2)
{
return jumpTables[i].fun();
}
}
return 0xffffffff;
}


int main()
{
int i,j;
printf("请输入2个调用函数的参数");
scanf("%d%d",&i,&j);
uint32_t result=jump(i,j);
if (result==0xffffffff)
{
printf("not find fun");
return 0xffffffff;
}
printf("%u",result);

//突然有一天你需要加入新的参数 100 100  
//只需要改下那个表的源代码内容 以及关联的函数 
//头文件不变 
//而且你再也不用手工写if switch了 ...
//再也不用改实现代码了
}






热点排行