程序设计《银行系统》

主文件

main.cpp

/***********************************************************
* 版权所有 (C)2014, 王争取
*
* 文件名称: main.cpp
* 文件标识:无
* 内容摘要:为主函数
* 其它说明:无
* 当前版本: V1.0
* 作 者:王争取
* 完成日期: 2015/07/15
*
* 修改记录1:
* 修改日期:  2015/07/15
* 版本号: V1.0
* 修改人: 王争取
* 修改内容:
**********************************************************/
#include <iostream>
#include "bank.h"
using namespace std;
/*主函数:*/
int main()
{
    cout<<"+----------------------+\n";
    cout<<"+    欢迎光临CSDN银行  +\n";
    cout<<"+----------------------+\n";
    Bank b;
    if (pass())
    {
        //Bank b;   //原参考中多创建了一个Bank对象,造成一个诡异的Bug,详细解释见下面“注”处的链接
        b.work();
    }
    return 0;
}
头文件

bank.h

/***********************************************************
* 版权所有 (C)2014, 王争取
*
* 文件名称: bank.h
* 文件标识:无
* 内容摘要:为头文件,包含User类和Bank类,两者又采取了组合形式
* 其它说明:无
* 当前版本: V1.0
* 作 者:王争取
* 完成日期: 2015/07/15
*
* 修改记录1:
* 修改日期:  2015/07/15
* 版本号: V1.0
* 修改人: 王争取
* 修改内容:
**********************************************************/
#ifndef BANK_H_INCLUDED
#define BANK_H_INCLUDED
#include <cstring>
using namespace std;
const int upNum=2000; //系统最多容纳的用户数
class Bank;
/*User类,用于定义个人用户对象*/
class User
{
public:
    void setUser(int acc, char *nam, int pw, double bal,int sta,char se,char* ID,char* add,char* ph);
    void showName();
    void showBalance(string prompt); //显示余额,前面加上提示词prompt
    bool passwordIsRight();   //校验密码,输入的密码正确则返回true
    bool isNormalUser(); //存款、取款、转帐等功能,需要账户处于正常姿态,处于正常状态时返回true,其他情形返回false并提示
    friend class Bank;   //将Bank声明为友元类,方便其访问数据成员
private:
    int account; //账号
    int password;  //密码
    char name[20];   //用户名
    double balance;  //账户余额
    char sex;      //性别
    char IDcard[20];  //身份证号
    char address[30]; //地址
    char phonenumber[20];  //电话号码
    int status;  //状态 0-正常  1-挂失  2-销户
};
/*Bank类,用于对个人用户的操作*/
class Bank
{
public:
    Bank();  //开始前从文件中读数据,存在数组中
    ~Bank();   //程序结束前,将数组中的数据写入到文件中
    void work();  //业务驱动
    void openAccount(); //开户
    void cancelAccount();  //注销账户
    void save();   //存款
    void withdraw();   //取款
    void showAccount(); //查询余额
    void transferAccounts();  //转账
    void reportLoss();  //挂失
    void cancelLoss();  //解除挂失
    void updatePassword();   //更改密码
    int getUser();  //输入账号查询用户,返回用户在对象数组中的下标
private:
    int N;  //实际的用户数目
    User *users;  // 动态数组;
};

int pass();  //业务员登录
int chooseInMenu(); //显示菜单并由业务员选择
int inputPassword();   //返回键盘输入的密码



#endif // BANK_H_INCLUDED

User类源文件

user.cpp

/***********************************************************
* 版权所有 (C)2014, 王争取
*
* 文件名称: user.cpp
* 文件标识:无
* 内容摘要:为源文件用于对user类中所声明函数的定义
* 其它说明:其对象作为bank.h的数据成员
* 当前版本: V1.0
* 作 者:王争取
* 完成日期: 2015/07/15
*
* 修改记录1:
* 修改日期:  2015/07/15
* 版本号: V1.0
* 修改人: 王争取
* 修改内容:
**********************************************************/
#include <iostream>
#include "bank.h"
using namespace std;

void User::setUser(int acc, char* nam, int pw, double bal,int sta,char se,char* ID,char* add,char* ph)
{
    account=acc;
    strcpy(name,nam);
    password=pw;
    balance=bal;
    sex=se;
    strcpy(IDcard,ID);
    strcpy(address,add);
    strcpy(phonenumber,ph);
    status=sta;
}
void User::showName()
{
    cout<<"户主姓名:"<<name<<endl;
}
void User::showBalance(string prompt)
{
    cout<<prompt<<" "<<balance<<" 元"<<endl;
}
bool User::passwordIsRight()
{
    int iPass;
    bool right = true;
    cout<<"输入密码:";
    iPass=inputPassword();
    if(iPass!=password)
    {
        right = false;
        cout<<"输入密码错误,不能继续操作!"<<endl;
    }
    return right;
}

bool User::isNormalUser()
{
    bool normal = true;
    if(status!=0)
    {
        normal = false;
        cout<<"该账户处于"<<(status==1?"挂失":"销户")<<"状态,不能继续操作..."<<endl;
    }
    return normal;
}

wokr.cpp

/***********************************************************
* 版权所有 (C)2014, 王争取
*
* 文件名称: work.cpp
* 文件标识:无
* 内容摘要:为源函数,用于业务驱动,业务员进入银行系统
* 其它说明:无
* 当前版本: V1.0
* 作 者:王争取
* 完成日期: 2015/07/15
*
* 修改记录1:
* 修改日期:  2015/07/15
* 版本号: V1.0
* 修改人: 王争取
* 修改内容:
**********************************************************/
#include <iostream>
#include <fstream>
#include <conio.h>
#include <cstdlib>
#include <cstring>
#include <ctype.h>
#include "bank.h"
/*
关于头文件的说明:
*<conio>是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,
*主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等。
*<cstdlib>是C++里面的一个常用函数库, 等价于C中的<stdlib.h>。stdlib.h可以提供一些函数与符号常量,
*<cstring>主要用于字符串的操作
*<ctype.h>是C标准函数库中的头文件,定义了一批C语言字符分类函数(C character classification functions),
*用于测试字符是否属于特定的字符类别,如字母字符、控制字符等等。既支持单字节(Byte)字符,也支持宽字符
*"bank.h"为用户自定义的头文件
*/
using namespace std;
/*
功能:验证用户密码
返回值:密码正确,返回1;
        不能通过密码验证,返回0
*/
int pass()
{
    char sNameInFile[20];   //由文件中读出的业务员用户名
    char sPassInFile[20];  //文件中保存的密码,这一版本中,用字符保存密码
    ifstream infile("password.txt",ios::in);
    if(!infile)
    {
        cout<<"password file cannot open!"<<endl;
        exit(1);
    }
    infile>>sNameInFile>>sPassInFile;
    infile.close();

    char sName[20];   //业务员登录时输入的用户名
    char sPass[20];  //业务员登录时输入的密码
    char ch;
    int iTry=3;   //进入系统时尝试的次数
    int right = 0;  //要返回的结果:0-不正确 1-正确
    //进入系统,密码三次不对将退出
    do
    {
        cout<<"请输入业务员用户名:";
        cin>>sName;
        cout<<"请输入密码:";
        int i=0;
        while((ch=getch())!='\r')  //getch在接受输入后,不在屏幕上显示
        {
            sPass[i++]=ch;
            putchar('*');   //接受任何字符,屏幕上只显示*
        }
        sPass[i]='\0';
        fflush(stdin);
        cout<<endl;;
        if(strcmp(sPass,sPassInFile)==0&&strcmp(sName,sNameInFile)==0)
        {
            right = 1;
            break;
        }
        else
        {
            iTry--;
            if(iTry>0)
                cout<<"超过3次将退出,你还可以尝试"<<iTry<<"次!"<<endl;
            else
            {
                cout<<"对不起,你不能进入系统"<<endl;;
            }
        }
    }
    while(iTry);
    return right;
}

/*
关于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);清除输入缓存区
*/



/*
功能:显示菜单并由业务员选择
返回值:用户选择的功能,范围0-9
*/
int chooseInMenu()
{
    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;
}

/*
功能:输入密码
返回值:整型的密码值
技术说明:
(1)此功能在多个模块中都要用到且功能单一,故分离出来,单独作业一个函数
(2)为了便于在输入中只显示*,接受输入时以字符形式输入,而后转为对应的整型数
(3)规定密码由不全为0的6位数字构成(当开头是'0'时,实际不足6位),一旦输入错误将重新输入
附:在实际的系统中,密码通常用字符串描述,即使只允许出现数字字符,本例仅作为参考
*/
int inputPassword()
{
    char ch;  //接收字符形式密码
    int iPass=0;   //要转换为数字
    int i;
    while(1)
    {
        for(i=0; i<6; i++)
        {
            ch=getch();  //输入但不显示
            putchar('*');   //输出*
            if(isdigit(ch))
                iPass=iPass*10+(ch-'0');
            else
            {
                iPass=0;
                break;  //退出for循环后,再次接受
            }
        }
        fflush(stdin); //清除键盘缓存区中已经有的输入
        cout<<endl;;
        if(iPass==0)  //此条件成立可能由两种情况引起:输入了非数字字符被直接重置为0,或6位全0后正常退出for循环
        {
            cout<<"密码要求全为数字,且不能全0!"<<endl;;
            cout<<"请重新输入密码: ";
        }
        else
            break;
    }
    return iPass;
}

bank.cpp




开户:

销户



存款


取款


查询


挂失


解挂


改密


转账



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值