#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#define N 20
void Initial(); //初始化界面
void BuildUser(); //管理员新建用户
int UserLogin(); //用户登陆界面
void AdminLogin(); //管理员登陆界面
void Menu(int n); //主界菜单
void ChangePassword(); //密码修改
typedef struct User
{
char UserID[N]; //用户ID
char Name[N]; //姓名
char UserPassword[N]; //用户密码
float money; //用户当前余额
char time[N]; //用户最后一次使用系统时间
}USERDATA;
typedef struct D
{
char id[N];
char o;
char money;
char balance;
char tim[N];
}PDATA;
float MoneySave(struct User *p);
float DrawMoney(struct User *p);
float Trans(struct User *p);
void Balance();
USERDATA userdata[500];
int main()
{
system("cls");
system("title ATM终端模拟系统");
system("color 0b");
Initial();
//printf("调试");
}
void Initial()
{
int a,ret,b;
do{ //错误输入非1或2,重新输入
printf("\n\n\n\n\n\n \n");
printf(" *欢迎使用ATM终端服务系统*\n");
printf(" \n\n\n");
printf(" _________________________________________________\n");
printf(" | 1 用户登录 |\n\n\n");
printf(" _________________________________________________\n");
printf(" | 2 前台服务 |\n\n\n\n\n\n\n");
printf(" ");
system("date /t");
printf(" ");
system("time /t");
do{ //实现检错,错误输入重新输
printf(" 请输入您的选择 ;\n");
printf(" ");
scanf("%d",&a);
switch(a) //初始选项 非1,2重新输入。
{
case 1: b=1;break;
case 2: b=1;break;
default:
printf(" ");
printf("错误输入,请重试。\n");break;
}
getchar();
}while(b!=1);
if(a==1)
{
ret=UserLogin();
Menu(ret);
ret=1;
}
else if(a==2)
{
system("cls"); //清屏
AdminLogin();
ret=1;
}
}while(ret!=1);
}
int UserLogin()
{
char a[N],b[N];
FILE *fp;
if((fp=fopen("iddata.txt","a+"))==NULL)
{
printf("打开失败\n");
exit(0);
}
int i=0,j,k=0,s;
do{
fscanf(fp,"%s%s%s%f",&userdata[i].Name,&userdata[i].UserID,&userdata[i].UserPassword,&userdata[i].money);
i++;
}while(!feof(fp));
fclose(fp);
printf(" ");
printf("请输入用户账号:\n");
printf(" ");
gets(a);
printf(" ");
printf("请输入用户密码:\n");
printf(" ");
gets(b);
for(j=0;j<i;j++)
{
if(strcmp(a,userdata[j].UserID)==0)
{
for(k=0;k<3;k++)
{
if(strcmp(b,userdata[j].UserPassword)==0) return j;
else
{
printf(" ");
printf("密码错误请重新输入:\n");
printf(" ");
gets(b);
}
}
printf(" ");
printf("密码已输入错误三次,即将退出程序。\n");
printf(" ");
getch();
exit(0);
}
}
printf("查无该用户,请检查后重新输入。\n");
UserLogin();
}
void AdminLogin()
{
char adminID[N]="1",adminPassword[N]="1";//管理员id 和 密码
char a[N],b[N];
int i=0,j=0,s;
/* FILE *fp;
if((fp=fopen("admin.txt","r"))==NULL)
{
printf("Failure to open admin.txt!\n");
exit(0);
}
fscanf(fp,"%s%s",adminID,adminPassword); //将管理员的ID和Password从文件中读入内存
fclose(fp);*/
do{
printf(" ");
printf("请输入管理员账号:\n");
printf(" ");
gets(a);
printf(" ");
printf("请输入管理员密码:\n");
printf(" ");
gets(b);
if(strcmp(a,adminID)==0) //判断管理员账号是否相同
{
if(strcmp(b,adminPassword)==0)
{
printf("登陆成功,请按任意键开始录入用户。\n");
getch();
system("cls");
BuildUser();
printf("录入完成,退出程序");
exit(0);
}
else
{
printf("密码错误,请重新输入。\n");
s=1;
}
}
else
{
printf("账号密码不匹配,请重试。\n");
s=1;
}
if(s==1)
{
getch();
system("cls");
}
}while(s==1);
}
void Menu(int n)
{
FILE *fp,*fp1;
time_t timep;
time(&timep);
int i=0,o;float money=0;
if((fp=fopen("iddata.txt","a+"))==NULL)
{
printf("打开失败\n");
exit(0);
}
do{
fscanf(fp,"%s%s%s%f",&userdata[i].Name,&userdata[i].UserID,&userdata[i].UserPassword,&userdata[i].money);
i++;
}while(!feof(fp)); //printf("调试");
fclose(fp);
char path[30]="G:\\1\\ATM\\private_record\\",suffix[]=".txt";
strcat(path,userdata[n].UserID);
strcat(path,suffix);
if((fp1=fopen(path,"r+"))==NULL)
{
fp1=fopen(path,"w+");
fprintf(fp1,"%-20s%-10s%-10s%-10s% 10s\n","账号","操作","金额","余额","时间");
}
else fp=fopen(path,"a+");
//money=0;
do{
system("cls");
printf("\n\n\n\n\n\n\n\n\n ");
printf("=========================================\n");
printf(" ");
printf("| 1.用户存款 |\n");
printf(" ");
printf("| 2.用户取款 |\n");
printf(" ");
printf("| 3.用户转账 |\n");
printf(" ");
printf("| 4.查看余额 |\n");
printf(" ");
printf("| 5.修改密码 |\n");
printf(" ");
printf("| 6.退出登录 |\n");
printf(" ");
printf("=========================================\n");
printf(" ");
printf("请选择您的操作:\n");
printf(" ");
scanf("%d",&o);
switch(o)
{
case 1:money=MoneySave(&userdata[n]);break;
case 2:money=DrawMoney(&userdata[n]);break;
case 3:money=Trans(&userdata[n]);break;
case 4:printf(" ");
printf("你的当前余额为:%.2fRMB。\n",userdata[n].money);
printf(" ");
printf("请按键返回。");getch();break;
case 5:ChangePassword();break;
case 6:printf(" ");
printf("欢迎下次使用,谢谢。\n");getch();break;
}
time(&timep);
if(o!=6&&o!=4&&o!=5&&money!=0)
fprintf(fp1,"%-20s%-10d%-10.2f%-10.2f%10s\n",userdata[n].UserID,o,money,userdata[n].money,ctime(&timep));
}while(o!=6);
fclose(fp1);
}
void BuildUser()
{
USERDATA userdata;
int i=0;FILE *fp; //判断是否继续录入,如果继续按1,否则按2
char ch;
if((fp=fopen("iddata.txt","a+"))==NULL)
{
printf("Failure to open admin.txt!\n");
exit(0);
}
do{
printf(" ");
printf("请输入用户姓名:\n");
printf(" ");
gets(userdata.Name);
printf(" ");
printf("请输入用户卡号:\n");
printf(" ");
gets(userdata.UserID);
printf(" ");
printf("请输入用户密码\n");
printf(" ");
gets(userdata.UserPassword);
printf(" ");
printf("请输入用户当前金额\n");
printf(" ");
scanf("%f",&userdata.money);
fprintf(fp,"%-10s%-10s%-10s%-10.2f\n",userdata.Name,userdata.UserID,userdata.UserPassword,userdata.money);
system("cls");
printf("录入成功。\n继续录入请按 1 。\n结束录入并推出登陆请按 2。\n");
scanf("%d",&i);
ch=getchar();
}while(i==1);
fclose(fp);
if(i==2) main();
}
float MoneySave(struct User *p)
{
float money;
printf(" ");
printf("请输入您的存款金额:\n");
do{
printf(" ");
scanf("%f",&money);
if((int)money%50!=0){
printf(" ");
printf("对不起,银行有些垃圾。只能存入50或100元的钞票。\n请重新开始你的存款:\n");}
}while((int)money%50!=0);
p->money+=money;
printf(" ");
printf("成功存入%.2f元,请按任意键返回上层。\n",money);
printf(" ");
getch();
return money;
}
float DrawMoney(struct User *p)
{
float money;
printf(" ");
printf("请输入您的取款金额:\n");
do{
printf(" ");
scanf("%f",&money);
if(money>p->money)
{
printf("您卡里没有辣么多钱了\n");
}
if(money>2500)
{
printf(" ");
printf("一次最多可以取2500元\n");
}
if((int)money%50!=0)
{
printf(" ");
printf("只能取出面值为50或100的RMB。\n");
}
}while(money>p->money||money>2500||(int)money%50!=0);
p->money-=money;
printf(" ");
printf("成功取出%.2f元。请按任意键返回上层。\n",money);
getch();
return -money;
}
float Trans(struct User *p)
{
FILE *fp;
char a[N];
float money;
printf(" ");
printf("请输入您要转账的同行账户:\n");
re:
printf(" ");
scanf(" %s",a);
char path[30]="G:\\1\\ATM\\private_record\\",suffix[]=".txt";
strcat(path,a);
strcat(path,suffix);
if((fp=fopen(path,"r+"))==NULL)
{
fp=fopen(path,"w+");
printf(" ");
printf("该账户不存在,请重新输入转账账户。\n");
goto re;
}
else
{
printf(" ");
printf("请输入转账金额:\n");
printf(" ");
scanf("%f",&money);
while(money>p->money||money<=0)
{
if(money>p->money)
{
printf(" ");
printf("您卡里没有辣么多钱了\n");
printf(" ");
printf("请先按键查询余额后重新确认转账金额:\n");
printf(" ");
getch();return 0;
break;
}
}
p->money-=money;
printf(" ");
printf("成功转入目标账户%.2f元,请按任意键返回上层。\n",money);
fclose(fp);
printf(" ");
getch();
return -money;
}
}
void ChangePassword()
{
char str1[7],str2[7];
do{
printf(" ");
printf("请输入新的密码,密码为6位:\n");
printf(" ");
scanf("%s",str1);
printf(" ");
printf("请再输入一次:\n");
printf(" ");
scanf("%s",str2);
if(strcmp(str1,str2)!=0)
{
printf(" ");
printf("你输入的密码有误,请重新输入一遍。\n");
}
}while(strcmp(str1,str2)!=0);
printf(" ");
printf("密码修改成功,请选择其他操作。");
}