您的位置:首页 > 其它

帮同学写的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: