银行储蓄系统

/*
* 程序的版权和版本声明部分
* Copyright (c)2013, 烟台大学计算机学院学生
* All rightsreserved.
* 文件名称: fibnacci.cpp
* 作    者:高古尊
* 完成日期:2013 年12月18日
* 版本号: v1.0
*
* 输入描述:
* 问题描述:
* 程序输出:
* 问题分析:
*/
#include <iostream>
#include <cstdio>
#include <string.h>
#include <conio.h>
#include <fstream>
#include <iomanip>
using namespace std;
//声明一个银行卡的类型
struct Account
{
    long accNumber;  //卡号
    string accName;//户主
    string password;//密码
    double balance;//余额
    string identity;//身份证号
    int state;//状态 0:正常  -1:挂失 -2:冻结 -3:销户
};

//银行可以开的卡的数量
Account array[20000];
//表示卡号的初始值
long Number=10001;
//表示银行中已开卡的数量
int size=0,l;
void welcome();//欢迎界面
bool findAnAccount();//查找一个帐号在数组中的位置
void readData();//把储户信息从文件中读到结构体数组中
void writeData();//把储户信息从结构体数组中写入磁盘文件
void mainFrame();//主界面
void openAccount();//开户
void changeAccount(int );//销户,挂失,改密
void getcash(int );//得到键盘录入的存款(取款)金额
void dispAnAccount();//显示一个帐号的帐户信息
bool key(int );//密码验证
void status();//卡的状态
void zanting();//暂停一下
string getpass(int );//输入限制
void kongge(int );//空格对齐
void zhuanzhang();//转账
bool jianyan();//验证身份证,姓名等信息是否与卡上相符
void changestate(int);//销户,解挂,解冻等操作
int main()
{
    readData();
    welcome();//欢迎界面
    return 0;
}

void welcome()
{
    kongge(25);
    cout<<"+----------------------+"<<endl;
    kongge(25);
    cout<<"+ 欢迎使用银行储蓄系统 +"<<endl;
    kongge(25);
    cout<<"+----------------------+"<<endl;
    if(key(1))
    {
        mainFrame();
    }
    else
    {
        cout<<endl;
    }
}

void mainFrame()
{
    char order,ch;
    kongge(18);
    cout<<"+--------------------------------------+"<<endl;
    kongge(18);
    cout<<"+ 开户 请按1   销户 请按2   存款 请按3 +"<<endl;
    kongge(18);
    cout<<"+ 取款 请按4   查询 请按5   挂失 请按6 +"<<endl;
    kongge(18);
    cout<<"+ 改密 请按7   解挂 请按8   解冻 请按9 +"<<endl;
    kongge(18);
    cout<<"+ 转账 请安x                退出 请按0 +"<<endl;
    kongge(18);
    cout<<"+--------------------------------------+"<<endl;
    cout<<"请输入操作指令:";
    while(1)
    {
        ch=getch();
        if((ch>='0'&&ch<='9')||ch=='x')
        {
            order=ch;
            putch(ch);
            break;
        }
    }
    cout<<endl;
    cout<<endl;
    switch(order)
    {
    case '1':
        openAccount();//开户
        zanting();//暂停一下
        mainFrame();
        break;
    case '2':
        changestate(1);//销户
        break;
    case '3':
        if(findAnAccount())
        {
            if(array[l].state==0)
            {
                getcash(1);//存款
                writeData();
                zanting();//暂停一下
                mainFrame();
            }
            else
            {
                cout<<"该卡处于";
                status();//卡的状态
                cout<<endl;
                mainFrame();
            }
        }
        else
        {
            mainFrame();
        }
        break;
    case '4':
        changestate(6);//取款
        break;
    case '5':
        if(findAnAccount())
        {
            dispAnAccount();//显示一个帐号的帐户信息
            zanting();//暂停一下
            mainFrame();
        }
        else
        {
            mainFrame();
        }
        break;
    case '6'://挂失
        changestate(2);
        break;
    case '7'://改密
        changestate(3);
        break;
    case '8'://解挂
        changestate(4);
        break;
    case '9'://解冻
        changestate(5);
        break;
    case 'x':
        changeAccount(7);//转账
        break;
    default:
        cout<<"系统错误!"<<endl;
    }
}

void openAccount()//开户
{
    string num;
    l=size;
    array[size].state=0;
    array[size].accNumber=Number++;
    cout<<"请输入户主姓名:";
    cin>>array[size].accName;
    cout<<endl;
    cout<<"请输入身份证号码:";
    array[size].identity=getpass(18);
    cout<<endl;
    cout<<"请输入密码:";
    array[size].password=getpass(6);
    cout<<endl;
    cout<<"请再次输入密码:";
    num=getpass(6);
    cout<<endl;
    cout<<"请输存款金额:";
    cin>>array[size].balance;
    if(num==array[size].password)//判断两次密码是否一样
    {
        l=size;
        dispAnAccount();
        size++;
        writeData();
        cout<<"开户成功!"<<endl;
    }
    else
    {
        cout<<"开户失败!"<<endl;
        mainFrame();
    }
}

void changeAccount(int a)//销户或挂失
{
    switch (a)
    {
    case 1:
        if(key(2))
        {
            array[l].balance=0;
            array[l].state=-3;
            dispAnAccount();
            cout<<"注销成功!"<<endl;
        }
        else
        {
            cout<<"注销失败!"<<endl;
        }
        mainFrame();
        break;
    case 2:
        if(key(2))
        {
            array[l].state=-1;
            dispAnAccount();
            cout<<"挂失成功!"<<endl;
            openAccount();
        }
        else
        {
            cout<<"挂失失败!"<<endl;
            mainFrame();
        }
        break;
    case 3:
        if(key(2))
        {
            cout<<"请输入新的秘密";
            array[l].password=getpass(6);
            cout<<endl;
            cout<<"修改密码成功!"<<endl;
            mainFrame();
        }
        else
        {
            cout<<"修改密码失败!"<<endl;
            mainFrame();
        }
        break;
    case 4:
        if(key(2))
        {
            array[l].state=0;
            dispAnAccount();
            cout<<"解挂成功!"<<endl;
        }
        else
        {
            cout<<"解挂失败!"<<endl;
            mainFrame();
        }
        break;
    case 5:
        if(key(2))
        {
            array[l].state=0;
            dispAnAccount();
            cout<<"解冻成功!"<<endl;
        }
        else
        {
            cout<<"解冻失败!"<<endl;
            mainFrame();
        }
        break;
    case 6:
        if(key(2))
        {
            getcash(2);//取款

        }
        else
        {
            array[l].state=-2;
            mainFrame();
        }
        break;
    case 7:
        if(key(2))
        {
            zhuanzhang();//转账
        }
        else
        {
            array[l].state=-2;
            mainFrame();
        }
        break;
    default:
        cout<<"系统错误!"<<endl;
    }
}

void getcash(int a)//得到键盘录入的存款(取款)金额
{
    int i=3;
    double mony;
    if(a==1)
    {
        while(i--)
        {
            cout<<"请输入存款金额:";
            cin>>mony;
            if(mony>=0)
            {
                array[l].balance=array[l].balance+mony;
                cout<<"余额为:"<<setiosflags(ios::fixed)<<setprecision(2)<<array[l].balance<<endl;
                cout<<"存款成功!"<<endl;
                break;
            }
            else
            {
                cout<<"输入有误!"<<endl;
            }
        }
    }
    else
    {
        while(i--)
        {
            cout<<"请输入取款金额:";
            cin>>mony;
            if(mony>=0)
            {
                if(mony>array[l].balance)
                {
                    cout<<"余额不足!"<<endl;
                }
                else
                {
                    array[l].balance=array[l].balance-mony;
                    cout<<"余额为:"<<setiosflags(ios::fixed)<<setprecision(2)<<array[l].balance<<endl;
                    cout<<"取款成功!"<<endl;
                    break;
                }
            }
            else
            {
                cout<<"输入有误!"<<endl;
            }
        }
    }
}

void dispAnAccount()//显示一个帐号的帐户信息
{
    cout<<"+-----------------------------------------------------------------------------+"<<endl;
    cout<<"+"<<setw(10)<<"卡号"<<setw(1)<<'|'<<setw(10)<<"户主"<<setw(1)<<'|'<<setw(20)<<"身份证号"<<setw(1)<<'|'<<setw(15)<<"金额"<<setw(1)<<'|'<<setw(10)<<"状态"<<setw(1)<<'|'<<endl;
    cout<<"+-----------------------------------------------------------------------------+"<<endl;
    cout<<"+"<<setw(10)<<array[l].accNumber<<setw(1)<<'|'<<setw(10)<<array[l].accName<<setw(1)<<'|'<<setw(20)<<array[l].identity<<setw(1)<<'|'
        <<setw(15)<<setiosflags(ios::fixed)<<setprecision(2)<<array[l].balance<<setw(9)<<setw(1)<<'|'<<setw(10);
    status();
    cout<<setw(1)<<'|'<<endl;
    cout<<"+-----------------------------------------------------------------------------+"<<endl;
}

bool key(int n)
{
    bool f=false;
    int i=3;
    string name,key;
    switch(n)
    {
    case 1://操作人员的录的验证
        while(i--)
        {
            cout<<"请输入用户名:";
            cin>>name;
            cout<<"请输密码:";
            key=getpass(6);
            if((key!="111111")||(name!="gaoguzun"))
            {
                cout<<"用户名或密码输入错误。"<<endl;
            }
            else
            {
                f=true;
                break;
            }
        }
        break;
    case 2://取款验证
        while(i--)
        {
            cout<<"请输密码:";
            key=getpass(6);
            if(key!=array[l].password)
            {
                cout<<"密码输入错误。"<<endl;
            }
            else
            {
                f=true;
                break;
            }
        }
        break;
    }
    return f;
}

void writeData()//把储户信息从结构体数组中写入磁盘文件
{
    int n;
    ofstream outfile("bank.txt",ios::out);
    if(!outfile)
    {
        cout<<"文件打开失败!";
    }
    else
    {
        for(n=0; n<size; n++)
        {
            outfile<<array[n].accNumber<<setw(10)<<array[n].accName<<setw(30)<<array[n].identity<<setw(10)<<array[n].password<<setw(10)<<array[n].balance<<setw(10)<<array[n].state<<endl;
        }
        outfile.close();
    }

}

void readData()//把储户信息从文件中读到结构体数组中
{
    int n=0;
    ifstream infile("bank.txt",ios::in);
    while(1)
    {
        infile>>array[n].accNumber>>array[n].accName>>array[n].identity>>array[n].password>>array[n].balance>>array[n].state;
        if(array[n].accName!="\0")
        {
            Number=array[n].accNumber+1;
            n++;
        }
        else
        {
            size=n;
            infile.close();
            break;
        }
    }
}

bool findAnAccount()//查找一个帐号在数组中的位置
{
    int i,num;
    bool f=true;
    cout<<"请输入要查寻的卡号:";
    cin>>num;
    if(num>array[size-1].accNumber||num<array[0].accNumber)
    {
        cout<<"该卡尚未使用!"<<endl;
        f=false;
    }
    else
    {
        for(i=0; i<size; i++)
        {
            if(num==array[i].accNumber)
            {
                l=i;
                break;
            }
        }
    }
    cout<<endl;
    return f;
}

void status()//卡的状态
{
    switch(array[l].state)
    {
    case 0:
        cout<<"正常";
        break;
    case -1:
        cout<<"挂失";
        break;
    case -2:
        cout<<"冻结";
        break;
    case -3:
        cout<<"销户";
        break;
    default:
        break;
    }
}

void zanting()//暂停一下
{
    cout<<"请按任意键键返回主菜单..."<<endl;
    getch();
}

string getpass(int n)//密码,身份证,选择限制
{
    char pass[20]="",ch;
    int i=0;
    while(i<n)
    {
        ch=getch();
        if((ch>='0'&&ch<='9')||ch=='x')
        {
            pass[i]=ch;
            if(n==6)//密码
            {
                putch('*');
            }
            else
            {
                putch(ch);
            }
        }
        i++;
    }
    cout<<endl;
    return pass;
}

void kongge(int n)//空格对齐
{
    int i;
    for(i=0; i<n; i++)
    {
        cout<<' ';
    }
}

void zhuanzhang()
{
    int i=3;
    double mony;
    while(i--)
    {
        cout<<"请输入转账金额:";
        cin>>mony;
        if(mony>array[l].balance)
        {
            cout<<"余额不足!"<<endl;
        }
        else
        {
            break;
            array[l].balance=array[l].balance-mony;

        }
    }
    if(findAnAccount())
    {
        if(array[l].state==0)
        {
            array[l].balance=mony+array[l].balance;
            cout<<"转账成功!"<<endl;
        }
        else
        {
            cout<<"该卡处于";
            status();//卡的状态
            cout<<"状态!";
            mainFrame();
        }
    }
}

bool jianyan()//验证身份证,姓名等信息是否与卡上相符
{
    bool f=true;
    string name,identity;
    cout<<"请输入户主姓名:";
    cin>>name;
    cout<<endl;
    cout<<"请输入身份证号码:";
    identity=getpass(18);
    cout<<endl;
    if(name!=array[l].accName||identity!=array[l].identity)
    {
        f=false;
    }
    return f;
}

void changestate(int n)//销户,解挂,解冻等操作
{
    if(findAnAccount())
    {
        if(jianyan())
        {
            if(array[l].state==0)
            {
                changeAccount(n);
                zanting();//暂停一下
                writeData();
            }
            else
            {
                cout<<"该卡处于";
                status();//卡的状态
                cout<<endl;
            }
        }
        else
        {
            cout<<"信息与此卡不符!"<<endl;
        }
    }
    mainFrame();
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
(1) 储户登记开户 这里需要管理员记录下储户的详细信息,包括身份证号和银行分配给储户的特定标志号。特定标志号是储户登陆用户端进行自助服务的口令。 (2) 定期存、取款 有定期存、取款需求的用户可以办理定期银行卡。管理员为用户分配的定期卡号都是以数字“6”开头,且需要记录下用户想定期存储的年限。 (3) 活期存、取款 我们设计的系统允许用户办理多张银行卡。办理了定期银行卡的用户可以继续办理活期银行卡。管理员为用户分配的活期卡号都是以数字“0”开头。 (4) 利息的计算 为了实现利息的计算,我们增加一张利息表。它有三个属性,发生存取额的银行卡号,发生存取额的时间,发生存取额的大小。由于储户可是随时存、取款,所以必须对每一笔存取留下记录。主要是时间和资金发生额。若存款则记录资金大小,若取款则记录资金大小的相反数。当需要计算某张银行卡的利息时,就根据该卡的记录来计算。 (5) 转账 为了使系统的功能更加完善,我们新增了转账的功能。转账功能可以在活期卡和定期卡之间任意进行。 (6) 查询余额和修改密码 这两个功能是管理员和用户都具有的权限。只是管理员要查询储户余额必须在用户的授权下,而且管理员和用户修改的只能是自己使用的口令。 (7) 查询用户信息 查询用户信息是管理员拥有的权限。管理员查询用户信息可以通过两种方式。一是用户的卡号,二是银行分配给用户的特定标志号。 (8) 日志备份和数据恢复 我们设计的系统还粗略实现了日志的备份和数据恢复功能。这也是管理员拥有的权限,管理员可以选择日志备份的路径,而在数据恢复时必须保证输入的恢复路径为日志备份的路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值