c语言项目实践---设计简单银行登录、存取款、改密系统

要求:
1. 登录:输入账号、密码正确才能进入菜单系统,输入3次错误则退出系统
2. 菜单:含有(1)查询余额、(2)取款、(3)存款、(4)改密、(5)退卡


关于要使用的文件如何布局:
1.每条独立的信息单独一行
2.在密码、金额一行,右边需要许多空格(因为用的是“r+”打开模式,用空格可以填充字符)
3.下方图片中为演示布局,每3行为一个用户的信息(账户、密码、余额),另外红线表示有空格+一个回车
4.特别注意:如果在文件反复几次回车,可能一行会有几个换行符。一定要确保一行只有一个回车


这里写图片描述

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    FILE* fpr;
    double balance,tempmoney;//余额、临时存储的金额
    char account[20],key[20];//用户输入的账号、密码
    char systemaccount[100] = {0},systemkey[100] = {0},useless[100] = {0};//系统中存储的账户、密码、无用的信息
    char sign = 0;//登录成功与否的标志,1表示登录成功,0表示失败
    unsigned function;//菜单功能选项
    int i,j;//循环计数变量

    int locationkey,locationbalance;//密码在文件中的位置、余额在文件中的位置
    //----------------------------------------------------

    if((fpr = fopen("I:\\cstudy\\bank\\bank.txt","r+")) == NULL)
    {
        printf("系统发生错误,正在维护中\n");
        exit(0);
    }

    for(i = 0;i<3;i++)
    {
        fflush(stdin);
        printf("请输入账号:");
        scanf("%s",account);
        printf("\n请输入密码:");
        scanf("%s",key);
        while((fgets(systemaccount,99,fpr)) != NULL)
        {
            for(j = 0;*(systemaccount+j);j++)//去除文件中存储账号一行的换行符,如果按照二进制打开,要去除'\r''\n'
            {
                if(*(systemaccount+j) == '\n')
                {
                    *(systemaccount+j) = '\0';
                }
            }
            locationkey = ftell(fpr);//返回密码在文件中的位置
            fscanf(fpr,"%s",systemkey);
            fgets(useless,99,fpr);//跳过空格
            locationbalance = ftell(fpr);//返回余额在文件中的位置
            fgets(useless,99,fpr);//跳过余额,因为登录只需要账号和密码
            if(strcmp(account,systemaccount) == 0 && strcmp(key,systemkey) == 0)//当账户密码与系统中的账户密码一致
            {
                printf("登录成功\n");
                sign = 1;
                break;
            }

        }
        if(sign == 0)//当没有与用户输入的账户及密码匹配时
        {
            printf("账号或者密码错误!\n您还有%d次输入机会\n",2-i);
            if(i == 2)//i = 2时,说明用户已经输入了3次
            {
                printf("您已经3次输入错误,您的账户已被冻结,在冻结期内禁止登录!\n");
                exit(1);
            }
        }
        else
        {
            break;//退出登录系统,进入菜单系统
        }
    }
    //-------------------------------------------------------------
    do
    {
        printf("\n\n菜单:     \n");
        printf("(1) 查询余额  \n");
        printf("(2) 取款      \n");
        printf("(3) 存款      \n");
        printf("(4) 修改密码  \n");
        printf("(5) 退卡      \n");

        scanf("%d",&function);
        switch(function)
        {
        case 1:
            {
                fseek(fpr,locationbalance,SEEK_SET);//将文件指针移动到余额位置
                fscanf(fpr,"%lf",&balance);
                printf("您的余额为:%.3f\n",balance);
                break;
            }
        case 2:
            {
                fseek(fpr,locationbalance,SEEK_SET);
                fscanf(fpr,"%lf",&balance);
                printf("请输入金额:\n");
                scanf("%lf",&tempmoney);
                if(tempmoney < balance)//想要取的钱小于余额时
                {
                    balance -= tempmoney;
                    printf("取款成功!\n");
                    fseek(fpr,locationbalance,SEEK_SET);
                    fprintf(fpr,"%-10.3lf",balance);
                }
                else
                {
                    printf("您的余额不足!\n");
                }

                break;
            }
        case 3:
            {
                fseek(fpr,locationbalance,SEEK_SET);
                fscanf(fpr,"%lf",&balance);
                printf("请输入金额:\n");
                scanf("%lf",&tempmoney);
                balance += tempmoney;
                printf("存款成功!\n");
                fseek(fpr,locationbalance,SEEK_SET);
                fprintf(fpr,"%-10.3lf",balance);
                break;
            }
        case 4:
            {
                fseek(fpr,locationkey,SEEK_SET);//将文件指针移动到密码位置
                printf("请输入新密码:\n");
                scanf("%s",key);
                fprintf(fpr,"%-20s",key);
                printf("修改密码成功!\n");
                break;
            }
        case 5:
            {
                printf("已经退出成功!\n");
                exit(1);
            }
        }


    }while(sign);//此时sign = 1
    fclose(fpr);
    return 0;
}

使用软件:code::block
运行结果:
这里写图片描述


运行后的文件:
这里写图片描述

  • 11
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值