还是那个问题,输出时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();
}








