#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "conio.h"//getch()函数头文件
#define MAX 10
int id;//用户id
int c;//用户结构体数组下标
int count=0;// 读入用户条数
char filename[]="d:\\代码\\ATM项目\\123.txt"; //文件路径
//====================================
//定义用户结构体======================
typedef struct user
{
int id;
char name[20];//一个汉字为2个字节
char password[7];//需用字符串存放密码,若用int,则002022为2022
float money;
}AC;
AC a[MAX];
//声明函数============================================================================
//====================================================================================
void menu();//功能界面函数
int userlogin();//用户登陆函数
int system_in();//系统函数
void update(FILE *fp);//用户信息更新函数
void money_cut();//取款函数
void money_add();//存款函数
void infor_view();//用户信息查询函数
void password_reset();//重置密码函数
void money_transfer();//转账函数
void system_ready(FILE *fp);//系统初始化函数
AC typeChang(char *ch);//将字符串转换成一个结构体变量
void password_into(char *p);//密码输入函数(包括密码输入合法性检测)
//=====================================================================================
//=====================================================================================
int main()
{
FILE *fp=fopen(filename,"r+");
if(fp==NULL)
exit(0);
system_ready(fp);
if(userlogin()==1)
system_in();//调用系统函数(进入系统)
update(fp);//更新用户信息
fclose(fp);
puts("感谢使用");
return 0;
}
//===============================================
//功能:将字符串转换成一个结构体变量
//作者:史继炜
//时间:2019.5.13
AC typeChang(char *ch)//用字符型指针接收字符数组(字符数组首地址)
{
AC t;
char *p;
p=strtok(ch,";");
printf("%d\n",sscanf(p,"%d",&t.id));
//-------------------------
p=strtok(NULL,";");
printf("%d\n",sscanf(p,"%s",t.name));
//-------------------------
p=strtok(NULL,";");
printf("%d\n",sscanf(p,"%s",t.password));
//--------------------------
p=strtok(NULL,";");
printf("%d\n",sscanf(p,"%f",&t.money));
return t;
}
//====================================================================
//读取用户信息 (系统初始化)
void system_ready(FILE *fp)
{
int i=0;
char ch[80];
char *t;
while(!feof(fp))
{
t=fgets(ch,sizeof(ch),fp);
if(count>=MAX)
{
printf("该系统只能读取%d个用户信息\n",MAX);
break;
}
//----------------------------------------------
if(t!=NULL)//将用户信息读入结构体变量
{
a[i]=typeChang(t);
i++;
count++;
}
}
}
//======================================================
//功能界面函数
void menu()
{
puts("================================");
puts("1、取款 2、存款 3、查询 ");
puts("4、改密码 5、转账 6、退出 ");
puts("================================");
}
//=====================================================
//功能:密码输入(输入的密码用*覆盖,包含密码输入合法性)
//时间:2019.5.13
//作者:史继炜
void password_into(char *p)
{
int i=0;//密码字符数组下标
char ch;
while(i<6)//密码长度6位
{
ch=getch();
if(ch>='0'&&ch<='9')//密码的输入只能为数字
{
p[i]=ch;
putchar('*');
i++;
}
else
{
puts("请输入合法的密码格式(数字0-9)");
i=0 ;
}
}
p[i]='\0';
printf("\n");
}
//====================================================
//用户登陆
int userlogin()
{
char password_s[7];
int t=0;
//-------------------------------------------------------
puts("请输入id");
while(1)
{
scanf("%d",&id);//敲回车时,键盘缓冲区存在一个\n,会影响下一次输入 ;解决方法:在两次输入之间用fflush(stdin)函数清空或getchar()将\n接收
fflush(stdin);//清空键盘缓冲区
for(c=0;c<count;c++)
{
if(id==a[c].id)//同时确定了用户在结构体数组中的下标
break;
}
if(id==a[c].id)
break;
puts("id不存在,请重新输入");
}
//-------------------------------------------------------
puts("输入密码");
while(t<3)
{
password_into(password_s);//调用密码输入函数
system("cls");
if(strcmp(password_s,(a[c].password))==0)//函数strcmp(str1,str2)比较两个字符串,若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
return 1;
else
{
t++;
puts("密码错误,重新输入密码");
}
}
puts("记不住密码就莫来了");
return 0;
}
//======================================================
//系统函数(用户登陆后进入,可调用其它功能函数)
int system_in()
{
int i;
menu();//调用菜单
while(1)
{
scanf("%d",&i);
getchar();
if(i>=0&&i<=6)
break;
puts("请根据界面选择正确的功能");
}
system("cls");
switch(i)
{
case 1:money_cut();break;
case 2:money_add();break;
case 3:infor_view();break;
case 4:password_reset();break;
case 5:money_transfer();break;
case 6:return 0;
}
}
//=======================================================================================
//改密码功能函数
void password_reset()
{
char password_s[7];
char password_1[7],password_2[7];
puts("请输入原密码:");
while(1)
{
password_into(password_s);
if(strcmp(password_s,a[c].password)==0)
break;
puts("密码错误,请重新输入原密码:");
}
puts("请输入新密码:");
while(1)
{
password_into(password_1);
puts("请再次输入新密码:");
password_into(password_2);
if(strcmp(password_1,password_2)==0)
break;
puts("两次输入的新密码不相同,请重新输入新密码:");
}
strcpy(a[c].password,password_1);
puts("修改密码成功!");
system("pause");
system("cls");
system_in();
}
//======================================================================================
//存款功能函数
void money_add()
{
float m;
puts("输入存款金额");
scanf("%f",&m);
fflush(stdin);
a[c].money=a[c].money+m;
puts("存款成功");
system("pause");
system("cls");
system_in();
}
//=======================================================================================
//取款功能函数
void money_cut()
{
float m;
printf("输入取款金额,取款金额不可大于2000元\n");
while(1)
{
scanf("%f",&m);
fflush(stdin);
if(m<=a[c].money&&m>=0&&m<2000)
break;
puts("醒醒!你的钱没那么多!!!,重新输入取款金额:");
}
a[c].money=a[c].money-m;
puts("取款成功!");
printf("目前的余额:%f元\n",a[c].money);
system("pause"); //getchar()按回车键继续
system("cls");
system_in();
}
//=======================================================================================
//查询功能函数
void infor_view()
{
printf("账户ID:%d\n",a[c].id);
printf("姓名:%s\n",a[c].name);
printf("密码:%s\n",a[c].password);
printf("余额:%f\n",a[c].money);
system("pause");
system("cls");
system_in();
}
//=======================================================================================
//转账功能函数
void money_transfer()
{
int i;
float m;//转账金额
puts("请输入转账账号");
while(1)
{
scanf("%d",&i);
if(i>4)
puts("转账账号无效,请重新输入");
else
break;
}
puts("请输入转账金额");
while(1)
{
scanf("%f",&m);
if(m>a[c].money)
puts("您没那么多钱,请重新输入");
else
break;
}
a[c].money=a[c].money-m;
a[i-1].money=a[i-1].money+m;
puts("转账成功!");
printf("目前的余额:%f\n",a[c].money);
system("pause");
system("cls");
system_in();
}
//=======================================================================================
//退出系统功能函数(更新用户信息)
void update(FILE *fp)
{
rewind(fp);
for(c=0;c<count-1;c++)
{
fprintf(fp,"%d;%s;%s;%f\n",a[c].id,a[c].name,a[c].password,a[c].money);
}
fprintf(fp,"%d;%s;%s;%f",a[count-1].id,a[count-1].name,a[count-1].password,a[count-1].money);
}
链接:https://blog.csdn.net/weixin_44366851/article/details/89930964