C语言ATM程序设计
令狐采学创作
C语言程序实践
令狐采学
实验报告
令狐采学创作
一、实验目的
1.函数的调用
2.结构体的使用
3.文件的应用:打开、关闭、输入、输出等
4.宏定义
二、实验内容与实验步骤
实验内容、原理分析
1.给出数据结构或函数定义
结构体:
struct clients
{
longintcard_number,card_password;
char name[20];
float money;
}yonghu[3];
card_number:银行卡号
card_password:密码
name:用户名
money:卡内金额
自定义函数:
voidfuction(float,int);
用于登陆后的操作
2.用流程图表示出来程序设计的思想
#include
#define N 3 /*用户人数*/ struct clients
{
longintcard_number,card_password;
char name[20];
float money;
}yonghu[N];
FILE *fp;
inti;
voidfuction(float,int);
void main()
{
int j,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,&y onghu[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,yo nghu[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)&&(numb er!=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(float m,int k) { 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) { case 0: printf("退出系统!"); exit(0); case 1: 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,yo nghu[i].money); putc('\n',fp); } fclose(fp); break; case 2: 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,yo nghu[i].money); putc('\n',fp); } fclose(fp); break; case 3: 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,yo nghu[i].money); putc('\n',fp); } fclose(fp); break; case 4: 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,yo nghu[i].money); putc('\n',fp); } fclose(fp); break; } else printf("密码输入错误!\n"); } break; case 5: 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值时,如果格式不正确,就会陷入死循环