用C语言编写简化版银行系统:ATM取款机(数组版)

问题描述:

该银行储蓄系统的目标。结合前面的基础上开始设计一个c版银行储蓄系统,前面刚学完c言的基本操作以及自定义函数,还未涉及指针以及构体。这个简化版银行系统算是结合前面所学的知识的一个总结,适合初学者练手;该系统可以支持多名储户开户、存款、取款、转帐、改密、挂失、解挂、销户等功能的系统。这里用的数组存放信息,但是也暴露的缺陷,将在以后学习结构体了以后再进行改进。由于目前为想到自定义结构体,暂且用数组代替:

字符型数组 AccName[topNum][9]存放账户名

整形数组users[topNum][2]存放密码、状态(状态0表示账户正常,状态1表示挂失,状态为3表示销户)

字符型数组 nameGroup[topNum][10]存放用户姓名

双精度数组 balance[topNum]存放账户余额

用C语言编写简化版银行系统:ATM取款机(数组版)_第1张图片

以此初步体会完整系统开发,综合运用已经学过的知识。以下提示中,给出了多个层次的需要,可以先保证最基本、最简单功能的实现,迭代式地完善,实现“改进意见”中的要求。  按照模块化程序设计要求,充分利用函数实现功能。下面为程序的功能界面

用C语言编写简化版银行系统:ATM取款机(数组版)_第2张图片

这里需要新建俩文件夹一个存放业务员姓名和密码的Worker.txt文件,一个存放用户的密码、状态、用户姓名、账号、余额的account.dat文件。如图:

用C语言编写简化版银行系统:ATM取款机(数组版)_第3张图片

Worker.txt文件存放业务员姓名和密码:如图

用C语言编写简化版银行系统:ATM取款机(数组版)_第4张图片

account.dat文件存放用户的密码、状态、用户姓名、账号、余额信息

用C语言编写简化版银行系统:ATM取款机(数组版)_第5张图片

程序代码:

#include 
#include //itoa所需要的库函数
#include 
#include 
#include 

#define topNum 2000 //系统最多容纳用户数目
int uActual;//实际人数
char AccName[topNum][9];//账户名
int users[topNum][2];//密码、状态,0行不存放
char nameGroup[topNum][10];//用户姓名,0行不存放
double balance[topNum];//账户余额,0行不存放


int iPWD();
void uExpotrData();//导出数据
void uImportData();//写入数据
void Work();//办理
int BankMenu();//银行界面
void Deposit();
void Withdraw();//取款
void ChangePWD();//改密
void Cancellation();//销户
void Sleep();//挂失
void Recovery();//解挂
void TransferAccount();//转账
void CreateAccount();//开户
void Qurey();//查询


void creatAccNum(int );
int createPWd(int );
int seek(char []);//账户判断
int see(char []);//账号查询
int verifyAll();
int verifyPAD(int Num);//密码验证
int inputPWD();
int main()
{
    printf("+------------------+\n");
    printf("+ 欢迎来到CSDN银行 +\n");
    printf("+------------------+\n");
    if(iPWD())//业务员密码验证
    {
        uExpotrData();//从文件导出数据
        Work();//业务办理
        uImportData();//写入数据到文件
    }
    return 0;
}

/*

功能:验证用户密码

返回值:密码正确,返回1;

        不能通过密码验证,返回0

*/
int iPWD()//密码登录
{
    int right = 0;
    int iTry = 3;
    int i ;
    char ch;
    char inputPsss[20];//输入账户密码
    char sNameFile[20];//文件保存业务员登录名称名
    char sPassFile[20];//业务员登录密码
    char inputName[20];//输入业务员登录名称
    FILE *fp;
    if((fp = fopen("Worker.txt","r"))==NULL)
    {
        printf("Cannot open file!");
        exit(0);
    }
    fscanf(fp,"%s %s",sNameFile,sPassFile);
    fclose(fp);

    do{
            i = 0;
            printf("请输入业务员用户名:");
            scanf("%s",inputName);
            printf("\n请输入登录密码:");
            while((ch=getch())!= '\r')
            {
                inputPsss[i++] = ch;
                putchar('*');
            }
            inputPsss[i] = '\0';
            fflush(stdin);
            printf("\n");
            if(strcmp(inputName,sNameFile)==0 && strcmp(inputPsss,sPassFile)==0)
            {
                right = 1;
                break;
            }
            else
            {
                iTry--;
                if(iTry > 0)
                {
                    printf("输入密码错误%d次,请重新输入\n",4-iTry);
                }
                else
                {
                    printf("密码输入已达3次,退出系统\n");
                }
            }
    }while(iTry);
    return right;
}

/*

功能:从文件中读取储户数据

*/
void uExpotrData()//导入数据
{
    int i=0;
    FILE *fp;
    if((fp = fopen("account.dat","r")) == NULL)
    {
        printf("File cannot open!\n");
        exit(0);
    }
    if(feof(fp))
    {
        uActual = 0;
    }
    else
    {
        //密码、状态、用户姓名、账号、余额写入
        while(fscanf(fp,"%d %d %s %s %lf",&users[i][0],&users[i][1],nameGroup[i],AccName[i],&balance[i]) != EOF)
            i++;
        fclose(fp);
        uActual = i;
    }
}

/*

功能:将用户数据保存到文件中

*/
void uImportData()//写入数据
{
    int i=0;
    FILE *fp;
    if((fp = fopen("account.dat","w")) == NULL)
    {
        printf("File cannot open!\n");
        exit(0);
    }
    //密码、状态、用户名、账号、余额写入
    for(i=0;i=0)
            break;
        else
            printf("请输入1~9的选项");
    }while(1);
    return Choice;
}

/*

功能:存款

说明:需要保证账户存在,且处于正常状态

*/
void Deposit()//存款
{
    int site;
    double uMoney;
    if((site = verifyAll())!= -1)//身份验证
    {
            printf("请输入存款金额:");
            scanf("%lf",&uMoney);
            balance[site] +=uMoney;
            printf("已存款%0.2lf元\n余额为%0.2lf元\n",uMoney,balance[site]);
    }
}

/*

功能:取款

说明:需要保证账户存在,且处于正常状态,另外,余额要足够取

*/
void Withdraw()//取款
{
    int site;
    double uMoney;
    if((site = verifyAll())!= -1)//身份验证
    {
        printf("请输入取款金额:");
        scanf("%lf",&uMoney);
        if(uMoney ,还有用到#include函数库里面的strlen统计字符数组包含的长度;
以及strrry()函数将字符串倒置。*/
void creatAccNum(int num)//根据实际人数自动生成账号
{
    int n;
    char s[20];//将num以字符形式保存
    char N[20]="CSDN";
    itoa(num,s,10); // itoa(int,char,要转换的十进制数)
    strrev(s);//数组倒置
    n=strlen(s);//长度
    while(n<4)
    {
        s[n]='0';
        n++;
    }
    s[n]='\0';
    strrev(s);
    strcat(N,s);//数字连接
    printf("%s\n",N);
    strcpy(AccName[num],N);//拷贝到用户账户里面
    return;
}

/*

功能:对新密码进行核对
说明:第一次有输入的密码与第二次输入的密码进行比较,如果密码相同则返回1表示设置成功,否者返回0

*/
int createPWd(int Num)//创建密码并校验
{
    int uPass1;//第一次输入要更改的密码
    int uPass2;//第二次输入要更改的密码
    printf("\n创建密码:");
    uPass1 = inputPWD();
    printf("\n请重新输入密码:");
    //fflush(stdin);
    uPass2 = inputPWD();
        if(uPass1==uPass2)
        {
            users[Num][0]=uPass1;//写入密码
            printf("\n创建密码完成\n");
            return 1;
        }
        else
        {
            printf("\n密码不一致!\n");
        }
        return 0;
}
/*

功能:对账户进行身份验证
说明:分别验证账户,密码,当验证成功返回序号下标,账户验证失败返回-1

*/
int verifyAll()
{
    char str[20];//存储输入账号数字
    printf("请输入账号:");
    gets(str);//标准输入设备读字符串函数
    fflush(stdin);
    int site;
    if((site =seek(str))!= -1)//账户验证
    {
        if(verifyPAD(site)!= -1)//密码验证
            {
                printf("\n成功\n");
            }
        else
            site = -1;
    }
    else
        printf("\n失败\n");
    return site;
}

/*

功能:对输入账户进行验证
功能:当对输入的

*/
int seek(char str[])//账户判断
{
    int judge=-1;
    int Num=0;
    if((Num = see(str))!= -1)//: 将一个串与另一个比较, 不管大小写,
    {
        if(users[Num][1]==0)//
        {
            printf("姓名:%s\n",nameGroup[Num]);
            judge = Num;//账户序号返回
        }
        else if(users[Num][1]==1)
        {
            printf("该账户已经挂失\n");
        }
        else
        {
            printf("该账户已经销户");
        }
    }
    else
    {
        printf("该账户不存在");
    }
    return judge;
}

/*

功能:根据账号查询用户,返回用户的下标

入口参数:要查询用户的账号

返回值:如果该用户存在,返回该用户在数组中的下标,否则,返回一个负数(-1)

*/
int see(char str[])//账号查询
{
    int ptr;//存放strnicmp函数返回值
    int i;
    char N[]="CSDN";//账号前缀
    int digit;//长度
    int judge=-1;
    int Num = 0;//将数字字符转换为数字
    digit = strlen(str);//统计长度
    ptr = strnicmp(str,N,4);//
    if(digit == 8&&ptr == 0)
    {
        for(i=4;i<8;i++)
            if(isdigit(str[i]))//检查其参数是否为十进制数字字符
                Num = Num*10+(str[i]-'0');
    }
    else
    {
        if(digit != 8)
            printf("账号位数出错\n");
        if(ptr !=0)
            printf("账号请以CSDN开头\n");
    }
    if(strcmpi(str,AccName[Num])==0)//: 将一个串与另一个比较, 不管大小写,
        {
            printf("查找成功\n");
            judge = Num;
        }
    else
        printf("查找失败\n");
    return judge;
}
/*

功能:密码进行验证
功能:当输入密码,如果与原设置密码一致则返回数组下标序号,否则返回-1

*/
int verifyPAD(int Num)//密码验证
{
    int Pass_u;
    int judge=0;
    printf("请输入密码:");
    Pass_u = inputPWD();
    if(Pass_u == users[Num][0])
        judge = Num;//返回存在的序号
    else
    {
        printf("\n密码错误\n");

    }
    return judge;
}

/*

功能:输入密码

返回值:整型的密码值

技术说明:

(1)此功能在多个模块中都要用到且功能单一,故分离出来,单独作业一个函数

(2)为了便于在输入中只显示*,接受输入时以字符形式输入,而后转为对应的整型数

(3)规定密码由不全为0的6位数字构成(当开头是'0'时,实际不足6位),一旦输入错误将重新输入

附:在实际的系统中,密码通常用字符串描述,即使只允许出现数字字符

首先要明白,从键盘输入的数据会先存到缓冲区,然后在存放到内存中。但是数据存放到内存中之后,
缓冲区的数据并没有释放。如果不给电脑一个清空缓冲区的命令就会造成输入无效的情况。所以需要用
到fflush(stdin)释放缓冲区。具体在C语言中主要表现在getchar()等从键盘单个或逐个数据读取的函数上
*/
int inputPWD()//密码创建
{
    int i;
    char ch;//接受字符型密码
    int uPass=0;//字符型密码转换为数字
    do
    {
        for(i=0;i<6;i++)
        {
            ch=getch();
            printf("*");
            if(isdigit(ch))//检查输入是否为十进制数字字符
                uPass=uPass*10+(ch - '0');
            else
            {
                uPass=0;
                break;
            }
        }
        fflush(stdin);
        if(uPass == 0)
        {
            printf("\n");
            printf("密码仅能够为数字\n");
            printf("请重新输入密码\n\n");
        }
        else
        {
            break;
        }
    }while(1);

    return uPass;
}

运行结果:

1存款                                                    

用C语言编写简化版银行系统:ATM取款机(数组版)_第6张图片                          

2取款

用C语言编写简化版银行系统:ATM取款机(数组版)_第7张图片

3改密

用C语言编写简化版银行系统:ATM取款机(数组版)_第8张图片

4销户

用C语言编写简化版银行系统:ATM取款机(数组版)_第9张图片

5开户

用C语言编写简化版银行系统:ATM取款机(数组版)_第10张图片

6………………………

心得体会:

作为一个菜鸟,开始慢慢前进,多多少少感到有收获,由于水平有限,多多少少有错,望包涵

这是再之前简化版函数的解除是改进的,简化版如下:

简化版银行系统1(简单版:点击打开)

简化版银行系统2(函数版:点击打开)

你可能感兴趣的:(c语言)