写一个计算医疗保险费率的程序,费率跟年龄、性别、婚姻状况以及吸烟与否有关。第一反应可能就是一大堆的if-else语句,如下:
#defineFEMALE1#defineMALE0#defineMARRIED1#defineUNMARRIED0#defineSMOKING1#defineNOSMOKING0if(gender==FEMALE){if(maritalStatus==MARRIED){if(smokingStatus==SMOKING){if(age<18){rate=250;}elseif(age==18){rate=300};elseif(age==19){rate=350};...elseif(age>65){rate=500}}else{...}}}else...
天啊,是不是一大堆的if-else,感觉快搞晕的节奏,
即使第一回写的时候还没晕,估计下一次来看的时候,直接傻掉,
如果这里逻辑出了什么问题,还一边大骂傻屌~~~
所以今天引出我们的主角-表驱动法,所谓表驱动法是什么,大家参考百度或者代码大全~~
其实为了让下次看懂,而且利于维护,一般来说我们就想一个函数实现就可以了,
就像
GetRate(female,unmarried,nosmoking,age_21);
所以下面我们来实现吧,丢掉那些讨厌的if-else:
数据部分:即保险的费率
影响保险费率除了年龄因素外还有3个因素,而年龄因素是主因素,所以我们可以定义把每个年龄的费率存在一个独立的数组里面,
但是由于还有3个因素,所以我们需要如下几个数组:
好,这下有了8个数组来存储我们的数据,可是总感觉还是不方便,所以再来封装下:
typedefstruct{float*rate;}Rate;RateRateTable[MAX_RATE_NUMBER]={(float*)MUN,(float*)MUS,(float*)MMN,(float*)MMS,(float*)FUN,(float*)FUS,(float*)FMN,(float*)FMS};
这些看上去清爽多了吧~~
终于到了主函数实现的时候了,
intGetRate(intgender,intmaritalStatus,intsmokingStatus,intage){//1,年龄因素,为了利于在数组中快速找到对应的费率,需要利用数组天然的下标优势,//<17的费率,数组下标0;18数组下标1;...大于65数组下标为65-17//是不是又看到了讨厌的IF-ELSE,不过没关系,这里先不管它,毕竟判断少,大家都看得懂intageFactor=0;if(age<18){ageFactor=0;}elseif(age>65){ageFactor=65-17;}else{ageFactor=age-17;}//2,其他因素//注意到在RateTable数组中存储是有规律的,所以我们的其他因素也利用数组的天然因素。。。。intotherFacotors=gender*4+maritalStatus*2+smokingStatus;//0,1,2,3,4,5,6,7,8//高潮来了哦,不要以为是一大堆的if-else语句哦。。。//其实就一句话~~returnRateTable[otherFacotors].rate[ageFactor];//是不是很牛逼的样子~~}
如果你看到这里,恭喜你,内功又深入了一成~~
代码大全说,其实程序的控制逻辑人是不擅长的,但是我们擅长数据,