#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#include <time.h>
#define guanli "XXXX"
#define guanlimima "666666"
void toxy(int x, int y) //将光标移动到X,Y坐标处
{
COORD pos = {
x, y};
HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(Out, pos);
}
void color(short x) //改变字体颜色
{
if (x >= 0 && x <= 15)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);
}
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);
}
}
void guashi() //挂失
{
long long a;
color(15); //看着舒服的颜色
toxy(38, 2);
printf("请输入所要挂失的银行卡号:");
toxy(38, 4);
scanf("%ld", &a);
toxy(38, 6);
printf("挂失成功!");
toxy(38, 8);
printf("按任意键继续!");
getchar();
getchar();
system("cls"); //清屏
}
void jieguashi() //解挂失
{
long long a;
color(15); //看着舒服的颜色
toxy(38, 2);
printf("请输入所要挂失的银行卡号:");
toxy(38, 4);
scanf("%ld", &a);
toxy(38, 6);
printf("解挂失成功!");
toxy(38, 8);
printf("按任意键继续!");
getchar();
getchar();
system("cls"); //清屏
}
//ATM账号模拟结构体
struct Account
{
char id[40]; //身份证号
char name[40]; //姓名
char account[20]; //银行卡号
char password[10]; //密码
float money; //余额
int state; //账户状态 0为锁定,1为正常
} R[50]; //50个账户
void xitong(); //系统用户登录功能模块
void yonghu(); //存款用户登录功能模块
int Index = -1; //当前用户下标
//文件读取
int R_load()
{
FILE *fp;
int i = 0;
if ((fp = fopen("ATM.txt", "rb")) == NULL)
{
//打开账户信息文件
fp = fopen("ATM.txt", "w"); //文件不存在就创建
}
else
{
do
{
fread(&R[i], sizeof(struct Account), 1, fp); //读取账户信息文件
i++; //个数+1
} while (feof(fp) == 0); //直到文件结尾
}
fclose(fp); //关闭文件
if (i == 0)
return 0; //如果文件为空,则返回0个
return (i - 1); //返回账户个数
}
//文件保存
void R_keep(int m)
{
int i;
FILE *fp;
if ((fp = fopen("ATM.txt", "wb+")) == NULL) /*创建文件并判断是否能打开*/
{
fp = fopen("ATM.txt", "w"); //文件不存在就创建
}
for (i = 0; i < m; i++) /*将内存中的信息输出到磁盘文件中去*/
if (fwrite(&R[i], sizeof(struct Account), 1, fp) != 1)
printf("file write error\n");
fclose(fp); //关闭文件
}
//显示所有账户信息
void print()
{
int i = 0;
int m = R_load();
toxy(25, 2);
printf("---------------------------------------------------------------------------\n");
toxy(25, 3);
printf(" 身份证号 姓名 银行卡号 密码 余额 \n");
toxy(25, 4);
printf("---------------------------------------------------------------------------\n");
for (i = 0; i < m; i++)
{
toxy(25, 5 + i);
printf("%s %s %s %s %.1f\n", R[i].id, R[i].name, R[i].account, R[i].password, R[i].money);
}
toxy(25, 6 + i);
printf("按任意键继续!");
getchar();
getchar();
system("cls"); //清屏
}
//开户
void add()
{
int i, m = 1; //m为初始化的账户个数
int n = R_load();
for (i = n; i < m + n; i++) //for循环实现循环输入信息
{
toxy(40, 2);
printf("请输入该账户信息\n", i - n + 1);
toxy(40, 4);
printf("请输入身份证号: ");
do
{
toxy(40, 6);
scanf("%s", R[i].id); //输入身份证号
if (strlen(R[i].id) != 18)
{
toxy(40, 8);
printf("您输入的信息有误,请重新输入: ");
}
} while (strlen(R[i].id) != 18); //strlen函数计算字符串长度,为18时才跳出循环
toxy(40, 8);
printf("请输入姓名: ");
toxy(40, 10);
scanf("%s", R[i].name); //输入姓名
toxy(40, 12);
printf("请输入银行9位卡号: ");
toxy(40, 14);
scanf("%s", R[i].account); //输入银行卡号
toxy(40, 16);
printf("请输入密码: ");
toxy(40, 18);
scanf("%s", R[i].password); //输入密码
R[i].money = 0; //余额初始化为0
R[i].state = 1;
}
R_keep(m + n); //保存数据
toxy(40, 20);
printf("新建账户完成。\n\n");
toxy(40, 22);
printf("按任意键继续!");
getchar();
getchar();
system("cls"); //清屏
}
//查询存款用户信息
void search()
{
int flag = 1; //全程是否有错误
int i, j;
int n = R_load(); //读取文件中的账户记录到结构体数组
char account[20]; //银行卡号
toxy(25, 2);
printf("请输入要查询的银行卡号:\n");
toxy(25, 4);
scanf("%s", account); //输入信息
toxy(25, 6);
printf("查询到的记录如下:\n");
toxy(25, 8);
printf("--------------------------------------------------------------------------------\n");
toxy(25, 9);
printf(" 身份证号 姓名 银行卡号 密码 余额 \n");
toxy(25, 10);
printf("--------------------------------------------------------------------------------\n");
//查找所有账户,比对银行卡号,看是否存在
for (i = 0; i < n; i++)
{
if (strcmp(R[i].account, account) == 0)
{
//判断账号否存在 strcmp用于字符串比较 ==0表示字符串相同
flag = 0; //存在账户标志
toxy(25, 11);
printf("%s %s %s %s %.1f\n", R[i].id, R[i].name, R[i].account, R[i].password, R[i].money);
}
}
if (flag == 1)
{
toxy(25, 8);
printf("账户信息不存在\n");
}
toxy(25, 13);
printf("按任意键继续!");
getchar();
getchar();
system("cls"); //清屏
}
//修改存款用户信息
void change()
{
int flag = 1; //全程是否有错误
int i, j;
int n = R_load(); //读取文件中的账户记录到结构体数组
char account[20]; //银行卡号
int choose = 0; //选择是否删除
toxy(25, 2);
printf("请输入要修改账户的银行卡号:\n");
toxy(25, 4);
scanf("%s", account); //输入信息
//查找所有账户,比对银行卡号,看是否存在
for (i = 0; i < n; i++)
{
if (strcmp(R[i].account, account) == 0)
{
//判断账号否存在 strcmp用于字符串比较 ==0表示字符串相同
flag = 0; //存在账户标志
toxy(25, 6);
printf("---------------------------------------------------------------------------\n");
toxy(25, 7);
printf("请选择: 1.修改身份证号 2.修改姓名 3.修改密码 0.取消修改\n");
toxy(25, 8);
printf("---------------------------------------------------------------------------\n");
//printf("请选择: 1.修改身份证号 2.修改姓名 3.修改密码 0.取消修改\n");
toxy(25, 10);
scanf("%d", &choose); //输入选项
if (choose == 0)
{
system("cls"); //清屏
return; //退出函数
}
toxy(25, 12);
printf("修改为:");
//根据选项进行修改
switch (choose)
{
case 1:
scanf("%s", R[i].id);
break;
case 2:
scanf("%s", R[i].name);
break;
case 3:
scanf("%s", R[i].password);
break;
default:
break;
}
toxy(25, 14);
printf("修改成功,修改后的数据为:\n");
toxy(25, 16);
printf("%s %s %s %s %.1f %d\n", R[i].id, R[i].name, R[i].account, R[i].password, R[i].money, R[i].state);
}
}
R_keep(n); //保存数据到文件
if (flag == 1)
{
toxy(25, 6);
printf("账户信息不存在\n");
}
toxy(25, 18);
printf("按任意键继续!");
getchar();
getchar();
system("cls"); //清屏
}
//注销存款用户信息
void Delete()
{
int flag = 1; //全程是否有错误
int i, j;
int n = R_load(); //读取文件中的账户记录到结构体数组
char account[20]; //银行卡号
int choose = 0; //选择是否删除
toxy(25, 2);
printf("请输入要注销的银行卡号:\n");
toxy(25, 4);
scanf("%s", account); //输入信息
//查找所有账户,比对银行卡号,看是否存在
for (i = 0; i < n; i++)
{
if (strcmp(R[i].account, account) == 0)
{
//判断账号否存在 strcmp用于字符串比较 ==0表示字符串相同
flag = 0; //存在账户标志
toxy(25, 6);
printf("确定要注销该账户信息吗?\n");
toxy(25, 8);
printf("---------------------------------------\n");
toxy(25, 9);
printf("请输入您的选择: 1.确定 2.取消\n");
toxy(25, 10);
printf("---------------------------------------\n");
toxy(25, 12);
scanf("%d", &choose); //输入是否删除
if (choose == 1)
{
//从i开始,后面的数据往前覆盖
for (j = i + 1; j < n; j++)
{
R[j - 1] = R[j];
}
n--; //账户总数-1
toxy(25, 14);
printf("已注销该账户信息");
}
else
{
toxy(25, 14);
printf("已取消注销该账户信息\n");
}
}
}
R_keep(n); //保存数据到文件
if (flag == 1)
{
toxy(25, 6);
printf("账户信息不存在\n");
}
toxy(25, 16);
printf("按任意键继续!");
getchar();
getchar();
system("cls"); //清屏
}
//重置存款用户登录密码
void reset()
{
int flag = 1; //全程是否有错误
int i, j;
int n = R_load(); //读取文件中的账户记录到结构体数组
char account[20]; //银行卡号
int choose = 0; //选择是否删除
toxy(25, 2);
printf("请输入要重置账户的银行卡号:\n");
toxy(25, 4);
scanf("%s", account); //输入信息
//查找所有账户,比对银行卡号,看是否存在
for (i = 0; i < n; i++)
{
if (strcmp(R[i].account, account) == 0)
{
//判断账号否存在 strcmp用于字符串比较 ==0表示字符串相同
flag = 0; //存在账户标志
toxy(25, 6);
printf("确定要重置该账户密码? \n");
toxy(25, 8);
printf("---------------------------------------\n");
toxy(25, 9);
printf("请输入您的选择: 1.确定 2.取消\n");
toxy(25, 10);
printf("---------------------------------------\n");
toxy(25, 12);
scanf("%d", &choose); //输入是否删除
if (choose == 1)
{
strcpy(R[i].password, "000000"); //strcpy 字符串复制函数,将"000000"复制到 R[i].password
R[i].state = 1;
toxy(25, 14);
printf("已重置该账户密码为000000\n");
}
else
{
toxy(25, 14);
printf("已取消重置该账户密码\n");
}
}
}
R_keep(n); //保存数据到文件
if (flag == 1)
{
toxy(25, 6);
printf("账户信息不存在\n");
}
toxy(25, 16);
printf("按任意键继续!");
getchar();
getchar();
system("cls"); //清屏
}
//存款
void deposit()
{
float money = 0; //存款金额
int n = R_load(); //读取文件中的账户记录到结构体数组
toxy(45, 3);
printf("存款业务\n");
toxy(45, 5);
printf("请输入要存款的金额:\n");
toxy(45, 7);
scanf("%f", &money);
if (money <= 0)
{
toxy(45, 9);
printf("存款失败,金额需要大于0\n");
}
else
{
R[Index].money += money; //加上存款
toxy(45, 9);
printf("存款成功,当前账户余额为%.1f元\n", R[Index].money);
R_keep(n);
}
toxy(45, 11);
printf("按任意键继续!");
getchar();
getchar();
system("cls"); //清屏
}
//取款
void withdraw()
{
float money = 0; //取款金额
int n = R_load(); //读取文件中的账户记录到结构体数组
toxy(45, 3);
printf("取款业务\n");
toxy(45, 5);
printf("当前存款为%.1f元\n", R[Index].money);
toxy(45, 7);
printf("请输入要取款的金额:\n");
toxy(45, 9);
scanf("%f", &money);
if (money <= 0)
{
toxy(45, 11);
printf("取款失败,金额需要大于0\n");
}
else if (R[Index].money < money)
{
toxy(45, 11);
printf("取款失败,金额不得超过存款\n");
}
else
{
R[Index].money -= money; //加上存款
toxy(45, 11);
printf("取款成功,当前账户余额为%.1f元\n", R[Index].money);
R_keep(n);
}
toxy(45, 13);
printf("按任意键继续!");
getchar();
getchar();
system("cls"); //清屏
}
//转账
void transfer()
{
int i = 0;
int flag = 0; //是否存在转账账户
char account[20]; //银行卡号
float money = 0; //转账金额
int n = R_load(); //读取文件中的账户记录到结构体数组
toxy(45, 3);
printf("转账业务\n");
toxy(45, 5);
printf("当前存款为%.1f元\n", R[Index].money);
toxy(45, 7);
printf("请输入您要转入的银行卡号:\n");
toxy(45, 9);
scanf("%s", account);
toxy(45, 11);
printf("请输入您的转账金额:");
toxy(45, 13);
scanf("%f", &money);
if (money <= 0)
{
toxy(45, 15);
printf("转账失败,金额需要大于0\n");
}
else if (R[Index].money < money)
{
toxy(45, 15);
printf("转账失败,金额不得超过存款\n");
}
else
{
for (i = 0; i < n; i++)
{
if (strcmp(R[i].account, account) == 0)
{
//判断账号否存在 strcmp用于字符串比较 ==0表示字符串相同
flag = 1; //账户存在标记
//如果账户为自己,则提示
if (i == Index)
{
toxy(45, 15);
printf("无法转账给自己\n");
}
else
{
R[i].money += money; //对应账户添加金额
R[Index].money -= money; //此账户减少金额
toxy(45, 15);
printf("转账成功,当前用户余额为%.1f\n", R[Index].money);
R_keep(n); //保存数据
}
break;
}
}
if (flag == 0)
{
toxy(45, 15);
printf("输入的转账账户不存在\n");
}
}
toxy(45, 17);
printf("按任意键继续!");
getchar();
getchar();
system("cls"); //清屏
}
//余额查询
void search2()
{
int n = R_load(); //读取文件中的账户记录到结构体数组
toxy(45, 3);
printf("余额查询\n");
toxy(45, 5);
printf("-------------------------------");
toxy(45, 6);
printf("用户%s当前的余额为%.2f元\n", R[Index].name, R[Index].money);
toxy(45, 7);
printf("-------------------------------");
toxy(45, 9);
printf("按任意键继续!");
getchar();
getchar();
system("cls"); //清屏
}
//修改密码
void changePassword()
{
int n = R_load(); //读取文件中的账户记录到结构体数组
toxy(45, 3);
printf("修改密码\n");
toxy(45, 5);
printf("密码修改为:\n");
toxy(45, 7);
scanf("%s", R[Index].password);
R_keep(n);
toxy(45, 9);
printf("修改成功!\n");
toxy(45, 11);
printf("按任意键继续!");
getchar();
getchar();
system("cls"); //清屏
}
//系统用户登录功能模块
void xitong()
{
//输入用户名和密码
char user[20];
char password[20];
toxy(45, 1);
printf("请输入管理员姓名:\n");
toxy(45, 3);
scanf("%s", user);
toxy(45, 5);
printf("请输入管理员密码:\n");
toxy(45, 7);
scanf("%s", password);
if (strcmp(user, guanli) != 0 || strcmp(password, guanlimima) != 0)
{
toxy(45, 9);
printf("账号或密码错误\n");
toxy(45, 11);
printf("\n按任意键继续!");
getchar();
getchar();
system("cls"); //清屏
return; //退出函数
}
system("cls"); //清屏
while (1)
{
int m = 0;
color(12); //看着舒服的颜色
toxy(45, 1);
printf("欢迎管理员来到本ATM,倾听您吩咐!\n\n");
toxy(55, 4);
printf(" 管理员");
toxy(48, 6);
printf("---------------------------");
toxy(48, 8);
printf("| 1.开户 |");
toxy(48, 10);
printf("| 2.查询用户信息 |");
toxy(48, 12);
printf("| 3.修改用户信息 |");
toxy(48, 14);
printf("| 4.注销用户信息 |");
toxy(48, 16);
printf("| 5.重置用户密码 |");
toxy(48, 18);
printf("| 6.查看所有用户信息 |");
toxy(48, 20);
printf("| 7.挂失 |");
toxy(48, 22);
printf("| 8.解挂失 |");
toxy(48, 24);
printf("| 9.退出系统 |");
toxy(48, 26);
printf("---------------------------");
do
{
toxy(52, 28);
printf("请输入您的选择(1-9):");
scanf("%d", &m);
if (m > 9 || m < 1)
printf("输入错误,请重新输入\n");
} while (m > 9 || m < 1);
system("cls"); //清屏
if (m == 9)
break; //退出
switch (m)
{
case 1:
add();
break;
case 2:
search();
break;
case 3:
change();
break;
case 4:
Delete();
break;
case 5:
reset();
break;
case 6:
print();
break;
case 7:
guashi();
break;
case 8:
jieguashi();
break;
}
}
}
//存款用户登录功能模块
void yonghu()
{
int count = 0; //错误次数
Index = -1; //下标初始化
int i = 0;
int n = R_load(); //读取文件中的账户记录到结构体数组
//输入用户名和密码
char account[20];
char password[20];
toxy(20, 0);
color(15); //看着舒服的颜色
printf("温馨提示:您在输入本人账号和密码时,确保周围无外人,保护好自己的信息!");
color(14); //看着舒服的颜色
toxy(45, 2);
printf("请输入您的银行卡号\n");
toxy(45, 3);
scanf("%s", account);
//判断账号和密码是否存在
for (i = 0; i < n; i++)
{
if (strcmp(R[i].account, account) == 0)
{
Index = i;
}
}
//不存在则退出
if (Index < 0)
{
toxy(45, 5);
printf("账号不存在\n");
toxy(45, 7);
printf("按任意键继续!");
getchar();
getchar();
system("cls"); //清屏
return;
}
else if (R[Index].state == 0)
{
//是否被冻结
toxy(45, 9);
printf("账号被冻结,请联系系统用户解除冻结\n");
toxy(45, 11);
printf("按任意键继续!");
getchar();
getchar();
system("cls"); //清屏
return;
}
else
{
//最后尝试三次密码
while (count < 3)
{
count++; //尝试次数+1
toxy(45, 5);
printf("请输入密码\n");
toxy(45, 7);
scanf("%s", password); //输入密码
if (strcmp(R[Index].password, password) == 0)
{
//密码正确
break; //跳出循环
}
toxy(45, 9);
printf("输入密码错误,还有%d次尝试机会\n", 3 - count);
//3次错误就冻结
if (count >= 3)
{
R[Index].state = 0;
R_keep(n); //保存数据到文件
toxy(45, 11);
printf("密码输入错误达到三次,账号被冻结,请联系系统用户解除冻结\n");
toxy(45, 13);
printf("按任意键继续!");
getchar();
getchar();
system("cls"); //清屏
return; //退出函数
}
}
}
system("cls"); //清屏
while (1)
{
int m = 0;
color(12); //看着舒服的颜色
toxy(38, 1);
printf("欢迎%s先生/女士来到本ATM,下面我会全心全意为您服务!\n\n", R[Index].name);
toxy(55, 4);
printf(" 用户");
toxy(48, 6);
printf("-----------------------");
toxy(48, 8);
printf("| 1.存款 |");
toxy(48, 10);
printf("| 2.取款 |");
toxy(48, 12);
printf("| 3.转账 |");
toxy(48, 14);
printf("| 4.余额查询 |");
toxy(48, 16);
printf("| 5.修改密码 |");
toxy(48, 18);
printf("| 6.退出系统 |");
toxy(48, 20);
printf("-----------------------");
do
{
printf("\n");
toxy(50, 22);
printf("您的选择为:(1-6)");
toxy(50, 24);
scanf("%d", &m);
if (m > 6 || m < 1)
printf("输入错误,请重新输入\n");
} while (m > 6 || m < 1);
system("cls"); //清屏
if (m == 6)
break;
switch (m)
{
case 1:
deposit();
break;
case 2:
withdraw();
break;
case 3:
transfer();
break;
case 4:
search2();
break;
case 5:
changePassword();
break;
}
}
}
//主函数
int main()
{
while (1)
{
int m = 0;
color(14);
printf("\n\n");
toxy(50, 5);
printf(" 欢迎来到ATM智能取款机");
toxy(44, 8);
printf("------------------------------------------");
toxy(45, 10);
printf("请输入(1:管理员;2:用户:3:退出ATM.)");
toxy(44, 12);
printf("------------------------------------------");
do
{
printf("\n");
toxy(44, 14);
scanf("%d", &m);
if (m > 3 || m < 1)
printf("输入错误,请重新输入\n");
} while (m > 3 || m < 1);
system("cls"); //清屏
if (m == 3)
break; //退出
switch (m)
{
case 1:
xitong();
break; //进入系统用户登录功能模块
case 2:
yonghu();
break; //进入存款用户登录功能模块
}
}
return 0;
}
C语言自动取款机服务系统
猜你喜欢
转载自blog.csdn.net/qq_44575789/article/details/114266547
今日推荐
周排行