表驱动法之保险费率

书上的例子:数组

写一个计算医疗保险费率的程序,费率跟年龄、性别、婚姻情况以及吸烟与否有关。第一反应可能就是一大堆的if-else语句,以下:网络

#define FEMALE 1

#define MALE    0

#define MARRIED 1

#define UNMARRIED 0

#define SMOKING  1

#define NOSMOKING 0

 

if(gender ==FEMALE )

{

  if(maritalStatus ==MARRIED )

  {

    if(smokingStatus ==SMOKING  )

    {

      if(age<18){rate=250;}

      else if(age==18){rate=300};

      else if(age==19){rate=350};

      ...

      else if(age>65){rate=500}

    }

    else

    {...}

  }

}

else...

  

天啊,是否是一大堆的if-else,感受快搞晕的节奏,函数

即便第一回写的时候还没晕,估计下一次来看的时候,直接傻掉,blog

若是这里逻辑出了什么问题,还一边大骂傻屌~~~it

因此今天引出咱们的主角-表驱动法,所谓表驱动法是什么,你们参考百度或者代码大全~~class

 

其实为了让下次看懂,并且利于维护,通常来讲咱们就想一个函数实现就能够了,百度

就像float

GetRate(female,unmarried,nosmoking,age_21);

  

因此下面咱们来实现吧,丢掉那些讨厌的if-else:程序

数据部分:即保险的费率文件读取

影响保险费率除了年龄因素外还有3个因素,而年龄因素是主因素,因此咱们能够定义把每一个年龄的费率存在一个独立的数组里面,

可是因为还有3个因素,因此咱们须要以下几个数组:

enum
{
MALE_UNMARRIED_NOSMOKING =0,
MALE_UNMARRIED_SMOKING,
MALE_MARRIED_NOSMOKING,
MALE_MARRIED_SMOKING,
FEMALE_UNMARRIED_NOSMOKING,
FEMALE_UNMARRIED_SMOKING,
FEMALE_MARRIED_NOSMOKING,
FEMALE_MARRIED_SMOKING,
MAX_RATE_NUMBER
};

typedef float male_unmarried_nosmongking,male_married_nosmongking;
typedef float male_unmarried_smongking,male_married_smongking;

typedef float female_unmarried_nosmongking,female_married_nosmongking;
typedef float female_unmarried_smongking,female_married_smongking;

//数据,能够从文件读取,或者网络等等,这里为了方便随便赋值
male_unmarried_nosmongking MUN[48] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,};
male_unmarried_smongking MUS[48] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,};
male_married_nosmongking MMN[48] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,};
male_married_smongking MMS[48] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,};

female_unmarried_nosmongking FUN[48] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,};
female_unmarried_smongking FUS[48] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,};
female_married_nosmongking FMN[48] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,};
female_married_smongking FMS[48] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,};

  

好,这下有了8个数组来存储咱们的数据,但是总感受仍是不方便,因此再来封装下:

 

typedef struct
{
float* rate;
}Rate;

Rate RateTable[MAX_RATE_NUMBER] = {(float*)MUN,
(float*)MUS,
(float*)MMN,
(float*)MMS,
(float*)FUN,
(float*)FUS,
(float*)FMN,
(float*)FMS };

  

这些看上去清爽多了吧~~

终于到了主函数实现的时候了,

int GetRate(int gender,int maritalStatus,int smokingStatus,int age)

{

//1,年龄因素,为了利于在数组中快速找到对应的费率,须要利用数组自然的下标优点,

//<17的费率,数组下标0;18数组下标1;...大于65数组下标为65-17

//是否是又看到了讨厌的IF-ELSE,不过不要紧,这里先无论它,毕竟判断少,你们都看得懂

int ageFactor = 0;
if (age<18)
{
  ageFactor = 0;
}
else if (age>65)
{
  ageFactor = 65-17;
}
else
{
  ageFactor = age-17;
}

//2,其余因素

//注意到在RateTable数组中存储是有规律的,因此咱们的其余因素也利用数组的自然因素。。。。

int otherFacotors = gender*4+maritalStatus*2+smokingStatus;//0,1,2,3,4,5,6,7,8

//高潮来了哦,不要觉得是一大堆的if-else语句哦。。。

//其实就一句话~~
return RateTable[otherFacotors].rate[ageFactor]; //是否是很牛逼的样子~~ }

  

 

若是你看到这里,恭喜你,内功又深刻了一成~~

代码大全说,其实程序的控制逻辑人是不擅长的,可是咱们擅长数据,

因此咱们就尽情的利用表驱动法,把逻辑放入数据中吧~~~

相关文章
相关标签/搜索