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

Posted 夏芷雨涵梦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了银行储蓄系统的设计与实现相关的知识,希望对你有一定的参考价值。

作者:夏晓林

地点:烟大计控

时间: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,在输入金额密码的过程中克制了输入字符数字组合、字符串等问题。

以上是关于银行储蓄系统的设计与实现的主要内容,如果未能解决你的问题,请参考以下文章

银行储蓄管理系统——数据库设计

分析一下银行的储蓄系统的数据库由哪些表组成及其应用程序和管理系统

银行储蓄系统问题定义及其可行性

c++课程实训 银行储蓄系统

银行储蓄系统的数据流程图及实体-联系图

Infortrend的EonStor DS与GS强势进军银行领域