还是那个问题,输出时0
问题1:左上角观测窗里显示的por表示取款金额,我输入的是1000,显示的都是小数,不知道为什么?问题2:count[num].interest表示利息,观测窗里面显示了数值,但是执行框输出都为0.000,为什么呢?
代码嘛,很长,基本上都是重复的问题,看一个部分就好,不过还是都贴上来吧,问题遇到过的应该不难
程序代码:
#include<stdio.h> #include<string.h> #include<math.h> #define N 100 struct count_user { char name[20];//姓名 char card[20];//卡号 char secu[7];//密码 char type[9];//存款种类 int data_limit;//存款期限 double capital;//卡上余额 double interest;//利息 int in_year;//存入日期 int in_month; int in_day; int out_year;//支取日期 int out_month; int out_day;//共13个数据,整体输入,不可缺少 }count[N]; void input(); void beauty(); void build(); void inquire(); void deposit(); void draw(); void fix_cun(); void fix(); void use(); void date(); void current(); void time_demand(); void install_cun(); void install_qu(); int calculate(int,int,int); void undo(); int m,n,s,num=0,t; double Interest1,tax,rate,por_cun,por; void main() { input();//输入函数 } void beauty()//美化函数 { for(int i=0;i<80;i++) { if(i%80==0) putchar('\n'); putchar('*'); } putchar('\n'); } void input()//输入函数 { beauty(); printf("您想要办理什么业务?\n开户请按1\n存款请按2\n取款请按3\n销户请按4\n"); beauty(); fflush(stdin); switch(getchar()) { case'1':build();break;//调用开户函数 case'2':deposit();break;//调用存款函数 case'3':draw();break;//调用取款函数 case'4':undo();break;//调用销户函数 default:printf("Input error!\n"); } } //开户 void build()//开户函数 { FILE *fp; beauty(); printf("请输入您的姓名,卡号,密码:\n"); strcpy(count[num].type,"00000000"); count[num].data_limit=0; count[num].capital=0.0; count[num].interest=0.0; count[num].in_year=count[num].in_month=count[num].in_day=0; count[num].out_year=count[num].out_month=count[num].out_day=0;//共10个数据 beauty(); fscanf(stdin,"%s%s%s",count[num].name,count[num].card,count[num].secu);//将信息从键盘写入 if((fp=fopen("g:\\程序\\课程设计\\my_acount.txt","wb"))==NULL) { printf("cann't open file\n"); return; } fwrite(&count[num],sizeof(struct count_user),1,fp); beauty(); fclose(fp); printf("\n开户已成功,请核对您的信息:\n"); if((fp=fopen("g:\\程序\\课程设计\\my_acount.txt","rb"))==NULL) { printf("cann't open file\n"); return; } fread(&count[num],sizeof(struct count_user),1,fp); fprintf(stdout,"姓名:%s\n卡号:%s\n密码:%s\n",count[num].name,count[num].card,count[num].secu);//输出到屏幕上 fclose(fp); beauty(); printf("确认请按\t1\n错误请按\t2\n"); beauty(); while((getchar())!='\n') continue;//getchar调用缓存区的'\n'会导致直接跳过!!!这个问题坑了我好几个晚上%>_<% switch(getchar()) { case'1':beauty(); inquire();break; case'2':build();break; default:beauty(); printf("Input error!\n"); } } void inquire()//询问函数 { printf("您是否需要办理其他业务?\n继续办理请按\t1\n退出请按\t2\n"); beauty(); while((getchar())!='\n') continue; switch(getchar()) { case'1':input();break; case'2':beauty(); printf("感谢您的使用!O(∩_∩)O~~\n");break; default:printf("Input error!\n"); } } //存款 void deposit()//存款函数 { FILE*fp; beauty(); printf("请输入您的姓名,卡号,密码:\n"); beauty(); scanf("%s%s%s",count[num].name,count[num].card,count[num].secu);//共3个数据 beauty(); printf("请输入您的存款日期:\n"); beauty(); scanf("%d%d%d",&count[num].in_year,&count[num].in_month,&count[num].in_day);//共3个数据 beauty(); printf("请选择您的存款类别:\n定期存款请按\t1\n活期存款请按\t2\n定活两便请按\t3\n零存整取请按\t4\n\n"); beauty(); fflush(stdin); switch(getchar()) { case'1':strcpy(count[num].type,"定期存款"); beauty(); fix_cun(); break; case'2':strcpy(count[num].type,"活期存款"); beauty(); printf("请输入您的存款金额:\n"); beauty(); scanf("%d",&por_cun);//1个数据 beauty(); count[num].data_limit=0; break; case'3':strcpy(count[num].type,"定活两便"); beauty(); printf("请输入您的存款金额:\n"); beauty(); scanf("%d",&por_cun);//1个数据 count[num].data_limit=0; break; case'4':strcpy(count[num].type,"零存整取"); install_cun(); break; default:printf("Input error!"); }//1个数据 count[num].interest=0.0; count[num].out_year=count[num].out_month=count[num].out_day=0;//共5个数据 count[num].capital+=(double)por_cun; beauty(); printf("\n存款已成功,请核对您的信息:\n"); if((fp=fopen("g:\\程序\\课程设计\\my_acount.txt","wb"))==NULL) { printf("cann't open file\n"); return; } fwrite(&count[num],sizeof(struct count_user),1,fp); fclose(fp);//将信息输出到文件 beauty(); if((fp=fopen("g:\\程序\\课程设计\\my_acount.txt","rb"))==NULL) { printf("cann't open file\n"); return; } fread(&count[num],sizeof(struct count_user),1,fp);//将信息从文件输出 fprintf(stdout,"姓名:\t\t%s\n卡号:\t\t%s\n密码:\t\t%s\n存款类别:\t%s\n卡上余额:\t%d\n",count[num].name,count[num].card,count[num].secu,count[num].type,count[num].capital);//输出到屏幕上 fprintf(stdout,"存款日期:\t%d年%d月%d日\n",count[num].in_year,count[num].in_month,count[num].in_day);//日期必须单独输出,否则年月日会向后推移,不能正确对应 fclose(fp); beauty(); inquire(); } void fix_cun() { printf("请输入您的存款金额:\n"); beauty(); scanf("%d",&por_cun);//1个数据 beauty(); puts("请输入您预计存款的期限(请仔细阅读下面的提示):"); puts("【提示:"); puts("\t系统以月读取,请输入整数,期限应大于3个月"); puts(" 利率:"); puts("\t三个月:1.71%"); puts("\t六个月:2.07%"); puts("\t一年: 2.25%"); puts("\t二年: 2.70%"); puts("\t三年: 3.24%"); puts("\t五年: 3.60%"); puts(" 定期存款提前支取按活期利率计息】"); beauty(); scanf("%d",&count[num].data_limit); if(count[num].data_limit==3||count[num].data_limit==6) { beauty(); printf("您预计存款\t%d个月O(∩_∩)O~~\n",count[num].data_limit);//将信息输出到屏幕 beauty(); fprintf(stdout,"确认请按\t1\n重新输入请按\t2\n退出请按\t3\n");//将信息输出到屏幕 beauty(); } if(count[num].data_limit%12==0) { n=count[num].data_limit/12; if(n>=1&&n<5) { beauty(); fprintf(stdout,"您预计存款\t%d年O(∩_∩)O~~\n",n);//将信息输出到屏幕 beauty(); fprintf(stdout,"确认请按\t1\n重新输入请按\t2\n退出请按\t3\n");//将信息输出到屏幕 beauty(); } else { beauty(); fprintf(stdout,"您预计存款\t5年及以上O(∩_∩)O~~\n",count[num].data_limit);//将信息输出到屏幕 beauty(); fprintf(stdout,"确认请按\t1\n重新输入请按\t2\n退出请按\t3\n");//将信息输出到屏幕 beauty(); } }//1个数据 while((getchar())!='\n') continue; switch(getchar()) { case'1':break; case'2':beauty(); fix_cun();break; case'3':beauty(); printf("感谢您的使用!O(∩_∩)O~~\n");break; default:beauty(); printf("Input error!");break; } } void draw()//取款函数 { FILE*fp; beauty(); printf("请输入您的姓名,卡号,密码:\n"); beauty(); scanf("%s%s%s",count[num].name,count[num].card,count[num].secu);//3个数据 beauty(); if((fp=fopen("g:\\程序\\课程设计\\my_acount.txt","rb"))==NULL) { printf("cann't open file\n"); return; } /*for(int i=0;i<num&&count[num].card!=count[i].card;i++); if(i==num) { printf("很抱歉,没有查找到您的数据,请您核对后重新输入O(∩_∩)O~~\n"); draw(); } count[num]=count[i]; */ fread(&count[num],sizeof(struct count_user),1,fp);//将信息从文件输出 fprintf(stdout,"姓名:\t\t%s\n卡号:\t\t%s\n密码:\t\t%s\n存款类别:\t%s\n卡上余额:\t%d\n",count[num].name,count[num].card,count[num].secu,count[num].type,count[num].capital);//输出到屏幕上 fprintf(stdout,"存款日期:\t%d年%d月%d日\n",count[num].in_year,count[num].in_month,count[num].in_day);//日期必须单独输出,否则年月日会向后推移,不能正确对应 fclose(fp);//8个数据 beauty(); puts("请输入今天的日期(年 月 日):"); beauty(); scanf("%d%d%d",&count[num].out_year,&count[num].out_month,&count[num].out_day);//3个数据 t=calculate(count[num].out_year,count[num].out_month,count[num].out_day);//计算天数 beauty(); puts("请输入您取款的金额:"); beauty(); scanf("%d",&por); if(strcmp(count[num].type,"定期存款")==0) fix(); if(strcmp(count[num].type,"活期存款")==0) current(); if(strcmp(count[num].type,"定活两便")==0) time_demand(); if(strcmp(count[num].type,"零存整取")==0) install_qu(); } int calculate(int y_out,int m_out,int d_out) { int t1=0,t2=0,t3=0,y,d1,d2,d3,d=0; for(y=count[num].in_year;y<y_out;y++)//存取年份不同 { if(y%4==0&&y%100!=0||y%400==0) d1=366; else d1=365; d+=d1; } for(int m1=1;m1<m_out;m1++)//计算取款日期是当年的第几天 { if(m1==2) { if(y_out%4==0&&y_out%100!=0||y_out%400==0) d2=29; else d2=28; } else { if(m_out==4||m_out==6||m_out==9||m_out==11) d2=30; else d2=31; } t1+=d2; } for(int m2=1;m2<count[num].in_month;m2++)//计算存款日期是当年的第几天 { if(m2==2) { if(count[num].in_year%4==0&&count[num].in_year%100!=0||count[num].in_day%400==0) d3=29; else d3=28; } else { if(m2==4||m2==6||m2==9||m2==11) d3=30; else d3=31; } t2+=d3; } return(d-t2+1+t1+d_out); } void fix()//定期函数(每月按30天计算,满一年按365天计算) { if(t>=count[num].data_limit*30) { if(count[num].data_limit==3) { puts("您的存款期限为3个月,利率为1.71%");//用printf无法输出% Interest1=count[num].capital*0.0171;//应得利息 tax=Interest1*0.2;//所得税 count[num].interest=Interest1-tax;//实得利息 } if(count[num].data_limit==6) { puts("您的存款期限为6个月,利率为2.07%"); Interest1=count[num].capital*0.0207;//应得利息 tax=Interest1*0.2;//所得税 count[num].interest=Interest1-tax;//实得利息 } if(n==1) { puts("您的存款期限为1年,利率为2.25%"); Interest1=count[num].capital*0.0225;//应得利息 tax=Interest1*0.2;//所得税 count[num].interest=Interest1-tax;//实得利息 } if(n==2) { puts("您的存款期限为2年,利率为2.70%"); Interest1=count[num].capital*0.0207;//应得利息 tax=Interest1*0.2;//所得税 count[num].interest=Interest1-tax;//实得利息 } if(n==3) { puts("您的存款期限为3年,利率为3.24%"); Interest1=count[num].capital*0.0324;//应得利息 tax=Interest1*0.2;//所得税 count[num].interest=Interest1-tax;//实得利息 } if(n>=5) { puts("您的存款期限为5年及以上,利率为3.60%"); Interest1=count[num].capital*0.0360;//应得利息 tax=Interest1*0.2;//所得税 count[num].interest=Interest1-tax;//实得利息 } } else { puts("您的存款期限未满,利率按活期计算为0.72%"); Interest1=count[num].capital*0.0072*t/365;//应得利息 tax=Interest1*0.2;//所得税 count[num].interest=Interest1-tax;//实得利息 } count[num].capital=count[num].capital+count[num].interest-por; use(); } void use() { FILE*fp; if((fp=fopen("g:\\程序\\课程设计\\my_acount.txt","wb"))==NULL) { printf("cann't open file\n"); return; } fwrite(&count[num],sizeof(struct count_user),1,fp);//将信息输出到文件 fclose(fp); beauty(); if((fp=fopen("g:\\程序\\课程设计\\my_acount.txt","rb"))==NULL) { printf("cann't open file\n"); return; } fread(&count[num],sizeof(struct count_user),1,fp);//将信息从文件输出 fprintf(stdout,"姓名:\t\t%s\n卡号:\t\t%s\n密码:\t\t%s\n存款类别:\t%s\n",count[num].name,count[num].card,count[num].secu,count[num].type);//输出到屏幕上 fprintf(stdout,"存款日期:\t%d年%d月%d日\n",count[num].in_year,count[num].in_month,count[num].in_day);//日期必须单独输出,否则年月日会向后推移,不能正确对应 fprintf(stdout,"取款日期:\t%d年%d月%d日\n",count[num].out_year,count[num].out_month,count[num].out_day); printf("您应得利息为:\t%lf\n取款金额为:\t%d\n卡上余额为:\t%lf\n",count[num].interest,por,count[num].capital); fclose(fp); beauty(); inquire(); } void current()//活期函数 { count[num].data_limit=t/30; Interest1=count[num].capital*0.0072*t/365;//应得利息 tax=Interest1*0.2;//所得税 count[num].interest=Interest1-tax;//实得利息 count[num].capital-=por+count[num].interest; use(); } void time_demand()//定活两便函数 { double rate; if(t<90) rate=0.0072; else if(t>=90&&t<180) rate=0.0171*0.6; else if(t>=180&&t<365) rate=0.0207*0.6; else if(t>=365) rate=0.0225*0.6; Interest1=count[num].capital*t*rate/365; tax=Interest1*0.2; count[num].interest=Interest1-tax; count[num].capital+=count[num].interest-por; use(); } void install_cun()//零存整取存款函数 { int m,x,year,month,day; beauty(); puts("请输入您的每月存款金额:"); beauty(); scanf("%d",&m); beauty(); puts("请输入您预计存款的期限:"); puts("【提示:"); puts("\t系统以年读取,请输入整数,期限应不小于1年"); puts(" 利率:"); puts("\t一年: 1.71%"); puts("\t三年: 2.07%"); puts("\t五年: 2.25%"); puts(" 存款开户金额由储户自定,每月存入一次,中途如有漏存,可于次月补存,但次月未补存者则视同违约,到期支取时对违约之前的本金部分按实存金额和实际存期计算利息;违约之后存入的本金部分,按实际存期和活期利率计算利息。】"); puts(" 利息和=(0.5+6)×12×存期年数×年利率×月存金额"); beauty(); scanf("%d",&x); count[num].data_limit=12*x; puts("请输入本次存款日期:"); scanf("%d年%d月%d日",&year,&month,&day); t=calculate(year,month,day); if(t<=30) count[num].capital+=m; if(t>30&&t<=60) count[num].capital+=2*m; if(t>60) puts("您已超过存款期限,本次储蓄违规,不予受理!"); } void install_qu()//零存整取取款函数 { int n=count[num].data_limit/12,k,h; double interest2; if(t<count[num].data_limit*30)//限期内取款按活期计息 { k=t/30;//存期满月数 for(int i=0;i<=k;i++) { Interest1=count[num].capital*0.0072/12; tax=Interest1*0.2; count[num].interest=Interest1-tax; } } else //超限期取款期限内按约定计息,超限后按活期计息 { switch(n) { case 1:rate=0.0171;break; case 3:rate=0.0207;break; case 5:rate=0.0225;break; } h=t/30-count[num].data_limit;//超限月数 Interest1=(0.5+6)*12*n*rate*m;//零存整取利率计算公式:利息和=(0.5+6)×12×存期年数×年利率×月存金额 interest2=count[num].capital*0.0072/12*h; tax=(Interest1+interest2)*0.2; count[num].interest=Interest1+interest2-tax; } count[num].capital+=count[num].interest-por; use(); } void undo() { FILE*fp; num++; beauty(); printf("请输入您的姓名,卡号,密码:"); beauty(); fscanf(stdin,"%s%s%s",count[num].name,count[num].card,count[num].secu);//将信息从键盘写入 beauty(); if((fp=fopen("f:\\程序\\课程设计\\my_acount.txt","r"))==NULL) { printf("cann't open file\n"); return; } for(int i=0;i<num;i++) if(strcmp(count[num].name,count[i].name)==0) { if(count[num].card==count[i].card) num=i; } else { printf("很抱歉,没有查找到您的数据,请您核对后重新输入O(∩_∩)O~~\n"); undo(); } fclose(fp); if((fp=fopen("g:\\程序\\课程设计\\my_acount.txt","w"))==NULL) { printf("cann't open file\n"); return; } for(;!feof(fp);num++) { fprintf(fp,"%s %s %s %s %d %d %lf %d年%d月%d日~%d年%d月%d日",count[num].name,count[num].card,count[num].secu,count[num].type,count[num].data_limit,count[num].capital,count[num].interest,count[num].in_year,count[num].in_month,count[num].in_day,count[num].out_year,count[num].out_month,count[num].out_day);//将信息输出到文件 fclose(fp); } printf("您申请的账户已注销!\n"); inquire(); }