链式ATM使用C语言实现,可以实现文本操作

此ATM可以创建多个用户,每个用户的信息包括用户名,账号,密码,余额。

可以文本操作,将自动建立一个文件“d:/000/AtmInfo.txt”。

第一次打开可能因为创建文件原因无法打开,重启即可。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>//唯一一个小问题,文件操作中不可加入菜单栏,若加入可能导致一些系统意外发生。
#include<conio.h>
#include<time.h>
#include<string.h>
/*

前提:基本链表框架和用户信息结构

一.总框架{		
			1.登录账号(查询节点)
			2.创建账号(创建节点)
			3.退出程序

二.副框架(登录账号下){		
						1.取款(修改节点余额,注意数值大小)
						2.存款(修改节点余额)
						3.修改密码(修改节点密码)
						4.注销账号(删除节点)
						5.转账(修改此节点和另一节点,注意先后顺序,修改完之后将指针调回)
						6.查询(只需打印即可)
						7.退出登录(退出节点)

三.其他内容{
			1.文本操作
			2.其他业务

四.可能出现的问题{
					1.修改余额遇到数值形式问题
					2.文本操作问题
*/
struct User
{
	char name[10] = {'0'};
	int id = 0;
	int passwd = 0;
	int money = 0;
};
struct Node
{
	struct User data;
	struct Node* next;
};
void menu1(struct Node* List,struct User data);//菜单栏1
void menu2(struct Node* List,struct User data,int id);//菜单栏2
struct User;
struct Node;
struct Node* creatList();//创建链表(表头)
struct Node* creatNode(struct User data);//创建节点
void insetNodeByHead(struct Node* headNode, struct User data);//增加
void debeateNode(struct Node* headNode, struct User data, int id);//删除
void searchNode(struct Node* headNode, struct User data, int id);//查询
void changeNode(struct Node* headNode, struct User data, int id);//修改
void printList(struct Node* headNode,struct User data);//打印链表
void inset(struct Node* List, struct User data);//开户
void debeate(struct Node* headNode, struct User data, int id);//销户
void denglu(struct Node* List, struct User data);//登录
void change(struct Node* headNode, struct User data, int id);//修改密码
void UserKnow(struct Node* List, struct User data);//用户须知
void readInfoFromFile(struct Node* headNode, const char* readFile);//读出文件
void writeInfoFromFile(struct Node* headNode, const char* writeFile);//写入文件
void cun(struct Node* headNode, struct User data, int id);//存款
void qu(struct Node* headNode, struct User data, int id);//取款
void zhuan(struct Node* headNode, struct User data, int id);//转账
void chaxun(struct Node* headNode, struct User data, int id);//查询
void qita(struct Node* headNode, struct User data, int id);//其他
void clear(struct Node* List, struct User data);//清除全部数据
int main()
{
	system("mode con cols=78 lines=28");
	SetConsoleTitleA("Song Bank Of ATM"); //设置窗口
	struct User data;
	struct Node* List = creatList();
	readInfoFromFile(List, "D:\\000\\AtmInfo.txt");
	menu1(List,data);
	system("pause");
	return 0;
}
void menu1(struct Node* List, struct User data)
{
	system("cls");char cho;
	printf("\n\n\t\t============[Song Bank Of ATM]============\n\n");
	printf("\t\t              1.登录用户账号\n\t\t              2.注册用户账号\n");
	printf("\t\t              3.银行用户须知\n\t\t              4.退出应用程序\n\n");
  //printf("\t\t              m.清空全部账户\n\t\t              n.显示用户账号\n\n");//系统管理员隐藏功能
	printf("\t\t==========================================\n\n");
	printf("\t\t============[请您选择服务项目]============\n\n");
	printf("\t\t\t\t");
	cho = _getch();
	switch (cho)
	{
	case '1':system("cls");denglu(List, data);break;
	case '2':system("cls");inset(List, data);break;
	case '3':system("cls");UserKnow(List, data);break;
	case '4':system("cls");exit(0);break;
	case 'm':clear(List, data); break;
	case 'n':printList(List, data); break;
	default:menu1(List, data); break;
	}
}
void menu2(struct Node* List,struct User data,int id)
{	system("cls");char cho;
	printf("\n\n\t\t============[Song Bank Of ATM]============\n\n");
	printf("\t\t1.取款\t\t\t\t    2.存款\n");
	printf("\t\t3.查询\t\t\t\t    4.修改\n");
	printf("\t\t5.注销\t\t\t\t    6.转账\n");
	printf("\t\t7.其他\t\t\t\t    8.退出\n\n");
	printf("\t\t==========================================\n\n");
	printf("\t\t============[请您选择服务项目]============\n\n");
	printf("\t\t\t\t");cho = _getch();
	switch (cho)
	{
	case '1':qu(List,data,id);break;
	case '2':cun(List, data, id);break;
	case '3':chaxun(List, data, id);break;
	case '4': change(List, data, id); break;
	case '5': debeate(List, data, id);break;
	case '6':zhuan(List, data, id);break;
	case '7':qita(List, data, id); break;//增加一些业务广告
	case '8': menu1(List, data);break;
	default:menu2(List, data, id);break;
	}
}
struct Node* creatList()//创建链表(表头)
{
	struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
	headNode->next = NULL;
	return headNode;
}
struct Node* creatNode(struct User data)//创建节点
{
	struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
	newNode->next = NULL;
	newNode->data = data;
	return newNode;
}
void insetNodeByHead(struct Node* headNode, struct User data)//增加
{
	struct Node* newNode = creatNode(data);
	newNode->next = headNode->next;
	headNode->next = newNode;
}
void debeateNode(struct Node* headNode, struct User data, int id)//删除
{
	int cho;
	printf("您确定要注销用户吗?(如果确定请输入“12581”)\n");
	scanf_s("%d", &cho);
	if (cho == 12581)
	{
		struct Node* pMove = headNode->next;
		struct Node* pFrontMove = headNode;
		while (id != pMove->data.id)
		{
			pFrontMove = pMove;
			pMove = pMove->next;
		}
		pFrontMove->next = pMove->next;
		free(pMove);
	}
	else
	{
		menu2(headNode, data, id);
	}
}
void changeNode(struct Node* headNode, struct User data, int id)//修改
{
	struct Node* pMove = headNode->next;
	while (id != pMove->data.id)
	{
		pMove = pMove->next;
	}
	printf("请输入新密码\n");
	scanf_s("%d", &pMove->data.passwd);
		
}
void searchNode(struct Node* headNode, struct User data, int id)//查询
{
	int passwd;
	struct Node* pMove = headNode->next;
	if (pMove == NULL)
	{
		printf("暂无用户或者其他错误,详情请参考《用户须知》\n");
	}
	else
	{
		while (pMove->data.id != id)
		{
			pMove = pMove->next;
			if (pMove == NULL)
			{
				printf("暂无用户或者其他错误,详情请参考《用户须知》\n");
				Sleep(3000);
				menu1(headNode, data);
			}
		}
		printf("请输入你的密码\n");
		scanf_s("%d", &passwd);
		if (passwd == pMove->data.passwd)
		{
			system("cls");
			menu2(headNode, data, id);
		}
		else
		{
			printf("密码错误\n");
			Sleep(3000);
			menu1(headNode,data);
		}
	}
}
void printList(struct Node* headNode,struct User data)//打印链表
{	char cho;system("cls");
	struct Node* pMove = headNode->next;
	printf("\tName\t\tSex\t\tAge\t\tTel\n");
	while (pMove != NULL)
	{
		printf("\t%s\t\t%d\t\t%d\t\t%d\n", pMove->data.name, pMove->data.id, pMove->data.passwd, pMove->data.money);
		pMove = pMove->next;
	}
	printf("\t按q返回到主界面\n");
	while (1)
	{
		cho = _getch();
		switch (cho)
		{
		case 'q':menu1(headNode, data);break;
		default:break;
		}
	}
}
void inset(struct Node* List, struct User data)
{
	system("cls"); struct Node* pMove = List -> next;
	while (1)
	{
		printf("添加新账号,请分别输入  用户名  账号  密码\n");
		setbuf(stdin, NULL);
		scanf_s("%s %d %d", data.name, sizeof(data.name), &data.id, &data.passwd);
		data.money = 0;
		while (pMove != NULL)
		{
			if (pMove->data.name != data.name && pMove->data.id != data.id)
			{
				pMove = pMove->next;
			}
			else
			{
				printf("用户名或者账号重复,即将返回\n");
				Sleep(2000);
				menu1(List, data);
			}
		}
		insetNodeByHead(List,data);
		writeInfoFromFile(List, "D:\\000\\AtmInfo.txt");
		menu1(List,data);
	}
}
void denglu(struct Node* List, struct User data)
{	system("cls");int id;
	printf("请输入账号\n");
	setbuf(stdin, NULL);
	scanf_s("%d", &id);
	searchNode(List,data, id);
}
void debeate(struct Node* headNode, struct User data, int id)
{	system("cls");
	debeateNode(headNode,data,id);
	writeInfoFromFile(headNode, "D:\\000\\AtmInfo.txt");
	menu1(headNode, data);
}
void change(struct Node* headNode, struct User data, int id)
{	system("cls");
	changeNode(headNode,data, id);
	writeInfoFromFile(headNode, "D:\\000\\AtmInfo.txt");
	menu1(headNode, data);
}
void readInfoFromFile(struct Node* headNode, const char* readFile)
{
	FILE* fp = fopen(readFile, "r");
	struct User data;
	if (fp == NULL)
	{
		fopen(readFile, "w+");
	}
	while (fscanf_s(fp, "%s %d %d %d", data.name,sizeof(data.name),&data.id,&data.passwd,&data.money) != EOF)
	{
		insetNodeByHead(headNode, data);
	}
	fclose(fp);
}
void writeInfoFromFile(struct Node* headNode, const char* writeFile)
{
	FILE* fp;
	struct Node* pMove = headNode->next;
	fp = fopen(writeFile, "w+");
	//fprintf(fp, "\tName\t\tId\t\tPasswd\t\tMoney\t\t\n");
	while (pMove != NULL)
	{
		fprintf(fp, "  %s\t\t%d\t\t%d\t\t%d\t\t\n", pMove->data.name, pMove->data.id, pMove->data.passwd, pMove->data.money);
		pMove = pMove->next;
	}
	fclose(fp);
}
void UserKnow(struct Node* List, struct User data)
{
	char cho;
	system("cls");
	printf("\n\n\t\t\t《用户须知》\n\t尊敬的用户:\n\n\t为了能够方便您快捷、顺利地在本银行ATM机下操作,请遵守以下规定:\n\n");printf("\t1.本产品开发人员为:Song.\n");
	printf("\t2.凡使用本产品则默认认为同意《用户须知》\n");printf("\t3.开通账户时,请勿输入过大内容。\n\t  用户名不超过8位;账号,密码不超过9位;存款总额不超过9位(包括小数点及以后,故请勿输入小数)\n");
	printf("\t4.若意外触及系统管理员功能,请勿紧张,默默退出功能即可,莫要皮那么一下,否则爆机伺候。\n");
	printf("\t5.本银行为单机版,账户全部信息存储在文件夹:“D:\\000\\AtmInfo.txt”\n");
	printf("\t6.本银行及其ATM运行过程中涉及到的问题全部解释权归开发人员Song,若对此条有意见请参考第二条\n");
	printf("\t7.对于本系统有任何意见或者建议,一律不接收。源码将发布到CSDN,开发者Song的CSDN账户为:may10\n");
	printf("\t8.还有更多精彩内容已经或者即将发布到CSDN开发这账号,敬请期待\n\n");printf("\t按q返回到主界面\n");
	while (1)
	{
		cho = _getch();
		switch (cho)
		{
		case 'q':menu1(List, data);break;
		default:break;
		}
	}
}
void cun(struct Node* headNode, struct User data, int id)
{
	system("cls");
	int money;
	struct Node* pMove = headNode->next;
	while (pMove->data.id != id)
	{
		pMove = pMove->next;
	}
	printf("\n\t请输入存钱金额\n");
	scanf_s("%d", &money);
	pMove->data.money += money;
	printf("存款完毕,余额为:%d(即将自动返回)\n", pMove->data.money);
	writeInfoFromFile(headNode, "D:\\000\\AtmInfo.txt");
	Sleep(2000);
	menu2(headNode, data, id);
}
void qu(struct Node* headNode, struct User data, int id)
{
	system("cls");int money;
	struct Node* pMove = headNode->next;
	while (pMove->data.id != id)
	{
		pMove = pMove->next;
	}
	printf("\n\t请输入取钱金额\n");
	scanf_s("%d", &money);
	if ((pMove->data.money - money) >= 0)
	{
		pMove->data.money -= money;
		printf("取款完毕,余额为:%d(即将自动返回)\n", pMove->data.money);
		writeInfoFromFile(headNode, "D:\\000\\AtmInfo.txt");
		Sleep(2000);
		menu2(headNode, data, id);
	}
	else
	{
		printf("余额不足,即将自动返回\n");
		Sleep(2000);
		menu2(headNode, data, id);
	}
}

void zhuan(struct Node* headNode, struct User data, int id)
{
	int idd, money;
	system("cls");
	printf("请输入你要转账的对象账号\n");
	scanf_s("%d", &idd);
	struct Node* pMove = headNode->next;
	struct Node* pMove2 = headNode->next;
	while (pMove->data.id != id)
	{
		pMove = pMove->next;
	}
	while (pMove2->data.id != idd)
	{
		pMove2 = pMove2->next;
		if (pMove2 == NULL)
		{
			printf("暂无此用户或者其他错误,详情请参考《用户须知》\n");
			Sleep(3000);
			menu2(headNode, data, id);
		}
	}
	printf("请输入你要转账的金额\n");
	scanf_s("%d", &money);
	if ((pMove->data.money-money)>=0)
	{
		pMove->data.money -= money;
		pMove2->data.money += money;
		printf("转账成功,余额:%d,转账金额:%d(即将自动返回)\n", pMove->data.money, money);
		writeInfoFromFile(headNode, "D:\\000\\AtmInfo.txt");
		Sleep(2000);
		menu2(headNode, data, idd);
	}
	else
	{
		printf("余额不足,即将自动返回\n");
		Sleep(3000);
		menu2(headNode, data, id);
	}	
}
void chaxun(struct Node* headNode, struct User data, int id)
{	system("cls");struct Node* pMove = headNode->next;
	while (id != pMove->data.id)
	{
		pMove = pMove->next;
	}
	printf("\t用户名\t\t账号\t\t余额\n");printf("\t%s\t\t%d\t\t%d\n", pMove->data.name, pMove->data.id, pMove->data.money);
	Sleep(3500);menu2(headNode, data, id);
}
void qita(struct Node* headNode, struct User data, int id)
{	system("cls"); char cho;
printf("\n\n\t\t本银行并非慈善机构,各位用户可以通过《用户须知》中提供的CSDN账号打赏\n\t\t本银行提供广告业务,有钱的老板可以考虑一下这只潜力股\n"); printf("按q返回主界面\n");
	while (1)
	{
		cho = _getch();
		switch (cho)
		{
		case 'q':menu2(headNode, data, id);break;
		default:break;
		}
	}
}
void clear(struct Node* List, struct User data)
{
	struct Node* pMove = List->next;
	pMove->next = NULL;
	List->next = pMove->next;
	writeInfoFromFile(List, "D:\\000\\AtmInfo.txt");
	menu1(List, data);
}

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值