#include <stdio.h>
#include <stdlib.h>//清屏头文件
#include<conio.h>//getch头文件
#include<string.h>//字符类
struct uses
{
char usename[20];
char password[7];
int account;
float money;
}user,t;
//int count=0;//记录元素的个数
int f=0;//标记是否找到匹配账号 0未找到 1找到
int find;//记录找到的结构体变量在数组中的下标
int isLogout;//标记是否注销
int dFind;//记录找到的用户
FILE *fp;
void getMoney()//取款
{
int money;
system("cls");
printf("\n\n\t\t\t\t\t您正在使用取款功能");
printf("\n\n\t\t\t\t\t请输入取款金额:");
scanf("%d",&money);
if(money>user.money)
printf("\n\n\t\t\t\t\t操作失败,您的余额不足");
else
{
if(money>2000)
printf("\n\n\t\t\t\t\t单次取款不能超过两千");
else
{
user.money=user.money-money;
fseek(fp,-sizeof(user),1);
fwrite(&user,sizeof(user),1,fp);
printf("\n\n\t\t\t\t\t操作成功");
}
}
}
void saveMoney()//存款
{
int money;
system("cls");
printf("\n\n\t\t\t\t\t您正在使用存款功能");
printf("\n\n\t\t\t\t\t请输入存款金额:");
scanf("%d",&money);
if(money>10000)
{
printf("\n\n\t\t\t\t\t单次存款不能超过一万");
}
else
{
user.money=user.money+money;//修改了内存中的用户余额
fseek(fp,-sizeof(user),1);
fwrite(&user,sizeof(user),1,fp);
printf("\n\n\t\t\t\t\t操作成功");
}
}
void selectMoney()//查询
{
system("cls");
printf("\n\n\t\t\t\t\t您正在使用余额查询功能");
printf("\n\n\t\t\t\t\t您的余额是:%.2fRMB",user.money);
}
void login()//登录
{
char password[100];
int account;
int length;
fp=fopen("atm.txt","rb+");
if(fp==NULL)
{
printf("\n\n\n\n\t\t\t\t文件丢失");
}
system("cls");
printf("\n\n\n\n\t\t\t\t登录页面");
printf("\n\n\n\n\t\t\t\t请输入账号:");//获取输入账号
scanf("%d",&account);//依次获取结构体的元素
fseek(fp,0,2);//将文件指针指向文件的末尾
length=ftell(fp);//获取此时指针相对文件起始偏移量
rewind(fp);
while(ftell(fp)<length)
{
fread(&user,sizeof(user),1,fp);
//将输入的账号与结构体数组的元素的账号进行比对
if(user.account==account)
{
f=1;
break;
}
}
if(f==1)
{
for(int j=0;j<3;j++)
{
printf("\n\n\t\t\t\t请输入密码:");
fflush(stdin);
inputPass(password);
if(strcmp(user.password,password)==0)
{
printf("\n\n\n\n\t\t\t\t登陆成功");
printf("\n\n\n\n\t\t\t\t进入服务页面.....");
getch();
service();
break;
}
else
{
if(j==2)
{
printf("\n\n\n\n\t\t\t\t您输入的密码3次错误,请返回主页面!");
break;
}
printf("\n\n\n\n\t\t\t\t密码错误,请重新输入");
}
}
}
else
printf("\n\n\t\t\t\t您输入的账号有误,请重新输入");
}
void transMoney()//转账
{
int money;
int account;
int n=ftell(fp);
struct uses t;
system("cls");
printf("\n\n\t\t\t\t\t您正在使用转账功能");
printf("\n\n\t\t\t\t\t请输入对方账号:");
scanf("%d",&account);
fseek(fp,0,2);
int length=ftell(fp);
rewind(fp);
while(ftell(fp)<length)
{
fread(&t,sizeof(t),1,fp);
if(t.account==account)
{
f=1;
break;
}
}
if(f==1)
{
printf("\n\n\t\t\t\t\t请输入转账金额:");
scanf("%d",&money);
if(money>user.money)
printf("\n\n\t\t\t\t\t操作失败,余额不足");
else
{
user.money=user.money-money;
t.money=t.money+money;
fseek(fp,-sizeof(t),1);
fwrite(&t,sizeof(t),1,fp);
fseek(fp,n-sizeof(user),0);
fwrite(&user,sizeof(user),1,fp);
printf("\n\n\t\t\t\t\t操作成功!");
}
}
else
printf("\n\n\t\t\t\t\t对方账号不存在!");
}
void updatePassword()//修改密码
{
char oldPassword[100];
char rePassword[100];
char newPassword[100];
for(int i=0;i<3;i++)
{
system("cls");
printf("\n\n\t\t\t\t您在使用修改密码的功能");
printf("\n\n\t\t\t\t请输入原始密码:");
fflush(stdin);
inputPass(oldPassword);
if(strcmp(user.password,oldPassword)==0)
{
break;
}
else
{
if(i==2)
{
printf("\n\n\t\t\t\t原始密码输入错误三次,已锁定!");
return;
}
printf("\n\n\t\t\t\t原始密码错误,请重新输入!");
printf("\n\n\t\t\t\t按任意键继续...");
getch();
}
}
while(1)
{
printf("\n\n\t\t\t\t请输入6位新密码:");
fflush(stdin);
inputPass(newPassword);
if(strlen(newPassword)!=6)
{
printf("\n\n\t\t\t\t密码输入有误,请输入6位密码");
continue;
}
printf("\n\n\t\t\t\t请再次输入新密码:");
fflush(stdin);
inputPass(rePassword);
if(strcmp(newPassword,rePassword)==0)
{
strcpy(user.password,newPassword);
fseek(fp,-sizeof(user),1);
fwrite(&user,sizeof(user),1,fp);
printf("\n\n\t\t\t\t密码修改成功");
break;
}
else
printf("\n\n\t\t\t\t两次密码输入不一致,请重新输入");
printf("\n\n\t\t\t\t按任意键继续.....");
getch();
}
}
void service()//服务
{
char chose;
while(1)
{
system("cls");
printf("\n\n\n\n\t\t\t\t\t\t欢迎进入服务界面");
printf("\n\n\n\t\t\t\tA.查询余额");
printf("\t\t\t\tB.存款");
printf("\n\n\t\t\t\tC.取款");
printf("\t\t\t\t\tD.转账");
printf("\n\n\t\t\t\tE.修改密码");
printf("\t\t\t\tF.注销");
printf("\n\n\n\n\t\t\t\t\t\t G.退出系统");
printf("\n\n\t\t\t\t\t\t 请选择");
fflush(stdin);
scanf("%c",&chose);
//int isLogout;
switch(chose)
{
case 'A':
case 'a':selectMoney();
break;
case 'B':
case 'b':saveMoney();
break;
case 'C':
case 'c':getMoney();
break;
case 'D':
case 'd':transMoney();
break;
case 'E':
case 'e':updatePassword();
break;
case 'F':
case 'f':
isLogout=logout();
if(isLogout==1)
{
fclose(fp);
return;
}
break;
case 'G':
case 'g':quit();break;
default:
printf("\t\t\t\t\t\n\n\n您的输入有误,请重新输入");
}
printf("\n\n\t\t\t\t按任意键继续....");
getch();
}
}
void quit()//退出
{
char choise;
printf("\n\t\t\t\t\t\t确定退出系统,Y是 N否");
fflush(stdin);
printf("\n\n\t\t\t\t\t");
scanf("%c",&choise);
if(choise=='Y'||choise=='y')
{
system("cls");
printf("\n\n\t\t\t\t正在退出,请稍后...");
exit(0);
}
else
return;
}
//struct uses user[100];
void loading()//加载
{
int t=1;
for(int i=1;i<=100;i++)
{
printf("\n\n\n\n\t\t\t\t欢迎使用ATM系统,请稍后");
printf("%d%%",i);
for(int k=1;k<=t;k++)
printf(".");
t++;
if(t==11)
t=1;
for(int j=0;j<100000,0;j++);//延迟
system("cls");
}
}
void inputPass(char pass[7])//输入
{
char ch;//获得用户输入的第一个字符
int i=0;
while(1)
{
ch=getch();//判断输入的是否是回车
if(ch!='\r')// \r是回车
{
if(ch!='\b')// \b是退格
{
pass[i]=ch;
i++;
printf("*");
}
else if(i>0)//只有在i>0时,才删掉* `
{
i--;
printf("\b \b");//退格,用空格代替那个字符,然后退格
}
}
else
break;
}
pass[i]='\0';
}
void regist()//注册
{
fp=fopen("atm.txt","ab+");
if(fp==NULL)
{
printf("文件操作失败");
return;
}
system("cls");
char rePassword[20];
struct uses t;
printf("\n\n\n\n\t\t\t\t注册页面");
printf("\n\n\t\t\t\t请输入用户名:");
fflush(stdin);//字符缓冲区
gets(user.usename);
while(1)
{
while(1){
printf("\n\n\t\t\t\t请输入6位密码:");
fflush(stdin);
inputPass(user.password);
int length=strlen(user.password);//判断密码的长度
if(length==6)
break;
else
printf("\n\n\t\t\t\t您的输入有误,请重新输入6位密码!");
}
printf("\n\n\t\t\t\t请确认您的密码:");
inputPass(rePassword);
fflush(stdin);
if(strcmp(user.password,rePassword)==0)
{
rewind(fp);
if(fread(&t,sizeof(t),1,fp)==1)
{
//此时指针指向的是文件的末尾
//1.将指针向前移动sizeof(user)位
fseek(fp,-sizeof(t),2);
//2.从此时的指针位置开始读取sizeof(user)位
//3.将读取的数据赋值给一个临时变量(上一个注册的用户)
fread(&t,sizeof(t),1,fp);
//4.取出这个临时变量的账号
user.account=t.account+1;
}
else{
user.account=20180001;
}
fseek(fp,0,2);
fwrite(&user,sizeof(user),1,fp);
printf("\n\n\t\t\t\t 注册成功");
//count++;
printf("\n\n\t\t\t\t账号为:%d",user.account);
fclose(fp);
getch();
break;
}
else
printf("\n\n\t\t\t\t两次密码输入不一样,请重新输入!");
}
}
int logout()//注销
{
char choise;
int isLogout;
printf("\n\t\t\t\t\t\t%s确定注销?Y是 N否",user.usename);
fflush(stdin);
printf("\n\n\t\t\t\t\t");
scanf("%c",&choise);
if(choise=='Y'||choise=='y')
{
isLogout=1;
}
else{
isLogout=0;
}
return isLogout;
}
main()
{
char z;
printf("\n\n\n\n\t\t\t\t***********欢迎使用ATM系统***********");
printf("\n\n\t\t\t\t\t\t注意事项");
printf("\n\n\t\t\t\t请保管好自己身上的财物,观察身边周围的环境");
printf("\n\n\n\t\t\t\t\t 如果继续,请输入");
printf("\n\n\n\t\t\t\t\t\tY是 N否");
printf("\n\n\t\t\t\t\t");
fflush(stdin);
scanf("%c",&z);
system("cls");
if(z=='Y'||z=='y')
{
loading();
while(1)
{
printf("\n\n\n\n\t\t\t\t\t*****************************");
printf("\n\n\n\n\t\t\t\t\t\ta.用户注册");
printf("\n\n\t\t\t\t\t\tb.用户登录");
printf("\n\n\t\t\t\t\t\tc.退出系统");
printf("\n\n\n\n\t\t\t\t\t*****************************");
printf("\n\n\t\t\t\t\t\t请输入选项:");
char choise;
fflush(stdin);//字符缓冲区 把空格和回车那种特殊的字符缓冲掉
scanf("%c",&choise);
if(choise=='a'||choise=='A')
regist();//执行注册函数
else if(choise=='b'||choise=='B')
{
login();
}
else if(choise=='c'||choise=='C'){
system("cls");
quit();
}
else
printf("\n\n\t\t\t\t您的输入有误,请重新输入");
getch();
system("cls");//清屏
}
}
else if(z=='N'||z=='n'){
printf("\n\n\t\t\t\t正在退出.....");
getch();
fflush(stdin);
system("cls");//清屏
}
}