博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
表驱动法之保险费率
阅读量:6799 次
发布时间:2019-06-26

本文共 2929 字,大约阅读时间需要 9 分钟。

书上的例子:

写一个计算医疗保险费率的程序,费率跟年龄、性别、婚姻状况以及吸烟与否有关。第一反应可能就是一大堆的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,感觉快搞晕的节奏,

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

如果这里逻辑出了什么问题,还一边大骂傻屌~~~

所以今天引出我们的主角-表驱动法,所谓表驱动法是什么,大家参考百度或者代码大全~~

 

其实为了让下次看懂,而且利于维护,一般来说我们就想一个函数实现就可以了,

就像

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]; //是不是很牛逼的样子~~ }

  

 

如果你看到这里,恭喜你,内功又深入了一成~~

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

所以我们就尽情的利用表驱动法,把逻辑放入数据中吧~~~

 

转载于:https://www.cnblogs.com/273809717/p/3689315.html

你可能感兴趣的文章
objective-c 中数据类型之中的一个 几何数据类型(CGPoint,CGSize,CGRect)
查看>>
[Dubbo实战]dubbo + zookeeper + spring 实战 (转)
查看>>
mysql学习笔记(二)
查看>>
Minor【 PHP框架】1.简介
查看>>
面试1
查看>>
【Java基础】4、java中的内部类
查看>>
Mac ssh
查看>>
h5 喜帖
查看>>
全局修改默认字体,通过反射也能做到
查看>>
直方图
查看>>
LeetCode: 【L4】N-Queens 解题报告
查看>>
首届HTML5原创游戏大赛将于6月10日拉开序幕
查看>>
8个对于Web设计和开发人员非常有用的在线工具
查看>>
iOS - (简单平移动画/弹出View的使用)
查看>>
Bloom Filter概念和原理
查看>>
SPOJ PGCD 4491. Primes in GCD Table && BZOJ 2820 YY的GCD (莫比乌斯反演)
查看>>
STL学习系列八:Set和multiset容器
查看>>
入门案例
查看>>
C++ 虚函数表解析(转)
查看>>
八数码问题及A*算法
查看>>