C语言——ATM

又到了课设季了,拿去不谢!
规格和本编的上一个程序差不多。
希望给你带来帮助。

#include<stdio.h>
#include<string.h>
#include<Windows.h>
#include<time.h>
#define N 20
typedef struct ATM
{
	int root1;//管理员访问权限 1 
	int root2;//普通用户访问权限2 
	char ID[20];//账号 
	char pass[20];//密码
	char name[N];//用户名
	char card[20];//用户卡号 
	char addr[N];//地址
	int num;//联系电话
	int dep;//存款金额
	int out;//取款金额
	float check;//余额
	int  froze;//0 不冻结  1冻结 
	struct ATM *next;
}LinkList;
void ListInsert(LinkList *L, LinkList *n);
void saveHotelFile(LinkList *L);
void readAtmput(LinkList *L);
void menu33(struct ATM *p);
void menu3(struct ATM *p);
void menu22(struct ATM *p);
void menu2(struct ATM *p);
void menu(struct ATM *p);
void Add1(LinkList *p)//开户 
{
	struct ATM *q ,*n = p;
	struct ATM *h = p->next->next;
	int flag = 0;//判断用户是否存在
	system("cls");
	q = (struct ATM *)malloc(sizeof(struct  ATM));
	q->next = NULL;
	printf("\t请输入你添加的用户卡号、用户名、家庭住址、联系电话\n");
	scanf("%s%s%s%d", q->card, q->name, q->addr, &q->num);
	getchar();
	q->root1 = 0;// 开户 
	q->root2 = 2;
	q->froze = 0;//0 不冻结   1 冻结 
	strcpy(q->ID, "0");
	strcpy(q->pass, "000000");//初始密码(000000)
	q->check = 0;
	q->dep = 0;
	q->out = 0;
	while (h != NULL)
	{
		if (strcmp(h->card, q->card) == 0)
		{
			flag = 1;
			printf("\t该用户卡号已存在\n");
			Sleep(1000);
			menu(p);
			break;
		}
		h = h->next;
	}
	while (n->next != NULL)
	{
		n = n->next;
	}
	n->next = q;
	if (flag == 0)
	{
		printf("\t添加成功\n");
		printf("\t用户卡号  用户名  地址  联系电话  初始密码 \n");
		printf("\t%s  %s  %s  %d  %s\n", q->card, q->name, q->addr, q->num, q->pass);
		printf("\t按回车键返回菜单\n");
	}
	else
	{
		printf("\t添加失败\n");
	}
	getchar();
	menu2(p);
}
void Dele(LinkList *p)//销户
{
	struct ATM *n=p->next;
	struct ATM *h=p->next->next;
	char card[20];
	int flag = 0;
	char pass[20];
	system("cls");//清屏
	printf("\t请输入你要注销的用户账号");
	scanf("%s", card);
	while (h != NULL)
	{
		if (strcmp(h->card, card) == 0)
		{
			flag = 1;
			n->next = h->next;
		}
		n = h;
		h = h->next;
	}
	if (flag == 0)
	{
		printf("\t注销失败\n");
		printf("\t请按回车键返回菜单\n");
	}
	if (flag == 1)
	{
		printf("\t注销成功\n");
		printf("\t请按回车键返回菜单\n");
	} 
	printf("按回车返回菜单");
	getchar();
	getchar();
	menu2(p);
}
void freeze(LinkList *p)//冻结模块
{
	int i=0;
	char ca[20];
	struct ATM *q = p->next;
	printf("\t请输入要冻结的用户卡号\n");
	scanf("%s", ca);
	getchar();
	while (q != NULL)
	{
		if (strcmp(ca, q->card) == 0)
		{
			q->froze=1;
			i++;
		}
		q = q->next;
	}
	if(i!=0)
	{
		printf("已冻结此账号!\n");
	}
	if(i==0)
	{
		printf("冻结失败\n");
	}
	printf("按回车返回主菜单\n");
	getchar();
	menu2(p);
}
void freeze2(LinkList *p)//冻结模块
{
	int i=0;
	char ca[20];
	struct ATM *q = p->next;
	printf("\t请输入解冻的用户卡号\n");
	scanf("%s", ca);
	getchar();
	while (q != NULL)
	{
		if (strcmp(ca, q->card) == 0)
		{
			q->froze=0;
			i++;
		}
		q = q->next;
	}
	if(i!=0)
	{
		printf("已解冻此账号!\n");
	}
	if(i==0)
	{
		printf("解冻失败\n");
	}
	printf("按回车返回主菜单\n");
	getchar();
	menu2(p);
}
void amend1(LinkList *p)//管理员功能:修改 普通用户 
{
	struct ATM *q = p->next;
	struct ATM *m = p->next;
	int n, t=0;
	char na[20], ad[20],ca[20];
	int  nu;
	system("cls");
	printf("请输入修改用户的用户卡号\n");
	scanf("%s", ca);
	printf("请选择要修改的内容:\n");
	printf("1.姓名\n");
	printf("2.地址\n");
	printf("3.手机号\n");
	printf("4.返回上一功能选项\n");
	scanf("%d", &n);
	switch (n)
	{
	case 1:m = p->next;printf("修改后的姓名\n"); scanf("%s", na); 
		while(m!=NULL)
		{
			if(strcmp(m->card,ca)==0)
			{
				strcpy(m->name,na);
				t = 1; 
			}
			m=m->next;
		}break;
	case 2:m = p->next;printf("修改后的地址\n"); scanf("%s", ad);
		while(m!=NULL)
		{
			if(strcmp(m->card,ca)==0)
			{
				strcpy(m->addr,ad);
				t = 1; 
			}
			m=m->next;
		}break;
	case 3:m = p->next;printf("修改后的手机号\n"); scanf("%d", &nu);
		while(m!=NULL)
		{
			if(strcmp(m->card,ca)==0)
			{
				m->num=nu;
				t = 1; 
			}
			m=m->next;
		}break;
	case 4:menu2(p); break;
	default:printf("请输入合法量\n"); break;
	}
	if (t == 1)
	{
		printf("修改成功\n");
	}
	if (t == 0)
	{
		printf("修改失败\n");
	}
	printf("按回车键返回\n");
	getchar();
	getchar();
	menu2(p);
}
void amend(LinkList *p)
{
	struct ATM *q=p->next;
	char acc[20],poss[20],ac[20];
	int flag=0,i;
	system("cls");
	printf("请输入要修改的账号:");
	scanf("%s",acc);
	while(q!=NULL)
	{
		if(strcmp(q->ID,acc)==0)
		{
			flag=1;
			printf("1.仅修改密码\n2.密码账户均修改\n");
			scanf("%d",&i);
			if(i==1)
			{
				printf("请输入新密码:");
				scanf("%s",poss);
				strcpy(q->pass,poss);break;
			}
			if(i==2)
			{
				printf("请输入新账号:");
				scanf("%s",ac);
				getchar();
				printf("请输入新密码:");
				scanf("%s",poss);
				strcpy(q->ID,ac);
				strcpy(q->pass,poss);break;
			}
		}
		q=q->next;
	}
	if(flag==0)
	{
		printf("账户错误!\n");
		printf("\t请按回车键返回菜单\n");
	}
	if(flag==1)
	{
		printf("修改成功!\n");
		printf("\t请按回车键返回菜单\n");
	}
	getchar();
	getchar();
	menu2(p);
}
void amend2(LinkList *p,char ca[20])//修改密码 
{
	int i=0;
	struct ATM *q = p->next;
	char  pa[20], pa1[20], pa2[20];
	int flag = 0;
	system("cls");
	printf("请输入新密码\n");
	scanf("%s",pa1);
	printf("请再次输入新密码\n");
	scanf("%s",pa2);
	if(strcmp(pa1,pa2)==0)
	{
		while (q!=NULL)
		{
			if (strcmp(q->card,ca) == 0)
			{
				strcpy(q->pass,pa2);
				i++;
			}
			q=q->next;
		}
	}
	if(i!=0)
	{
		printf("修改成功");
	}
	if(i==0)
	{
		printf("两次密码有误!\n");
	}
	Sleep(1000);
	printf("按回车键返回");
	getchar();
	getchar();
	menu3(p,ca);
}
void out(LinkList *p,char ca[20])//取款 
{
	int a,i=0;
	float b;
	struct ATM *n=p;
	struct ATM *q=p->next;
	struct ATM *h,*t;
	system("cls");
	h = (LinkList *)malloc(sizeof(LinkList));
	h -> next=NULL;
	while (q != NULL)
	{
		if (strcmp(q->card, ca)==0)
		{
			strcpy( h->ID,q->ID);
			strcpy(h->pass,q->pass );
			strcpy( h->name,q->name);
			strcpy(h->card, q->card);
			strcpy(h->addr, q->addr);
			h->root1 = q->root1;
			h->root2 =q ->root2;
			h->num = q->num;
			h->dep = 0;
			h->froze = q->froze;
			b=q->check;
		}
		q = q->next;
	}
	printf("请输入取款金额:\n");
	scanf("%d", &a);
	if (b<a)
	{
		printf("余额不足\n");
	}
	if (a%100== 0)
	{
		if (b>=a)
		{
			h->out=a;
			h->check =b-a;
			printf("取款成功\n");
			i = 1;
			printf("当前余额:%.2f", h->check);
		}
	}
	if (i == 1)
	{
		while (n->next != NULL)
		{
			n= n->next;
		}
		n->next = h;
	}
	getchar();
	getchar();
	menu3(p,ca);
}
void dep(LinkList *p, char ca[20])//存款 
{
	int a,i=0;
	struct ATM *n = p;
	struct ATM *h = p->next;
	struct ATM *m;
	struct ATM *t;
	system("cls");
	m= (struct ATM *)malloc(sizeof(struct  ATM));
	m->next=NULL;
	while (h!=NULL)
	{
		if (strcmp(h->card,ca)==0)
		{
			strcpy(m->ID,h->ID);
			strcpy(m->pass,h->pass);
			strcpy(m->name,h->name);
			strcpy(m->card,h->card);
			strcpy(m->addr,h->addr);
			m->root1=h->root1;
			m->root2=h->root2;
			m->num=h->num;
			m->out=0;
			m->froze=h->froze;
			t=h;
		}
		h = h->next;
	}
	printf("请输入存款金额:\n");
	scanf("%d",&a);
	if(a%100==0)
	{
		m->dep=a;
		m->check=t->check+a;
		printf("当前余额:%.2f",m->check);
		i=1;
	}
	if(i==1)
	{
		while (n->next != NULL)
		{
			n = n->next;
		}
		n->next = m;
	}
	if(i==1)
	{
		printf("存款成功!\n");
		printf("是否继续存款?\n");
		printf("1.结束放钞\n");
		printf("2.继续放钞\n");
		scanf("%d",&i);
		switch (i)
		{
		case 1:	menu3(p,ca);break;
		case 2:dep(p, ca);
		}

	}
	if(i==0)
	{
		printf("存款失败!\n");
	}
	getchar();
	getchar();
	menu3(p,ca);
}
void lookcheck(LinkList *p,char ca[20])//查询余额
{
	float a;
	struct ATM *q = p->next;
	while (q != NULL)
	{
		if (strcmp(ca, q->card) == 0)
		{
			a = q->check;
		}
		q = q->next;
	}
	printf("\t您的账户余额为:%.2f元\n\n", a); 
	printf("按回车键返回菜单\n");
	getchar();
	getchar();
	menu3(p,ca);
}
void transform(LinkList *p,char ca[20])
{
	int b=0,c,i=0;
	float e,f;
	char a[20];
	struct ATM *q=p->next;
	struct ATM *g=p->next;
	struct ATM *n;
	struct ATM *h=p->next;
	struct ATM *k=p->next;
	struct ATM *m;
	system("cls");
	m= (struct ATM *)malloc(sizeof(struct  ATM));
	n= (struct ATM *)malloc(sizeof(struct  ATM));
	m->next = NULL;
	n->next=NULL;
	while (h != NULL)
	{
		if (strcmp(h->card, ca) == 0)
		{
			strcpy(m->ID,h->ID);
			strcpy(m->pass,h->pass);
			strcpy(m->name,h->name);
			strcpy(m->card,h->card);
			strcpy(m->addr,h->addr);
			m->root1=h->root1;
			m->root2=h->root2;
			m->num=h->num;
			m->dep=0;
			m->out=0;
			m->froze=h->froze;
			e=h->check;
		}
		h = h->next;
	}
	printf("请输入转入账号:");
	scanf("%s",a);
	while (k!= NULL)
	{
		if (strcmp(k->card, a) == 0)
		{
			b=1;
			strcpy(n->ID,k->ID);
			strcpy(n->pass,k->pass);
			strcpy(n->name,k->name);
			strcpy(n->card,k->card);
			strcpy(n->addr,k->addr);
			n->root1=k->root1;
			n->root2=k->root2;
			n->num=k->num;
			n->dep=0;
			n->out=0;
			n->froze=k->froze;
			f=k->check;
		}
		k = k->next;
	}
	if(b==0)
	{
		printf("无此用户!\n");
		Sleep(1000);
		menu3(p,ca);
	}
	printf("请输入转账金额:");
	scanf("%d",&b);
	if(e>=f)
	{
		m->check=e-b;
		n->check=f+b;
		i=1;
	}
	if(i==1)
	{
		while (q->next != NULL)
		{
			q= q->next;
		}
		q->next =m;
	}
	if(i==1)
	{
		while (g->next != NULL)
		{
			g=g->next;
		}
		g->next =n;
	}
	if(i==1)
	{
		printf("转账成功!\n");
	}
	if(i==0)
	{
		printf("转账失败!\n");
	}
	getchar();
	getchar();
	menu3(p,ca);
}
void look(LinkList *p,char ca[20])
{
	struct ATM *q = p->next->next;
	int i=0;
	printf("用户  存款    取款     余额\n");
	while(q!=NULL)
	{
		if(strcmp(q->card,ca)==0)
		{
			i=1;
			printf("         %-10d      %-10d      %-10f\n",q->dep,q->out,q->check);
		}
		q=q->next;
	}
	if(i==1)
	{
		printf("打印完毕!\n");
	}
	if(i==0)
	{
		printf("打印失败");
	}
	printf("按回车返回菜单\n");
	getchar();
	getchar();
	menu3(p,ca);
}
void ListInsert(LinkList *L, LinkList *n)//开辟节点
{
	LinkList *q = L;
	n->next = NULL;
	while (q->next != NULL)
	{
		q=q->next;
	}
	q->next=n;
}
void saveHotelFile(LinkList *L)//读入磁盘文件 
{
	FILE *fp;
	LinkList *p;
	p = L->next;
	fp = fopen("atm.txt", "w");
	if (fp == NULL)
	{
		printf("无法打开此文件\n");
		exit(0);
	}
	while (p)
	{
		fprintf(fp, "%d %d %s %s %d %s %s %s %d %d %d %f \n", p->root1, p->root2, p->ID, p->card, p->froze, p->pass, p->name, p->addr, p->num, p->out, p->dep, p->check);
		p = p->next;
	}
	fclose(fp);
}
void readAtmput(LinkList *L)//向链表读取 
{
	FILE *fp;
	LinkList *n;
	LinkList *m;
	char I[20], ca[20], pa[20], na[20], add[20],a[20],b[20];
	int rot1, rot2, fro, nu, ou, de,i;
	float ch;
	fp = fopen("atm.txt", "r");
	if (fp == NULL)
	{
		fp = fopen("atm.txt", "w");
	}
	else
	{
		if (fgetc(fp)==-1)
		{
			printf("此账户初次使用!请输入初始账号:");
			scanf("%s",a);
			printf("请输入初始密码:");
			scanf("%s",b);
			m=(struct ATM *)malloc(sizeof(struct ATM));
			strcpy(m->ID,a);//管理员账号
			strcpy(m->pass,b);//管理员密码
			strcpy(m->name, "0");
			strcpy(m->addr, "0");
			strcpy(m->card, "0");
			m->root1 = 1;
			m->root2 = 0;
			m->froze = 0;
			m->num = 0;
			m->out = 0;
			m->dep = 0;
			m->check = 0;
			m->next = NULL;
			L->next = m;
		}
		if (fgetc(fp)!=-1)
		{
			fseek(fp, -2L, 1);
		}
		while (!feof(fp))
		{
			fscanf(fp, "%d %d %s %s %d %s %s %s %d %d %d %f ", &rot1, &rot2, I, ca, &fro, pa, na, add, &nu, &ou, &de, &ch);
			n=(struct ATM *)malloc(sizeof(struct ATM));
			strcpy(n->ID, I);
			strcpy(n->card, ca);
			strcpy(n->pass, pa);
			strcpy(n->name, na);
			strcpy(n->addr, add);
			n->root1 = rot1;
			n->root2 = rot2;
			n->froze = fro;
			n->num = nu;
			n->out = ou;
			n->dep = de;
			n->check = ch;
			ListInsert(L,n);
		}
	}
	fclose(fp);
}
void menu33(struct ATM *p)
{
	int i=0,flag;
	struct ATM *q=p->next;
	struct ATM *m=p->next;
	char a[20],b[20];
	system("cls");
	printf("请输入账户:");
	scanf("%s",a);
	getchar();
	while (q!= NULL)
	{
		if (strcmp(q->card, a)==0&&(q->froze==0))
		{
			for(flag=1;flag<=3;flag++)
			{
				printf("请输入密码:");
				scanf("%s", b);
				if (strcmp(q->pass, b) == 0)
				{
					menu3(p,a);
				}
				else
				{
					printf("密码错误!(初始密码是000000)\n");
					Sleep(1000);
				}
				if (flag == 3)
				{
					while(m!=NULL)
					{
						if (strcmp(m->card, a)==0)
						{
							m->froze=1;
						}
						m=m->next;
					}
					printf("您的账号已被冻结,请到管理员处解冻\n"); Sleep(1000);
					menu(p);
				}
			}
		}
		q = q->next;
	}
	if(i==0)
	{
		printf("账号错误或在冻结状态!\n");
		Sleep(1500);
		menu(p);
	}
}
void menu3(struct ATM *p,char ca[20])
{
	int i;
	system("cls");
	while(1)
	{
		printf("\n\t\t自动取款系统\n\n");
		printf("\t\t*******1:修改密码**********\n");
		printf("\t\t*******2:余额查询**********\n");
		printf("\t\t*******3:实时存款**********\n");
		printf("\t\t*******4:取款**************\n");
		printf("\t\t*******5:转账**************\n");
		printf("\t\t*******6:交易记录查询******\n");
		printf("\t\t*******7:返回***************\n");
		printf("\t\t*******8:退卡**************\n");
		scanf("%d", &i);
		switch (i)
		{
		case 1:amend2(p,ca); break;
		case 2:lookcheck(p,ca); break;
		case 3:dep(p,ca); break;
		case 4:out(p,ca); break;
		case 5:transform(p,ca); break;
		case 6:look(p,ca);break;
		case 7:menu(p);break;
		case 8:saveHotelFile(p);exit(0);
		}
	}
}
void menu22(struct ATM *p)
{
	struct ATM *h=p->next;
	char a[20],b[20];
	int i=0;
	system("cls");
	printf("请输入账户:");
	scanf("%s",a);
	getchar();
	while(h!=NULL)
	{
		if(strcmp(h->ID,a)==0)
		{
			printf("请输入密码:");
			scanf("%s",b);
			if(strcmp(h->pass,b)==0)
			{
				i=1;
				menu2(p);break;
			}
		}
		h=h->next;
	}
	if(i==0)
	{
		Sleep(1500);
		printf("密码或账号错误!\n");
		menu(p);
	}
}
void menu2(struct ATM *p)
{
	int i;
	system("cls");
	while(1)
	{
		printf("\n\t\t\t自动取款系统\n\n");
		printf("\t\t*******************\n");
		printf("\t\t*****1.开户:*******\n");
		printf("\t\t*****2.销户:*******\n");
		printf("\t\t*****3.冻结卡户****\n");
		printf("\t\t*****4.解冻卡户****\n");
		printf("\t\t*****5.修改信息****\n");
		printf("\t\t*****6.修改密码****\n");
		printf("\t\t*****7.返回****\n");
		printf("\t\t*****8.退出********\n");
		printf("\t\t*******************\n");
		printf("\t\t请输入选择项:");
		scanf("%d", &i);
		switch (i)
		{
		case 1:Add1(p); break;
		case 2:Dele(p); break;
		case 3:freeze(p); break;
		case 4:freeze2(p); break;
		case 5:amend1(p); break;
		case 6:amend(p);break;
		case 7:menu(p);break;
		case 8:saveHotelFile(p);exit(0);
		default:printf("输入不合法\n");
		}
	}
}
void menu(struct ATM *p)
{
	int a;
	system("cls");
	while(1)
	{
		printf("\t欢迎登录银行系统\n");
		printf("\t**请选择您的身份**\n");
		printf("\t1.系统管理员\n");
		printf("\t2.普通用户\n");
		printf("\t3.退出\n");
		scanf("%d",&a);
		switch(a)
		{
		case 1:menu22(p);break;
		case 2:menu33(p);break;
		case 3:exit(0);break;
		default:printf("请输入合法量!\n");
		}
	}
}
int main()
{
	LinkList *p;
	p=(struct ATM *)malloc(sizeof(struct ATM));
	p->next=NULL;
	readAtmput(p);
	menu(p);
	system("pause");
	return 0;
}

比较匆忙,很多地方可以简化,敬请原谅。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值