又到了课设季了,拿去不谢!
规格和本编的上一个程序差不多。
希望给你带来帮助。
#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;
}
比较匆忙,很多地方可以简化,敬请原谅。