现在的位置: 首页 > 综合 > 正文

帮同学写的ATM机模拟(简单链表操作)

2019年04月11日 ⁄ 综合 ⁄ 共 3552字 ⁄ 字号 评论关闭
#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;
}

抱歉!评论已关闭.