资源描述
C语言程序实践
实验报告
姓 名
学 号
班 级
指 导 教 师
开 设 学 期
开 设 时 间
实验题目
自动取款机程序设计
实验日期
评 定 成 绩
评定人签字
评 定 日 期
一、实验目得
1、函数得调用
2、结构体得使用
3、文件得应用:打开、关闭、输入、输出等
4、宏定义
二、实验内容与实验步骤
实验内容、原理分析
1. 给出数据结构或函数定义
结构体:
struct clients
{
long int card_number,card_password;
char name[20];
float money;
}yonghu[3];
card_number:银行卡号
card_password:密码
name:用户名
money:卡内金额
自定义函数:
void fuction(float,int);
用于登陆后得操作
2. 用流程图表示出来程序设计得思想
开始
用户文件就是否存在
创建文件
输入用户信息
信息就是否重复
输入卡号与密码
错误就是否超过三次
输入信息就是否正确
输入0
输入其她
输入5
输入4
输入3
输入2
存款
输入1
输入错误
修改密码
显示菜单
充话费
取款
结束
3.给出具体实验步骤
#include <stdio、h>
#include <stdlib、h>
#define N 3 /*用户人数*/
struct clients
{
long int card_number,card_password;
char name[20];
float money;
}yonghu[N];
FILE *fp;
int i;
void fuction(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<N;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[i1]、card_number)||(yonghu[i]、card_password==yonghu[i1]、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[i1]、card_number)||(yonghu[i]、card_password==yonghu[i1]、card_password)||(yonghu[i]、card_number==yonghu[i2]、card_number)||(yonghu[i]、card_password==yonghu[i2]、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<N;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<N;i++) /*判断卡号及密码就是否匹配*/
{
if((number!=yonghu[0]、card_number)&&(number!=yonghu[1]、card_number)&&(number!=yonghu[2]、card_number))
{
if((times11)!=0)
{
printf("该用户不存在!您还有%d次尝试机会\n",times11);
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((times21)!=0)
{
printf("密码输入错误!您还有%d次尝试机会\n",times21);
printf("请输入您得密码:\n");
scanf("%d",&password);
i=1;
}
else
{
printf("尝试失败!请按任意键退出:\n");
exit(0);
}
times2;
}
}
}
}
fuction(yonghu[j]、money,j);
}
void fuction(float m,int k)
{
float saved_money,fetched_money,payment;
int phone_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<N;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;
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<N;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;
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<N;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;
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<N;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;
case 5:
break;
default:
printf("输入有误!请重新输入!\n");
break;
}
}
}
三、实验过程与结果分析
1、现象:输入用户信息后,在登录系统时,输入第一个用户得信息,提示该用户不存在
解决方法:
fp = fopen("clients、txt","r+");
for(i=0;i<N;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(密码输入错误得次数),当times1>0时,提示剩余尝试机会,当times1=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值时,如果格式不正确,就会陷入死循环
展开阅读全文