C语言自动取款机服务系统

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_44575789/article/details/114266547