程序代码:
#include<stdio.h>
#define HRATE 0.03
#define DRATE 0.05
/*宏定义活期年利率,定期年利率*/
double (*pcalc)(double cap, double y);
/*函数指针的运用*/
void clearInput(void) {
char input[1000];
fgets(input, 1000, stdin);
}
/*从stdin输入流中取1000个字符存放到input里,用这个方式清理输入流*/
double calcA(double cap, double y) {
int i = (int)y; /*强制转化取年数*/
double j = y - i; /*取月数*/
if(0 == i) {
cap *= 1 + HRATE * j; /*不足一年部分,HRATE*j是不足一年的利率*/
} else {
cap = calcA(cap, y - 1) * (1 + HRATE); /*超过一年部分,递归*/
}
return cap;
}
double calcB(double cap, double y) {
int i = (int)y;
double j = y - i;
if(0 == i) {
cap *= 1 + HRATE * j;
} else if(1 == i) {
cap *= 1 + DRATE;
cap *= 1 + HRATE * j;
} else {
cap = calcA(cap, y - 1) * (1 + DRATE);
}
return cap;
}
/*不足一年的部分按活期,其他递归,我觉得 i==1的情况多余了,请指教*/
void calc(double cap, double y, char op) {
if(cap >= 0) {
switch(op) {
case 'a':
case 'A':
pcalc = calcA;
break;
case 'b':
case 'B':
pcalc = calcB;
break;
default:
printf("业务类型选择错误!\n");
}
} else {
printf("本金输入错误!\n");
}
printf("%.2lf年后共有%.2lf元\n", y, pcalc(cap, y));
}
/*计算利润函数,根据不同情况将活期计算函数与定期计算函数赋值给指针函数,再进行操作*/
int main(void) {
double cap, y;
char op, ch;
printf("输入:\n本金 业务类型(A:活期-利滚利 B:定期-利滚利不满整年转活) 存储年份\n");
scanf("%lf %c %lf", &cap, &op, &y);
calc(cap, y, op);
clearInput();
if(op == 'A' || op == 'a') {
printf("是否选择将当前活期转定期?Y/N\n");
scanf("%c", &ch);
clearInput();
if(ch == 'Y' || ch == 'y') {
printf("输入定期存储年份:");
scanf("%lf", &y);
calc(cap, y, 'B');
}
}
return 0;
}
我试着解读楼上大神的,有些不懂和不得体的地方,有错请指出,欢迎交流。
[
本帖最后由 ouyangshit 于 2014-12-20 21:21 编辑 ]