首页 > 代码库 > 银行储蓄系统的设计与实现

银行储蓄系统的设计与实现

作者:夏晓林

地点:烟大计控

时间:2017.04.23

题目描述:

        模拟银行柜台业务的要求,实现一个小型的银行储蓄系统软件的开发,其中包括开户、存款、取款、转账、改密、挂失、解挂、销户等功能。

        在开发过程中,请按照问题求解过程的要求,体验开发过程中需要做的工作。除了下面的系统基本功能的描述外,鼓励开展调研,使开发的软件尽量符合实际的银行储蓄系统的实际业务内容。可以参考8.1节中关于选用合适的数据结构的讨论,确定数据存储方案。

        要求在程序运行过程中或者程序结束运行之前,将业务发生的数据保存到文件中,并在下一次运行时,能从文件中读取数据,使业务能够继续在原有的基础上开展。可以使用文本文件,也可以使用二进制文件。

        根据模块化程序设计的要求,将各功能设计成独立的函数实现。必要时,提取出公共的功能设计专门的函数,作为支持各函数中的子功能要调用的模块。建议设计“”菜单“”式的操作界面,方便用户的使用。

        各功能的要求分别如下:

     (1)开户:增加一个银行账户,输入账号、姓名、密码、金额、状态自动设置为0(正常)。建议输入密码的过程中,以*号代替实际输入的符号显示出来(实际方法请利用搜索引擎获得帮助)。作为对密码的设置,在输入一次密码后,需要再次输入密码,两次输入一致后,才接受并保存。由于设置了密码,其他业务都需要 在输入账号密码斗殴正确后才能继续。

     (2)存款:输入账号、金额,增加该账号的金额

     (3)取款:输入账号、金额,减少取款的金额。要求取款额不能超过原余额

     (4)查询:输入账号,显示账户信息。

     (5)转账:输入转出的账号及金额以及转入的账号,减少转出账号的金额,增加转入账号的金额。要求转出账户的金额不能超过该账号的余额,转出减少的金额,与转入账户增加的金额相同。

     (6)挂失:输入账号,将其状态变为1(挂失)。处于挂失状态的账户,不能进行除解挂以外的任何操作。

     (7)解挂:输入账户,将其状态变为0。

     (8)销户:输入账号,确认后,提示将余额全部取完,将余额置为0,并将状态state置为2(销户)。办理销户的账号,不能再执行除查询以外的功能。

     (9)改密:用新密码代替旧密码。新密码要求输入两次,一致后才确认改密成功。

C语言代码:

#include <stdio.h>
#include <stdlib.h>
#include<ctype.h>//isdigit函数的头文件
#include <conio.h>//getch()的头文件
#define NumMax 1000
int N;
void OpenAccount();//开户
void SaveMoney();//存款
void DrawMoney();//取款
void Inquire();//查询
void TransferAccounts();//转账
void ReportTheLoss();//挂失
void SolutionToHang();//解挂
void ClosingAccount();//销户
void ChangeThePassword();//改密
int search();//判断账号的位置
int InputPassword();//输入密码
int judge();
typedef struct
{
    int num;//账号
    char name[20];//用户名
    int password;//密码
    double balance;//余额
    int status;//状态:0正常 1挂失 2销户
} Account;
Account user[NumMax];
int main()
{
    int i=0,a;
    FILE *fp;
    if ((fp=fopen("account.txt", "r"))==NULL)
    {
        printf("打不开文件!");
        exit(0);
    }
    while(fscanf(fp,"%d %s %d %lf %d",&user[i].num, user[i].name, &user[i].password, &user[i].balance,&user

                 [i].status ) != EOF)
    {
        i++;
    }
    fclose(fp);
    N=i;
    printf("---------\n");
    printf("欢迎光临!\n");
    printf("---------\n");
    while(a!=10)
    {
        printf("*************************\n");
        printf("请选择您的操作:\n");
        printf("1.开户  2.存款  3.取款  4.查询  5.转账\n");
        printf("6.挂失  7.解挂  8.销户  9.改密  10.欢迎再次使用\n");
        printf("*************************\n");
        scanf("%d",&a);
        if(a>0&&a<=10)
        {
            switch(a)
            {
            case 1:
                OpenAccount();
                break;
            case 2:
                SaveMoney();
                break;
            case 3:
                DrawMoney();
                break;
            case 4:
                Inquire();
                break;
            case 5:
                TransferAccounts();
                break;
            case 6:
                ReportTheLoss();
                break;
            case 7:
                SolutionToHang();
                break;
            case 8:
                ClosingAccount();
                break;
            case 9:
                ChangeThePassword();
                break;
            case 10:
                printf("欢迎再次使用!\n");
                break;
            }
        }
        else
            printf("输入错误。请重新输入\n");
    }
    if ((fp=fopen("account.txt", "w"))==NULL)
    {
        printf("打不开文件!");
        exit(0);
    }
    for(i=0; i<N; i++)
        fprintf(fp,"%d %s %d %lf %d\n",user[i].num, user[i].name, user[i].password, user[i].balance,user[i].status

               );
    fclose(fp);
    return 0;
}
void OpenAccount()
{
    if(N==NumMax)
    {
        printf("银行用户数已达上限,不能开户");
        return;
    }
    printf("正在开户\n");
    user[N].num=10001+N;
    printf("账号:%d\n", user[N].num);
    printf("户主姓名:");
    scanf("%s", user[N].name);
    int mima1, mima2;
    printf("密码:");
    mima1=InputPassword();
    printf("确认密码:");
    mima2=InputPassword();
    if(mima1==mima2)
    {
        user[N].password=mima1;
        user[N].status=0;
        N++;
        printf("成功开户!\n");
    }
    else
    {
        printf("两次密码不一致,未成功开户!\n");
    }
}
void SaveMoney()
{
    int a;
    int num;//账号
    int who;//查找到该账号在数组中对应的下标
    int mima;
    double money;
    char str[100];
    printf("请输入您的账号:\n");
    scanf("%d",&num);
    who = search(num);
    if(who<0)
        printf("该用户不存在,存款失败!\n");
    else
    {
        if(user[who].status==0)
        {
            printf("请输入密码:");
            mima=InputPassword();
            if(mima!=user[who].password)
                printf("密码错误,请重新输入:");
            else
            {
                printf("户主姓名:%s\n", user[who].name);
                printf("输入存款额:");
                scanf("%s", str);
                a=judge(str);
                while(a!=1)
                {
                    printf("输入错误,请重新输入存款额\n");
                    scanf("%s", str);
                    a=judge(str);
                }
                if(a==1)
                {
                    money=atoi(str);
                    if(money<0||money>1000000)
                        printf("输入金额太大,自动退出\n");
                    else
                    {
                        user[who].balance+=money;
                        printf("您的当前余额为%.2f元. \n",user[who].balance);
                    }
                }
            }
        }
        else if(user[who].status==1)
            printf("该用户处于挂失状态,存款失败!\n");
        else  if(user[who].status==2)
            printf("该用户已经销户,存款失败!\n");
    }
}
void DrawMoney()
{
    char str[100];
    int a;
    int num, who,mima;
    double money;
    printf("账号:");
    scanf("%d", &num);
    who = search(num);
    if(who<0)
    {
        printf("该用户不存在,取款失败!\n");
    }
    else
    {
        if(user[who].status==0)
        {
            printf("户主姓名:%s\n", user[who].name);
            printf("密码:");
            mima=InputPassword();
            if(mima!=user[who].password)
            {
                printf("输入密码错误,取款失败!\n");
            }
            else
            {
                printf("输入取款额:");
                scanf("%s", str);
                a=judge(str);
                while(a!=1)
                {
                    printf("输入错误,请重新输入取款额\n");
                    scanf("%s", str);
                    a=judge(str);
                }
                if(a==1)
                {
                    money=atoi(str);
                    if(money>user[who].balance)
                        printf("余额不足,取款失败!\n");
                    else
                    {
                        user[who].balance-=money;
                        printf("取款成功,您的余额为%.2f元. \n",user[who].balance);
                    }
                }
            }
        }
        else if(user[who].status==1)
        {
            printf("该用户处于挂失状态,取款失败!\n");
        }
        else
        {
            printf("该用户已经销户,取款失败!\n");
        }
    }
    printf("欢迎下次光临\n");
}
void Inquire()
{
    int num, who;
    int mima;
    printf("账号:");
    scanf("%d", &num);
    who = search(num);
    if(who<0)
    {
        printf("该用户不存在,查询完毕!\n");
    }
    else
    {
        printf("户主姓名:%s\n", user[who].name);
        printf("密码:");
        mima=InputPassword();
        if(mima!=user[who].password)
        {
            printf("输入密码错误,不能继续查询其他信息!\n");
        }
        else
        {
            printf("余额:%.2f元. \n",user[who].balance);
            printf("状态:");
            if(user[who].status==0)
            {
                printf("正常\n");
            }
            else if(user[who].status==1)
            {
                printf("挂失\n");
            }
            else
            {
                printf("已经销户\n");
            }
        }
    }
    printf("欢迎下次光临\n");
}
void TransferAccounts()
{
    char str[100];
    int a;
    int num, whoout, whoin;
    int mima;
    double money;
    printf("输入转出账号:");
    scanf("%d", &num);
    whoout = search(num);
    if(whoout<0)
    {
        printf("该用户不存在,转账失败!\n");
    }
    else
    {
        if(user[whoout].status==0)
        {
            printf("户主姓名:%s\n", user[whoout].name);
            printf("密码:");
            mima=InputPassword();
            if(mima!=user[whoout].password)
            {
                printf("输入密码错误,转账失败!\n");
            }
            else
            {
                printf("输入转账金额:");
                scanf("%s", str);
                a=judge(str);
                while(a!=1)
                {
                    printf("输入错误,请重新输入转账金额\n");
                    scanf("%s", str);
                    a=judge(str);
                }
                if(a==1)
                {
                    money=atoi(str);
                    if(money>user[whoout].balance)
                    {
                        printf("余额不足,转账失败!\n");
                    }
                    else
                    {
                        printf("输入转入账号:");
                        scanf("%d", &num);
                        whoin = search(num);
                        if(whoin<0)
                        {
                            printf("转入账户不存在,转账失败!\n");
                        }
                        else
                        {
                            if(user[whoin].status>0)
                            {
                                printf("转入账户异常,转账失败!\n");
                            }
                            else
                            {


                                user[whoout].balance-=money;
                                user[whoin].balance+=money;
                                printf("转账后,您还有%.2f元. \n",user[whoout].balance);
                            }
                        }
                    }
                }
            }
        }
        else
            printf("该账户异常,转账失败!\n");
    }
    printf("欢迎下次光临\n");
}
void ReportTheLoss()
{
    int num, who;
    int mima;
    printf("账号:");
    scanf("%d", &num);
    who = search(num);
    if(who<0)
    {
        printf("该用户不存在,不能挂失!\n");
    }
    else
    {
        printf("户主姓名:%s\n", user[who].name);
        printf("密码:");
        mima=InputPassword();
        if(mima!=user[who].password)
        {
            printf("输入密码错误,不能继续操作!\n");
        }
        else
        {
            if(user[who].status==0)
            {
                user[who].status=1;
                printf("挂失成功\n");
            }
            else if(user[who].status==1)
            {
                printf("该账户已经处于挂失状态\n");
            }
            else
            {
                printf("该账户已销户,不能挂失\n");
            }
        }
    }
}
void SolutionToHang()
{
    int num, who;
    int mima;
    printf("账号:");
    scanf("%d", &num);
    who = search(num);
    if(who<0)
    {
        printf("该用户不存在,解除挂失失败!\n");
    }
    else
    {
        printf("户主姓名:%s\n", user[who].name);
        printf("密码:");
        mima=InputPassword();
        if(mima!=user[who].password)
        {
            printf("输入密码错误,不能继续操作!\n");
        }
        else
        {
            if(user[who].status==0)
            {
                printf("该账户处于正常状态,不需要解除挂失\n");
            }
            else if(user[who].status==1)
            {
                user[who].status=0;
                printf("解除挂失成功\n");
            }
            else
            {
                printf("该账户已销户,操作无效\n");
            }
        }
    }
}
void ClosingAccount()
{
    int num;
    int who;
    int mima;
    printf("待销户账号:");
    scanf("%d", &num);
    who = search(num);
    if(who<0)
    {
        printf("该用户不存在,销户失败!\n");
    }
    else
    {
        printf("户主姓名:%s\n", user[who].name);
        printf("密码:");
        mima=InputPassword();
        if(mima==user[who].password)
        {
            printf("余额:%.2f 元\n", user[who].balance);
            user[who].balance=0;
            user[who].status=2;
            printf("取款 %.2f 元,销户成功!\n", user[who].balance);
        }
        else
        {
            printf("输入的密码错误,销户失败!\n");
        }
    }
}
void ChangeThePassword()
{
    int num, who;
    int mima, mima1, mima2;
    printf("账号:");
    scanf("%d", &num);
    who = search(num);
    if(who<0)
    {
        printf("该用户不存在,修改密码失败!\n");
    }
    else
    {
        printf("户主姓名:%s\n", user[who].name);
        printf("密码:");
        mima=InputPassword();
        if(mima!=user[who].password)
        {
            printf("输入密码错误,不能继续操作!\n");
        }
        else
        {
            printf("新密码:");
            mima1=InputPassword();
            printf("确认密码:");
            mima2=InputPassword();
            if(mima1==mima2)
            {
                user[who].password=mima1;
                printf("修改成功!\n");
            }
            else
            {
                printf("两次输入不同,修改失败!\n");
            }
        }
    }
}
int search(int num)
{
    int index=-1;
    int low=0, high=N-1, mid;
    while(low<=high)
    {
        mid = (low+high)/2;
        if(user[mid].num==num)
        {
            index=mid;
            break;
        }
        else if (user[mid].num>num)
            high=mid-1;
        else
            low=mid+1;
    }
    return index;
}
int InputPassword()
{
    char c;  //接收字符形式密码
    int mima=0;   //要转换为数字
    int i;
    while(1)
    {
        for(i=0; i<6; i++)
        {
            c=getch();//输入但不显示
            putchar(‘*‘);
            if(isdigit(c))//isdight主要用于检查参数c是否为阿拉伯数字0到9 头文件为#include<ctype.h>
                mima=mima*10+(c-‘0‘);
            else
            {
                mima=0;
                break;
            }
        }
        fflush(stdin); //清除键盘缓存区中已经有的输入
        printf("\n");
        if(mima==0)
        {
            printf("密码要求全为数字,且不能全0!\n");
            printf("请重新输入密码: ");
        }
        else
            break;
    }
    return mima;
}
int judge(char*s)//判断输入的金额是否符合要求
{
    int a,i=0;
    while(s[i]!=‘\0‘)
    {
        if(s[i]<‘0‘||s[i]>‘9‘)
        {
            a=0;
            break;
        }
        i++;
    }
    if(a!=0)
        a=1;
    return a;
}
心得体会:#include<ctype.h>是isdigit函数的头文件,isdight主要用于检查参数c是否为阿拉伯数字0到9 ,同时,getch()输入但不显示,学会了输入密码但是显示出*号,scanf函数是有返回值的,如果输入的相对应的话就返回1,不符合输入要求就会返回0,在输入金额密码的过程中克制了输入字符数字组合、字符串等问题。

银行储蓄系统的设计与实现