课程设计—银行储蓄系统

Headers
/* 
*版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院 
*All rights reserved. 
* 
*文件名称:bank.h 
*文件标识:无 
*内容摘要:该代码用于获取满足后缀要求的第一个文件 
*其他说明:无 
*当前版本:V1.0 
*作    者:陈银丽 
*完成日期:2015年7月18日 
* 
*修改记录: 
*修改日期:无 
*版本号:V1.0 
*修改人:陈银丽 
*修改内容: 
*/
#ifndef BANK_H_INCLUDED
#define BANK_H_INCLUDED
using namespace std;

class User
{
private:
    int account;  //账号
    string name; //姓名
    int code;  //密码
    double money;  //存款
    int state;   //状态  0-正常 1-挂失 2-销户
    string ID;  //身份证号
    string address;  //地址
public:
    void showMoney(string p);
    void showstate();
    void showName();
    bool pass();
    void set(int acc,string na,int co,double m,int sta,string id,string add);
    friend class Bank;
};
class Bank
{
public:
    Bank();   //开始前从文件中读数据,存在数组中
    ~Bank();   //程序结束前,将数组中的数据写入到文件中
    void work();  //业务驱动
    int getno(int acc);
    void openAccount(); //开户
    void cancelAccount();  //注销账户
    void save();   //存款
    void withdraw();   //取款
    void showAccount(); //查询账户
    void transferAccounts();  //转账
    void reportLoss();  //挂失
    void cancelLoss();  //解除挂失
    void changePassword();   //更改密码
private:
    static int N; //实际用户数目
    User users[10];//对象指针数组
};
int chooseInMenu();  //显示菜单并由业务员选择



#endif // BANK_H_INCLUDED
</pre><pre name="code" class="cpp">Sources:main.cpp
<pre name="code" class="cpp">/* 
*版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院 
*All rights reserved. 
* 
*文件名称:main.cpp 
*文件标识:无 
*内容摘要:该代码用于获取满足后缀要求的第一个文件 
*其他说明:无 
*当前版本:V1.0 
*作    者:陈银丽
*完成日期:2015年7月18日 
* 
*修改记录: 
*修改日期:无 
*版本号:V1.0 
*修改人:陈银丽
*修改内容: 
*/  
#include <iostream>
#include"bank.h"
using namespace std;
bool text();
int main()   //主函数
{
    cout<<"+----------------------+\n";
    cout<<"+  尊敬的客户 欢迎使用  +\n";
    cout<<"+----------------------+\n";
    Bank b;   //创建一个银行对象
    if (text())    //用text校验用户,若用户名和密码输入正确,则进入主界面
    {
        b.work();
    }
    return 0;
}

Sources bank.cpp
 
<pre name="code" class="cpp">/* 
*版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院 
*All rights reserved. 
* 
*文件名称:bank.cpp 
*文件标识:无 
*内容摘要:该代码用于获取满足后缀要求的第一个文件 
*其他说明:Bank类中成员函数的定义 
*当前版本:V1.0 
*作    者:陈银丽
*完成日期:2015年7月18日 
* 
*修改记录: 
*修改日期:无 
*版本号:V1.0 
*修改人:陈银丽
*修改内容: 
*/
#include <iostream>
#include<fstream>
#include<cstdlib>
#include <conio.h>
#include<cstring>
#include<string>
#include <stdio.h>
#include"bank.h"

int Bank::N=0;
void getime();
Bank::Bank()
{
    ifstream infile("account.txt",ios::in);
    if(!infile)
    {
        cerr<<" gz open error!"<<endl;
        exit(1);
    }
    int i=0;
    int acc;   //账号
    string nam;   //姓名
    int co;   //密码
    double m;   //金额
    int sta;//状态
    string id;
    string add;
    while(infile>>acc>>nam>>co>>m>>sta>>id>>add)   //当读取成功……
    {
        //User *users=new User[++i];
        users[i].set(acc,nam,co,m,sta,id,add);
        i++;
    }
    N = i; //用静态数据成员
    infile.close();
}
//功能:用析构函数,在退出系统时,将数据保存到文件中
Bank::~Bank()
{
    ofstream outfile("account.txt",ios::out);
    if(!outfile)    //测试文件打开操作是否成功,不成功则提示后退出。
    {
        cerr<<"xg open error!"<<endl;
        exit(1);
    }
    int i;
    for(i=0; i<N; i++)
    {
        outfile<<users[i].account<<" ";
        outfile<<users[i].name<<" ";
        outfile<<users[i].code<<" ";
        outfile<<users[i].money<<" ";
        outfile<<users[i].state<<" ";
        outfile<<users[i].ID<<" ";
        outfile<<users[i].address<<"\n";
    }
    outfile.close();
    // delete []users;
}
void Bank::work()
{
    int iChoice;   //用于选择系统功能
    do
    {
        iChoice = chooseInMenu();  //从菜单中获得功能代码
        switch(iChoice)
        {
        case 1:
            openAccount(); //开户
            break;
        case 2:
            cancelAccount();  //注销账户
            break;
        case 3:
            save();  //存款
            break;
        case 4:
            withdraw();   //取款
            break;
        case 5:
            showAccount(); //查询余额
            break;
        case 6:
            transferAccounts();  //转账
            break;
        case 7:
            reportLoss();  //挂失
            break;
        case 8:
            cancelLoss();  //解除挂失
            break;
        case 9:
            changePassword();   //更改密码
            break;
        case 0:
            cout<<"欢迎您再来. "<<endl;
        }
    }
    while(iChoice);
}

/* 功能:开户 
  说明:在进入系统时,在读入数据过程中,已经记录了用户数为N,在数组中对应下标为0~N-1 开户时要增加一个用户,只要为下标为N的数组元素置值,并在成功之后令N++即可。 
 账号由系统自动生成(10001+序号),保证其连续,这样在顺序增加的时候,就保证了其有序。
*/
void Bank::openAccount()
{
    cout<<"正在开户\n";
    if(N==2000)
    {
        cout<<"抱歉,银行账户已满,请退出!\n";
        return;
    }
    int acc=10001+N;
    cout<<"账号:"<<acc;
    cout<<"\n户主姓名:";
    string name,ID,address;
    cin>>name;
    int code1,code2;
    cout<<"密码    :";
    cin>>code1;
    cout<<"请确认密码:";
    cin>>code2;
    while(code1!=code2)
    {
        cout<<"输入密码:";
        cin>>code1;
        cout<<"确认密码:";
        cin>>code2;
    }
    if(code1==code2)
    {
        cout<<"ID:";
        cin>>ID;
        cout<<"地址:";
        cin>>address;
        cout<<"存入金额:";
        double money;
        cin>>money;
        cout<<"开户成功!";
        (users+N)->set(acc,name,code1,money,0,ID,address);
        N++;
        cout<<"开户成功!\n";
    }
}
/* 功能:销户
说明:找到账户,并将其状态改为2-注销即可。 注销前应该检查余额,应该先取款再注销
*/
void Bank::cancelAccount()
{
    int acc;
    cout<<"待销户账号:";
    cin>>acc;
    int number=getno(acc);
    if(number>=0)
    {
        (users+number)->showName();
        if((users+number)->pass())
        {
            if((users+number)->state==2)
            {
                cout<<"yi xaio\n";
                return;
            }
            (users+number)->showMoney("余额");
            cout<<"确认销户?(y/n)?";
            char s;
            cin>>s;
            if(s=='y')
            {
                (users+number)->showMoney("取款");
                (users+number)->money=0;
                (users+number)->state=2;
                cout<<"销户成功!\n";

                ofstream outfile("business.txt",ios::app);
                if(!outfile)
                {
                    cerr<<"business.open error!"<<endl;
                    exit(1);
                }
                outfile<<(users+number)->account<<(users+number)->name<<"已销户!"<<endl;
                outfile.close();
            }
        }

    }
    else cout<<"查无此帐号!\n";
}
/*功能:存款
说明:说明:需要保证账户存在,且处于正常状态
*/
void Bank::save()
{
    int acc;
    cout<<"账号:";
    cin>>acc;
    int number=getno(acc);
    if(number>=0)
    {
        if((users+number)->state==0)
        {
            double bill;
            (users+number)->showName();
            cout<<"存款额:";
            cin>>bill;
            (users+number)->money+=bill;
            (users+number)->showMoney("现余额共计:");

            cout<<"存款成功!\n";

            ofstream outfile("business.txt",ios::app);
            if(!outfile)
            {
                cerr<<"business.open error!"<<endl;
                exit(1);
            }
            outfile<<(users+number)->account<<(users+number)->name<<"存款"<<bill<<"元!"<<endl;
            outfile.close();
        }
        else if((users+number)->state==1)
            cout<<"已挂失,存款失败!\n";
        else cout<<"已销户,存款失败!\n";
    }
    else cout<<"查无此帐号!\n";
}
/*功能:取款
说明:需要保证账户存在,且处于正常状态,另外,余额要足够取
*/
void Bank::withdraw()
{
    int acc;
    cout<<"账号:";
    cin>>acc;
    int number=getno(acc);
    if(number>=0)
    {
        if((users+number)->state==0)
        {
            double bill;
            (users+number)->showName();
            if((users+number)->pass())
            {
                cout<<"取款额:";
                cin>>bill;
                if(bill>(users+number)->money)
                {
                    cout<<"余额不足,退出\n";
                    return;
                }
                (users+number)->money-=bill;
                cout<<"成功取款!\n";

                ofstream outfile("business.txt",ios::app);
                if(!outfile)
                {
                    cerr<<"business.open error!"<<endl;
                    exit(1);
                }
                outfile<<(users+number)->account<<(users+number)->name<<"取款"<<bill<<"元!"<<endl;
                outfile.close();
            }
            else
            {
                cout<<"密码错误,退出!\n";
                return;
            }
        }
        else  if((users+number)->state==1)
            cout<<"已挂失,取款失败!\n";
        else cout<<"已销户,取款失败!\n";
    }
    else cout<<"查无此帐号!\n";
}
/*功能:查询
说明:显示账户信息及用户个人信息
*/
void Bank::showAccount()
{
    int acc;
    cout<<"账号:";
    cin>>acc;
    int number=getno(acc);
    if(number>=0)
    {
        (users+number)->showName();
        if((users+number)->pass())
        {
            (users+number)->showMoney("余额:");
            (users+number)->showstate();
            cout<<"身份证号"<<(users+number)->ID;
            cout<<"\n地址:"<<(users+number)->address;
            cout<<"\n你还想继续,再看一下账户的业务记录吗?y/n:";
            char c;
            cin>>c;
            if(c=='y')
            {
                int r1,r3,r4,r5;
                string r2;
                ifstream infile("business.txt",ios::app);
                if(!infile)
                {
                    cerr<<"business.open error!"<<endl;
                    exit(1);
                }
                while(infile>>r1>>r3>>r4>>r5>>r2)//>>r3>>r4>>r5)
                {
                    if(r1==(users+number)->account)
                        cout<<r1<<r2<<" "<<r3<<"/"<<r4<<"/"<<r5<<endl;//
                }
            }
            cout<<"\n查询完毕!\n";
        }
    }
    else cout<<"查无此帐号!\n";
}
/*功能:转账
说明:需要保证两个账户都存在,且处于正常状态,另外,转出账户的余额要足够
*/
void Bank::transferAccounts()
{
    int acc,acc1;
    cout<<"转出账号:";
    cin>>acc;
    int number=getno(acc);
    if(number>=0)
    {
        (users+number)->showName();
        if((users+number)->pass())
        {
            if((users+number)->state!=0)
                cout<<"您的账户状态不正常,失败!\n";
            else
            {
                double bill;
                cout<<"转账金额";
                cin>>bill;
                if(bill>(users+number)->money)
                    cout<<"余额不足,转账失败!\n";
                else
                {
                    cout<<"元\n转入账号:";
                    cin>>acc1;
                    int number1=getno(acc1);
                    if(number1>=0)
                    {
                        if((users+number1)->state==0)
                        {
                            (users+number)->money-=bill;
                            (users+number1)->money+=bill;
                            cout<<"转帐成功!现余额"<<(users+number)->money;



                            ofstream outfile("business.txt",ios::app);
                            if(!outfile)
                            {
                                cerr<<"business.open error!"<<endl;
                                exit(1);
                            }
                            outfile<<(users+number)->account<<(users+number)->name<<"转入账户"<<(users+number1)->account<<":"<<(users+number1)->name<<bill<<"元!"<<endl;
                            outfile.close();
                        }
                        else cout<<"转入账户状态不正常!\n";
                    }
                    else cout<<"查无此账户!\n";
                }
            }
        }
    }

    else cout<<"查无此账户!\n";
}
/*功能:挂失
说明:挂失账户
*/
void Bank::reportLoss()
{
    int acc;
    cout<<"账号:";
    cin>>acc;
    int number=getno(acc);
    if(number>=0)
    {
        (users+number)->showName();
        if((users+number)->pass())
        {
            if((users+number)->state==0)
            {
                (users+number)->state=1;
                cout<<"挂失成功!\n";

                ofstream outfile("business.txt",ios::app);
                if(!outfile)
                {
                    cerr<<"business.open error!"<<endl;
                    exit(1);
                }
                outfile<<(users+number)->account<<(users+number)->name<<"挂失成功!"<<endl;
                outfile.close();
            }
        }
    }
    else cout<<"查无此账户!\n";
}
/*功能:解挂
说明:解挂账户
*/
void Bank::cancelLoss()
{
    int acc;
    cout<<"账号:";
    cin>>acc;
    int number=getno(acc);
    if(number>=0)
    {
        (users+number)->showName();
        if((users+number)->pass())
        {
            if((users+number)->state==1)
            {
                (users+number)->state=0;
                cout<<"解挂成功!\n";

                ofstream outfile("business.txt",ios::app);
                if(!outfile)
                {
                    cerr<<"business.open error!"<<endl;
                    exit(1);
                }
                outfile<<(users+number)->account<<(users+number)->name<<"解挂成功!"<<endl;
                outfile.close();
            }
            else if((users+number)->state==0)
                cout<<"正常状态,未挂失!\n";
            else cout<<"已销户,挂失失败!\n";
        }
    }
    else cout<<"查无此账户!\n";
}
/*功能:改密
说明:用户进行改密操作
*/
void Bank::changePassword()
{
    int acc;
    cout<<"账号:";
    cin>>acc;
    int number=getno(acc);
    if(number>=0)
    {
        (users+number)->showName();
        if((users+number)->pass())
        {
            int code,code1;
            cout<<"新密码:";
            cin>>code;
            cout<<"确认密码";
            cin>>code1;
            if(code==code1)
            {
                cout<<"\n修改成功!";

                (users+number)->code=code;
                ofstream outfile("business.txt",ios::app);
                if(!outfile)
                {
                    cerr<<"business.open error!"<<endl;
                    exit(1);
                }
                outfile<<(users+number)->account<<"修改密码成功!"<<endl;
                outfile<<"已改为:"<<(users+number)->code<<endl;
                outfile.close();
            }
        }
    }
    else cout<<"查无此账户!\n";
}
/*入口参数:要查询用户的账号
返回值:如果该用户存在,返回该用户在数组中的下标,否则,返回一个负数(-1)
说明:由账号自动产生,使按账号有序,本模块采用二分查找 */
int Bank::getno(int acc)  //输入账号查询用户,返回用户在数组中的下标
{
    int index=-1;
    int low=0, high=N-1, mid;
    while(low<=high)
    {
        mid = (low+high)/2;
        if((users+mid)->account==acc)
        {
            index=mid;
            break;   //找到了,立即退出循环
        }
        else if ((users+mid)->account>acc)
            high=mid-1;
        else
            low=mid+1;
    }
    if (index<0)
        cout<<"该用户不存在,本次操作失败!"<<endl;
    return index; //若找到,其值在0~N-1间,否则,保持-1
}

</pre>Scources user.cpp<pre>
<pre name="code" class="cpp">/* 
*版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院 
*All rights reserved. 
* 
*文件名称:user.cpp 
*文件标识:无 
*内容摘要:该代码用于获取满足后缀要求的第一个文件 
*其他说明:User类成员函数的定义 
*当前版本:V1.0 
*作    者:陈银丽 
*完成日期:2015年7月18日 
* 
*修改记录: 
*修改日期:无 
*版本号:V1.0 
*修改人:陈银丽
*修改内容: 
*/
#include <iostream>
#include"bank.h"
using namespace std;
/* 
*功能描述:显示户主姓名 
*输入参数:无 
*输出参数:无 
*返回值:无 
*其他说明:无 
*/
void User::showName()      //关于用户的个人信息及账号信息
{
    cout<<"户主姓名:"<<name<<endl;
}
/*
*功能描述:显示账户金额 
*输入参数:string p 
*输出参数:无 
*返回值:无 
*其他说明:无 
*/
void User::showMoney(string p)
{
    cout<<p<<money<<" 元"<<endl;
}
/*
*功能描述:设置账户信息 
*输入参数:int acc,string na,int co,double m,int sta,string id,string add 
*输出参数:无 
*返回值:无 
*其他说明:无 
*/
void User::set(int acc,string na,int co,double m,int sta,string id,string add)   //用户各项信息
{
    account=acc;
    name=na;
    code=co;
    money=m;
    state=sta;
    ID=id;
    address=add;
}
/*
*功能描述:显示账户状态 
*输入参数:无 
*输出参数:无 
*返回值:无 
*其他说明:无 
*/
void User::showstate()
{
    cout<<"当前状态:";
    if(state==0)
        cout<<"正常\n";
    else if(state==1)
        cout<<"挂失\n";
    else cout<<"销户\n";
}
/*
*功能描述:验证输入的账户密码 
*输入参数:无 
*输出参数:数字 
*返回值:0-false,1-true 
*其他说明:3次错误返回0 
*/  
bool User::pass()  //验证用户密码是否正确
{
    int password;
    int i=3;       //共有三次密码输入机会
    cout<<"密码:";
    while(i--)
    {
        cin>>password;
        if(password==code)
            return 1;
        if(i>0)
            cout<<"密码错误,"<<i<<"次输入\n";
    }
    return 0;
}
</pre>Scources work.cpp<pre>
<pre name="code" class="cpp">/* 
*版权所有:Copyright (c)2015,烟台大学计算机与控制工程学院 
*All rights reserved. 
* 
*文件名称:work.cpp 
*文件标识:无 
*内容摘要:该代码用于获取满足后缀要求的第一个文件 
*其他说明:程序中一般函数的定义 
*当前版本:V1.0 
*作    者:陈银丽
*完成日期:2015年7月18日 
* 
*修改记录: 
*修改日期:无 
*版本号:V1.0 
*修改人:陈银丽 
*修改内容: 
*/
#include <iostream>
#include<fstream>
#include<cstdlib>
#include <conio.h>
#include<cstring>
#include <stdio.h>
#include"bank.h"
/*
*功能描述:业务员身份验证 
*输入参数:无 
*输出参数:right 
*返回值:1-true,0-false 
*其它说明:3次验证错误,退出 
 关于getch()的一点说明: 
 所在头文件:conio.h 
 函数用途:从控制台读取一个字符,但不显示在屏幕上 
 函数原型:int getch(void) 
 返回值:读取的字符 
 在不同平台,输入回车,getch()将返回不同数值,而getchar()统一返回10(即\n) 
 1)windows平台下ENTER键会产生两个转义字符 \r\n,因此getch返回13(\r)。 
 2)unix、 linux系统中ENTER键只产生 \n ,因此getch返回10(\n)。 
 3)MAC OS中ENTER键将产生 \r ,因此getch返回13(\r)。 
 为避免键盘缓存区中未读出的字符影响程序,用fflush(stdin);清除输入缓存区 
*/
bool text()          //功能:校验用户  说明:若用户的用户名及密码输入正确,则进入主界面,否则强制退出
{
    char name[20],name1[20],code[20];
    ifstream infile("assistant.txt",ios::in);
    if(!infile)
    {
        cout<<"password file cannot open!"<<endl;
        exit(1);
    }
    infile>>name>>code;
    infile.close();

    char ch,code1[20];
    int iTry=3;   //进入系统时尝试的次数,密码三次不对将退出
    int right = 0;  //要返回的结果:0-不正确 1-正确
    do
    {
        cout<<"请输入业务员用户名:";
        cin>>name1;
        cout<<"请输入密码:";
        int i=0;
        while((ch=getch())!='\r')  //getch在接受输入后,不是回车,不在屏幕上显示
        {
            code1[i++]=ch;
            putchar('*');   //接受任何字符,屏幕上只显示*
        }
        code1[i]='\0';
        fflush(stdin);       //清空输入缓冲区
        cout<<endl;;
        if(strcmp(code,code1)==0&&strcmp(name,name1)==0)
        {
            right = 1;
            break;
        }
        else
        {
            iTry--;
            if(iTry>0)
                cout<<"超过3次将退出,你还可以尝试"<<iTry<<"次!"<<endl;
            else
            {
                cout<<"对不起,你不能进入系统"<<endl;;
            }
        }
    }
    while(iTry);
    return right;
}
/*
*功能描述:功能菜单选择 
*输入参数:无 
*输出参数:i 
*返回值:0~9 数字 
*其它说明: 
*/  

int chooseInMenu()                    //用户功能选择,从0到9
{
    int i;
    while(1)
    {
        cout<<endl;;
        cout<<"+----------------------------+"<<endl;
        cout<<"+ 1 开户    2 销户    3 存款 +"<<endl;
        cout<<"+ 4 取款    5 查询    6 转账 +"<<endl;
        cout<<"+ 7 挂失    8 解挂    9 改密 +"<<endl;
        cout<<"+                     0 退出 +"<<endl;
        cout<<"+----------------------------+"<<endl;
        cout<<"请输入操作指令:";
        cin>>i;
        if(i>=0 && i<=9)
            break;
        else
            cout<<"请重新选择功能"<<endl;;
    }
    return i;
}
运行结果:
<img src="https://img-blog.csdn.net/20150718111538852?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
<img src="https://img-blog.csdn.net/20150718111700239?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值