C语言ATM程序设计.docx
《C语言ATM程序设计.docx》由会员分享,可在线阅读,更多相关《C语言ATM程序设计.docx(15页珍藏版)》请在冰豆网上搜索。
![C语言ATM程序设计.docx](https://file1.bdocx.com/fileroot1/2022-12/18/3b7c64c4-f466-40b9-8194-f5072962894b/3b7c64c4-f466-40b9-8194-f5072962894b1.gif)
C语言ATM程序设计
C语言程序实践
实验报告
姓名
学号
班级
指导教师
开设学期
开设时间
实验题目
自动取款机程序设计
实验日期
评定成绩
评定人签字
评定日期
一、实验目的
1.函数的调用
2.结构体的使用
3.文件的应用:
打开、关闭、输入、输出等
4.宏定义
二、实验内容与实验步骤
实验内容、原理分析
1.给出数据结构或函数定义
结构体:
structclients
{
longintcard_number,card_password;
charname[20];
floatmoney;
}yonghu[3];
card_number:
银行卡号
card_password:
密码
name:
用户名
money:
卡内金额
自定义函数:
voidfuction(float,int);
用于登陆后的操作
2.用流程图表示出来程序设计的思想
3.给出具体实验步骤
#include
#include
#defineN3/*用户人数*/
structclients
{
longintcard_number,card_password;
charname[20];
floatmoney;
}yonghu[N];
FILE*fp;
inti;
voidfuction(float,int);
voidmain()
{
intj,number,password,times1=3,times2=3;
printf("欢迎使用中国建设银行自动取款机!
\n");
fp=fopen("clients.txt","a+");
if(getw(fp)==EOF)
{
printf("用户文件未设置!
\n");
for(i=0;i{
printf("请输入第%d位用户的信息:
\n",i+1);
printf("银行卡号密码用户名卡内金额\n");
scanf("%d%d%s%f",&yonghu[i].card_number,&yonghu[i].card_password,yonghu[i].name,&yonghu[i].money);
if(i==1)
{
while((yonghu[i].card_number==yonghu[i-1].card_number)||(yonghu[i].card_password==yonghu[i-1].card_password))
{
printf("输入信息有重复!
请重新输入\n");
printf("请输入第%d位用户的信息:
\n",i+1);
printf("银行卡号密码用户名卡内金额\n");
scanf("%d%d%s%f",&yonghu[i].card_number,&yonghu[i].card_password,yonghu[i].name,&yonghu[i].money);
}
}
if(i==2)
{
while((yonghu[i].card_number==yonghu[i-1].card_number)||(yonghu[i].card_password==yonghu[i-1].card_password)||(yonghu[i].card_number==yonghu[i-2].card_number)||(yonghu[i].card_password==yonghu[i-2].card_password))
{
printf("输入信息有重复!
请重新输入\n");
printf("请输入第%d位用户的信息:
\n",i+1);
printf("银行卡号密码用户名卡内金额\n");
scanf("%d%d%s%f",&yonghu[i].card_number,&yonghu[i].card_password,yonghu[i].name,&yonghu[i].money);
}
}
fprintf(fp,"%d%d%s%f",yonghu[i].card_number,yonghu[i].card_password,yonghu[i].name,yonghu[i].money);
putc('\n',fp);
}
}
fclose(fp);
printf("\n\n请登录系统\n");/*登录系统,输入卡号和密码*/
printf("请输入您的银行卡号:
\n");
scanf("%d",&number);
printf("请输入您的密码:
\n");
scanf("%d",&password);
fp=fopen("clients.txt","r+");
for(i=0;i{
fscanf(fp,"%d%d%s%f",&yonghu[i].card_number,&yonghu[i].card_password,yonghu[i].name,&yonghu[i].money);
}
fclose(fp);
for(i=0;i{
if((number!
=yonghu[0].card_number)&&(number!
=yonghu[1].card_number)&&(number!
=yonghu[2].card_number))
{
if((times1-1)!
=0)
{
printf("该用户不存在!
您还有%d次尝试机会\n",times1-1);
printf("请输入您的银行卡号:
\n");
scanf("%d",&number);
printf("请输入您的密码:
\n");
scanf("%d",&password);
i=-1;
}
else
{
printf("尝试失败!
请按任意键退出:
\n");
exit(0);
}
times1--;
}
else
{
if(number==yonghu[i].card_number)
{
if(password==yonghu[i].card_password)
{
printf("%s登陆成功!
请继续您的操作\n",yonghu[i].name);
j=i;
i=5;/*登陆成功,退出循环*/
}
else
{
if((times2-1)!
=0)
{
printf("密码输入错误!
您还有%d次尝试机会\n",times2-1);
printf("请输入您的密码:
\n");
scanf("%d",&password);
i=-1;
}
else
{
printf("尝试失败!
请按任意键退出:
\n");
exit(0);
}
times2--;
}
}
}
}
fuction(yonghu[j].money,j);
}
voidfuction(floatm,intk)
{
floatsaved_money,fetched_money,payment;
intphone_num,x,old_password,new_password;
while
(1)
{
printf("1.存款.\n2.取款.\n3.充话费.\n4.修改密码.\n5.显示菜单.\n0.退出系统.\n");
scanf("%d",&x);
switch(x)
{
case0:
printf("退出系统!
");
exit(0);
case1:
printf("卡内金额:
%f\n",m);
printf("请输入存款金额:
\n");
scanf("%f",&saved_money);
while(saved_money<0)
{
printf("输入有误!
请重新输入!
\n");
printf("请输入存款金额:
\n");
scanf("%f",&saved_money);
}
m+=saved_money;
printf("操作成功!
卡内余额为:
%f\n",m);
yonghu[k].money=m;
fp=fopen("clients.txt","w+");
for(i=0;i{
fprintf(fp,"%d%d%s%f",yonghu[i].card_number,yonghu[i].card_password,yonghu[i].name,yonghu[i].money);
putc('\n',fp);
}
fclose(fp);
break;
case2:
printf("卡内金额:
%f\n",m);
printf("请输入取款金额:
\n");
scanf("%f",&fetched_money);
m-=fetched_money;
while((fetched_money<0)||(m<0))
{
printf("输入有误!
请重新输入!
\n");
m+=fetched_money;
printf("请输入取款金额:
\n");
scanf("%f",&fetched_money);
m-=fetched_money;
}
printf("操作成功!
卡内余额为:
%f\n",m);
yonghu[k].money=m;
fp=fopen("clients.txt","w+");
for(i=0;i{
fprintf(fp,"%d%d%s%f",yonghu[i].card_number,yonghu[i].card_password,yonghu[i].name,yonghu[i].money);
putc('\n',fp);
}
fclose(fp);
break;
case3:
printf("卡内金额:
%f\n",m);
printf("请输入电话号码:
\n");
scanf("%d",&phone_num);
printf("请输入所交话费金额:
\n");
scanf("%f",&payment);
m-=payment;
while((payment<0)||(m<0))
{
printf("输入有误!
请重新输入!
\n");
m+=payment;
printf("请输入所交话费金额:
\n");
scanf("%f",&payment);
m-=payment;
}
printf("操作成功!
卡内余额为:
%f\n",m);
yonghu[k].money=m;
fp=fopen("clients.txt","w+");
for(i=0;i{
fprintf(fp,"%d%d%s%f",yonghu[i].card_number,yonghu[i].card_password,yonghu[i].name,yonghu[i].money);
putc('\n',fp);
}
fclose(fp);
break;
case4:
while
(1)
{
printf("请输入原密码:
\n");
scanf("%d",&old_password);
if(old_password==yonghu[k].card_password)
{
printf("请输入新密码:
\n");
scanf("%d",&new_password);
printf("密码修改成功!
\n");
yonghu[k].card_password=new_password;
fp=fopen("clients.txt","w+");
for(i=0;i{
fprintf(fp,"%d%d%s%f",yonghu[i].card_number,yonghu[i].card_password,yonghu[i].name,yonghu[i].money);
putc('\n',fp);
}
fclose(fp);
break;
}
else
printf("密码输入错误!
\n");
}
break;
case5:
break;
default:
printf("输入有误!
请重新输入!
\n");
break;
}
}
}
三、实验过程与结果分析
1.现象:
输入用户信息后,在登录系统时,输入第一个用户的信息,提示该用户不存在
解决方法:
fp=fopen("clients.txt","r+");
for(i=0;i{
fscanf(fp,"%d%d%s%f",&yonghu[i].card_number,&yonghu[i].card_password,yonghu[i].name,&yonghu[i].money);
}
fclose(fp);
2.现象:
登录系统时,输入卡号或密码超过3次错误后,仍能输入
解决方法:
增加变量times1=3(卡号输入错误的次数),times2=3(密码输入错误的次数),当times-1>0时,提示剩余尝试机会,当times-1=0时,退出程序
3.现象:
存取款或充话费时,输入负数仍能运行
解决方法:
增加循环:
while(saved_money<0)
{
printf("输入有误!
请重新输入!
\n");
printf("请输入存款金额:
\n");
scanf("%f",&saved_money);
}
while((fetched_money<0)||(m<0))
{
printf("输入有误!
请重新输入!
\n");
m+=fetched_money;
printf("请输入取款金额:
\n");
scanf("%f",&fetched_money);
m-=fetched_money;
}
while((payment<0)||(m<0))
{
printf("输入有误!
请重新输入!
\n");
m+=payment;
printf("请输入所交话费金额:
\n");
scanf("%f",&payment);
m-=payment;
}
四、实验结果总结
五、创新的部分
1.输入用户信息时,卡号与密码不可重复
2.登录系统时,如果卡号或密码输入错误达三次,则自动退出程序
3.为手机充话费时,要求输入电话号码
4.存款、取款、充话费时,输入钱数不能为负数,且当取款或充话费的金额超过卡内余额时,禁止此操作
5.增加了修改密码的功能
六、对实验的意见与建议
1.心得体会:
实验过程中应反复调试,不断发现问题,解决问题
2.不足:
输入用户信息或输入x值时,如果格式不正确,就会陷入死循环