帮同学写的ATM机模拟(简单链表操作)
2015-01-11 21:20
393 查看
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> ///数据层 typedef struct AC { char name[50]; ///存账户名 char password[10]; ///存密码 double money; ///存余额 struct AC *nxt; ///下一个账户 }Account,*AccountP; ///Account:结构体 AccountP:结构体指针 Account Head; ///定义链表头 int sz; ///链表大小 ///模块层 ///读取文件模块: void _read() { int i; AccountP u=NULL; FILE *f=NULL; if((f=fopen("Account.txt","r"))==NULL) { return ; } u=&Head; ///如果该文件为空或者不存在则不读取 if(feof(f)) { fclose(f); return ; } ///读取sz fscanf(f,"%d",&sz); //printf("sz:%d\n",sz); ///重建链表 for(i=0;i<sz;i++) { u->nxt=(AccountP)malloc(sizeof(Account)); u=u->nxt; fscanf(f,"%lf%s%s",&u->money,u->name,u->password); u->nxt=NULL; } fclose(f); } ///文件输出模块: void _write() { int i; AccountP u; FILE *f=fopen("Account.txt","w"); u=&Head; fprintf(f,"%d\n",sz); for(i=0;i<sz;i++) { ///循环输出链表数据 u=u->nxt; fprintf(f,"%.2f\n%s\n%s\n",u->money,u->name,u->password); } fclose(f); } ///登陆模块: 参数:账户名 密码 AccountP _login(char *name,char *password) { AccountP u; u=&Head; ///u指向头 保证 while(u->nxt!=NULL) { u=u->nxt; if(!strcmp(name,u->name)) { if(!strcmp(password,u->password)) { ///如果账户名&&密码匹配则登陆成功 puts("登陆成功!"); return u; } ///否则密码错误 puts("密码错误!"); return NULL; } } ///或输出"没有该账户" puts("没有该账号!"); return NULL; } AccountP _reg(char *name,char *password) { AccountP u; AccountP p; ///u为链表循环用变量 ///p为链表新节点 p=(AccountP)malloc(sizeof(Account)); strcpy(p->name,name); strcpy(p->password,password); p->nxt=NULL; p->money=0; ///为新节点赋值 ///循环到查找链表尾 u=&Head; while(u->nxt!=NULL) { ///或者发现有已存在账户 u=u->nxt; if(!strcmp(u->name,name)) { puts("该账户已存在!"); return NULL; } } ///若符合上述条件 在链表尾链入新节点 u->nxt=p; puts("创建成功!"); sz++; return p; } ///功能 void changePW(AccountP ac) { char npw[100],opw[100]; puts("请输入原密码:"); scanf("%s",opw); puts("请输入新密码:"); scanf("%s",npw); if(!strcmp(opw,ac->password)) { ///若原密码opw与账户密码相同 修改成功 strcpy(ac->password,npw); puts("修改完成!"); } else { ///否则修改失败 puts("密码错误!"); } } void init() { ///头标记 没有数据 Head.nxt=NULL; Head.name[0]=Head.password[0]=0; ///读取文件记录 _read(); } void quit() { ///退出时将链表数据写入文件 _write(); } AccountP loginReg() { AccountP ac; ///ac为操作账户 char nm[100],pw[100]; int run; int op; ///第一界面:登陆或注册 do { run=0; puts("1 登陆\t2 注册"); scanf("%d",&op); if(op==1) { puts("请输入账户:"); scanf("%s",nm); puts("请输入密码:"); scanf("%s",pw); ac=_login(nm,pw); if(ac==NULL) { ///账户读取失败 继续登陆 run=1; continue; } } else if(op==2) { puts("请输入账户:"); scanf("%s",nm); puts("请输入密码:"); scanf("%s",pw); ac=_reg(nm,pw); if(ac==NULL) { ///账户读取失败 继续登陆 run=1; continue; } } else { ///账户读取失败 继续登陆 run=1; puts("输入错误!"); continue; } }while(run); ///登陆成功 返回操作的账户 return ac; } void showRest(AccountP ac) { printf("余额为:%.2f\n",ac->money); } void in(AccountP ac) { double m; puts("存入:"); scanf("%lf",&m); ac->money+=m; ///把该账户的money+m puts("成功!"); } void out(AccountP ac) { double m; puts("取出:"); scanf("%lf",&m); ///弱减完小于0则交易失败 if(ac->money-m<0) puts("余额不足"); else { ac->money-=m; puts("成功!"); ///把该账户的money-m } } void trans(AccountP ac) { char name[100]; double money; AccountP u; ///转入账户 puts("请输入账号:"); scanf("%s",name); puts("请输入金额:"); scanf("%lf",&money); if(ac->money-money<0) { ///先检测转出账户余额 puts("余额不足!"); return; } ///从头开始查找该账户 u=&Head; while(u->nxt!=NULL) { u=u->nxt; if(!strcmp(name,u->name)) { ///找到名字匹配的账户 u->money+=money; ac->money-=money; puts("转账成功!"); return ; } } ///没找到该账户则跳出循环 puts("没有该账号!"); } void show() { puts("1 取款\t2 存款"); puts("3 查询\t4 转账"); puts("5 修改密码\t0 退出"); } void mainFrame() { AccountP ac; char nm[100],pw[100]; int run; int op; do { ///执行第一界面 直到成功登陆 run =0; ac=loginReg(); if(ac==NULL) { run=1; continue; } }while(run); do { show(); ///调用功能菜单 scanf("%d",&op); ///获取操作 run=1; switch (op) { case 0: ///结束 run=0; quit(); break; case 1: ///取款 out(ac); break; case 2: ///存款 in(ac); break; case 3: ///查询 showRest(ac); break; case 4: ///转账 trans(ac); break; case 5: changePW(ac); break; } ///run==0时结束 }while(run); } int main() { int run=0; init(); ///初始化函数 do { mainFrame(); ///调用主菜单界面 puts("0 结束\t1 继续"); scanf("%d",&run); ///run==0时结束 }while(run); return 0; }
相关文章推荐
- 关于链表的简单操作
- 简单链表的操作
- 链表实现简单操作
- BNUOJ 26182 -----------Army Buddies 用结构体 仿双向链表的简单操作
- 简单的链表操作
- 一个简单的链表操作程序
- 【数据结构上机练习】4.链表的简单操作(2)
- 简单模拟word中对插入直线的操作
- 数据结构之链表与数组(三)-单向链表上的简单操作
- 简单链表操作
- c#使用API进行模拟鼠标点击 底层操作同样简单
- 一个简单的模拟键盘鼠标操作的类
- 链表简单操作
- 单链表操作可如此简单
- 数据结构:链表的简单操作
- 防止模拟键盘一类工具操作自己的系统的“简单实现”
- 链表的简单操作
- 队列模拟(简单链表数据结构的处理)
- 简单模拟操作系统中的文件操作(2)
- hdu 1216简单的链表模拟