此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);
}