小萌新第一次写ATM项目,里面有部分解析,希望对你们有帮助。



#include <stdio.h>
#include <stdlib.h>//清屏头文件
#include<conio.h>//getch头文件
#include<string.h>//字符类


struct uses
{
    char usename[20];
    char password[7];
    int account;
    float money;
}user,t;


//int count=0;//记录元素的个数
int f=0;//标记是否找到匹配账号 0未找到 1找到
int find;//记录找到的结构体变量在数组中的下标
int isLogout;//标记是否注销
int dFind;//记录找到的用户
FILE *fp;
void getMoney()//取款
{
    int money;
    system("cls");
    printf("\n\n\t\t\t\t\t您正在使用取款功能");
    printf("\n\n\t\t\t\t\t请输入取款金额:");
    scanf("%d",&money);
    if(money>user.money)
        printf("\n\n\t\t\t\t\t操作失败,您的余额不足");
    else
    {
        if(money>2000)
            printf("\n\n\t\t\t\t\t单次取款不能超过两千");
        else
        {
            user.money=user.money-money;
            fseek(fp,-sizeof(user),1);
            fwrite(&user,sizeof(user),1,fp);
            printf("\n\n\t\t\t\t\t操作成功");
        }
    }
}


void saveMoney()//存款
{
    int money;
    system("cls");
    printf("\n\n\t\t\t\t\t您正在使用存款功能");
    printf("\n\n\t\t\t\t\t请输入存款金额:");
    scanf("%d",&money);
    if(money>10000)
    {
        printf("\n\n\t\t\t\t\t单次存款不能超过一万");
    }
    else
    {
        user.money=user.money+money;//修改了内存中的用户余额
        fseek(fp,-sizeof(user),1);
        fwrite(&user,sizeof(user),1,fp);
        printf("\n\n\t\t\t\t\t操作成功");
    }
}




void selectMoney()//查询
{
    system("cls");
    printf("\n\n\t\t\t\t\t您正在使用余额查询功能");
    printf("\n\n\t\t\t\t\t您的余额是:%.2fRMB",user.money);
}




void login()//登录
{
    char password[100];
    int account;
    int length;
    fp=fopen("atm.txt","rb+");
    if(fp==NULL)
    {
        printf("\n\n\n\n\t\t\t\t文件丢失");
    }
    system("cls");
    printf("\n\n\n\n\t\t\t\t登录页面");
    printf("\n\n\n\n\t\t\t\t请输入账号:");//获取输入账号
    scanf("%d",&account);//依次获取结构体的元素
    fseek(fp,0,2);//将文件指针指向文件的末尾
    length=ftell(fp);//获取此时指针相对文件起始偏移量
    rewind(fp);
    while(ftell(fp)<length)
    {
        fread(&user,sizeof(user),1,fp);
        //将输入的账号与结构体数组的元素的账号进行比对
        if(user.account==account)
        {
            f=1;
            break;
        }
    }
    if(f==1)
    {
        for(int j=0;j<3;j++)
        {
            printf("\n\n\t\t\t\t请输入密码:");
            fflush(stdin);
            inputPass(password);
            if(strcmp(user.password,password)==0)
                {
                    printf("\n\n\n\n\t\t\t\t登陆成功");
                    printf("\n\n\n\n\t\t\t\t进入服务页面.....");
                    getch();
                    service();
                    break;
                }
            else
                {
                    if(j==2)
                        {
                            printf("\n\n\n\n\t\t\t\t您输入的密码3次错误,请返回主页面!");
                            break;
                        }
                printf("\n\n\n\n\t\t\t\t密码错误,请重新输入");
                }
        }




    }
    else
        printf("\n\n\t\t\t\t您输入的账号有误,请重新输入");


}




void transMoney()//转账
{
    int money;
    int account;
    int n=ftell(fp);
    struct uses t;
    system("cls");
    printf("\n\n\t\t\t\t\t您正在使用转账功能");
    printf("\n\n\t\t\t\t\t请输入对方账号:");
    scanf("%d",&account);
    fseek(fp,0,2);
    int length=ftell(fp);
    rewind(fp);
    while(ftell(fp)<length)
    {
        fread(&t,sizeof(t),1,fp);
        if(t.account==account)
        {
            f=1;
            break;
        }


    }
    if(f==1)
    {
        printf("\n\n\t\t\t\t\t请输入转账金额:");
        scanf("%d",&money);
        if(money>user.money)
            printf("\n\n\t\t\t\t\t操作失败,余额不足");
        else
        {
            user.money=user.money-money;
            t.money=t.money+money;
            fseek(fp,-sizeof(t),1);
            fwrite(&t,sizeof(t),1,fp);
            fseek(fp,n-sizeof(user),0);
            fwrite(&user,sizeof(user),1,fp);
            printf("\n\n\t\t\t\t\t操作成功!");
        }
    }
    else
        printf("\n\n\t\t\t\t\t对方账号不存在!");
}






void updatePassword()//修改密码
{
    char oldPassword[100];
    char rePassword[100];
    char newPassword[100];
    for(int i=0;i<3;i++)
    {
        system("cls");
        printf("\n\n\t\t\t\t您在使用修改密码的功能");
        printf("\n\n\t\t\t\t请输入原始密码:");
        fflush(stdin);
        inputPass(oldPassword);
        if(strcmp(user.password,oldPassword)==0)
        {
            break;
        }
        else
        {
            if(i==2)
            {
                printf("\n\n\t\t\t\t原始密码输入错误三次,已锁定!");
                return;
            }
            printf("\n\n\t\t\t\t原始密码错误,请重新输入!");
            printf("\n\n\t\t\t\t按任意键继续...");
            getch();
        }


    }
        while(1)
        {


            printf("\n\n\t\t\t\t请输入6位新密码:");
            fflush(stdin);
            inputPass(newPassword);
            if(strlen(newPassword)!=6)
            {
                printf("\n\n\t\t\t\t密码输入有误,请输入6位密码");
                continue;
            }
            printf("\n\n\t\t\t\t请再次输入新密码:");
            fflush(stdin);
            inputPass(rePassword);
            if(strcmp(newPassword,rePassword)==0)
            {
                strcpy(user.password,newPassword);
                fseek(fp,-sizeof(user),1);
                fwrite(&user,sizeof(user),1,fp);
                printf("\n\n\t\t\t\t密码修改成功");
                break;
            }
            else
                printf("\n\n\t\t\t\t两次密码输入不一致,请重新输入");
                printf("\n\n\t\t\t\t按任意键继续.....");
                getch();
        }
}




void service()//服务
{
    char chose;
    while(1)
    {
    system("cls");
    printf("\n\n\n\n\t\t\t\t\t\t欢迎进入服务界面");
    printf("\n\n\n\t\t\t\tA.查询余额");
    printf("\t\t\t\tB.存款");
    printf("\n\n\t\t\t\tC.取款");
    printf("\t\t\t\t\tD.转账");
    printf("\n\n\t\t\t\tE.修改密码");
    printf("\t\t\t\tF.注销");
    printf("\n\n\n\n\t\t\t\t\t\t  G.退出系统");
    printf("\n\n\t\t\t\t\t\t  请选择");
    fflush(stdin);
    scanf("%c",&chose);
    //int isLogout;
    switch(chose)
    {
        case 'A':
        case 'a':selectMoney();
            break;
        case 'B':
        case 'b':saveMoney();
            break;
        case 'C':
        case 'c':getMoney();
            break;
        case 'D':
        case 'd':transMoney();
            break;
        case 'E':
        case 'e':updatePassword();
            break;
        case 'F':
        case 'f':
            isLogout=logout();
            if(isLogout==1)
            {
                fclose(fp);
                return;
            }
            break;
        case 'G':
        case 'g':quit();break;
        default:
            printf("\t\t\t\t\t\n\n\n您的输入有误,请重新输入");
    }
    printf("\n\n\t\t\t\t按任意键继续....");
    getch();
    }


}






void quit()//退出
{
    char choise;
    printf("\n\t\t\t\t\t\t确定退出系统,Y是  N否");
    fflush(stdin);
    printf("\n\n\t\t\t\t\t");
    scanf("%c",&choise);
    if(choise=='Y'||choise=='y')
    {
        system("cls");
        printf("\n\n\t\t\t\t正在退出,请稍后...");
        exit(0);
    }
    else
        return;
}






//struct uses user[100];
void loading()//加载
{
    int t=1;
    for(int i=1;i<=100;i++)
    {
        printf("\n\n\n\n\t\t\t\t欢迎使用ATM系统,请稍后");
        printf("%d%%",i);
        for(int k=1;k<=t;k++)
            printf(".");
        t++;
        if(t==11)
            t=1;
        for(int j=0;j<100000,0;j++);//延迟
        system("cls");
    }
}








void inputPass(char pass[7])//输入
{
    char ch;//获得用户输入的第一个字符
    int i=0;
    while(1)
    {
        ch=getch();//判断输入的是否是回车
        if(ch!='\r')// \r是回车
        {
            if(ch!='\b')// \b是退格
            {
                pass[i]=ch;
                i++;
                printf("*");
            }
            else if(i>0)//只有在i>0时,才删掉*  `
            {
                i--;
                printf("\b \b");//退格,用空格代替那个字符,然后退格
            }


        }
        else
                break;


    }
    pass[i]='\0';
}








void regist()//注册
{
    fp=fopen("atm.txt","ab+");
    if(fp==NULL)
    {
        printf("文件操作失败");
        return;
    }
    system("cls");
    char rePassword[20];
    struct uses t;
    printf("\n\n\n\n\t\t\t\t注册页面");
    printf("\n\n\t\t\t\t请输入用户名:");
    fflush(stdin);//字符缓冲区
    gets(user.usename);
    while(1)
        {
            while(1){
                printf("\n\n\t\t\t\t请输入6位密码:");
                fflush(stdin);
                inputPass(user.password);
                int length=strlen(user.password);//判断密码的长度
                if(length==6)
                    break;
                else
                    printf("\n\n\t\t\t\t您的输入有误,请重新输入6位密码!");
            }
        printf("\n\n\t\t\t\t请确认您的密码:");
        inputPass(rePassword);
        fflush(stdin);
        if(strcmp(user.password,rePassword)==0)
        {
            rewind(fp);
            if(fread(&t,sizeof(t),1,fp)==1)
            {
                //此时指针指向的是文件的末尾
                //1.将指针向前移动sizeof(user)位
                fseek(fp,-sizeof(t),2);
                //2.从此时的指针位置开始读取sizeof(user)位
                //3.将读取的数据赋值给一个临时变量(上一个注册的用户)
                fread(&t,sizeof(t),1,fp);
                //4.取出这个临时变量的账号
                user.account=t.account+1;
            }
            else{
                  user.account=20180001;


            }
            fseek(fp,0,2);
            fwrite(&user,sizeof(user),1,fp);
            printf("\n\n\t\t\t\t    注册成功");
            //count++;
            printf("\n\n\t\t\t\t账号为:%d",user.account);
            fclose(fp);
            getch();
            break;
        }
        else
            printf("\n\n\t\t\t\t两次密码输入不一样,请重新输入!");
        }


}




int logout()//注销
{
    char choise;
    int isLogout;
    printf("\n\t\t\t\t\t\t%s确定注销?Y是  N否",user.usename);
    fflush(stdin);
    printf("\n\n\t\t\t\t\t");
    scanf("%c",&choise);
    if(choise=='Y'||choise=='y')
    {
        isLogout=1;
    }
    else{
        isLogout=0;
    }


    return isLogout;
}






main()
{
    char z;
    printf("\n\n\n\n\t\t\t\t***********欢迎使用ATM系统***********");
    printf("\n\n\t\t\t\t\t\t注意事项");
    printf("\n\n\t\t\t\t请保管好自己身上的财物,观察身边周围的环境");
    printf("\n\n\n\t\t\t\t\t    如果继续,请输入");
    printf("\n\n\n\t\t\t\t\t\tY是   N否");
    printf("\n\n\t\t\t\t\t");
    fflush(stdin);
    scanf("%c",&z);
    system("cls");
    if(z=='Y'||z=='y')
        {
            loading();
            while(1)
            {
                printf("\n\n\n\n\t\t\t\t\t*****************************");
                printf("\n\n\n\n\t\t\t\t\t\ta.用户注册");
                printf("\n\n\t\t\t\t\t\tb.用户登录");
                printf("\n\n\t\t\t\t\t\tc.退出系统");
                printf("\n\n\n\n\t\t\t\t\t*****************************");
                printf("\n\n\t\t\t\t\t\t请输入选项:");
                char choise;
                fflush(stdin);//字符缓冲区 把空格和回车那种特殊的字符缓冲掉


                scanf("%c",&choise);
                if(choise=='a'||choise=='A')
                    regist();//执行注册函数
                    else if(choise=='b'||choise=='B')
                    {
                        login();
                    }
                    else if(choise=='c'||choise=='C'){
                        system("cls");
                        quit();
                    }
                    else
                        printf("\n\n\t\t\t\t您的输入有误,请重新输入");
                getch();
                system("cls");//清屏
            }
}
    else if(z=='N'||z=='n'){
        printf("\n\n\t\t\t\t正在退出.....");
        getch();
        fflush(stdin);
        system("cls");//清屏
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值