程序设计项目实训——银行储蓄系统

注:本程序采用多文件组织的方法

Headers:bank.h

/*

*版权所有 (c) 2015, 烟台大学计算机与控制工程学院.

*All rights reserved.

*文件名称: main.cpp

*作者:陆云杰

*完成日期:2015年7月15日

*版本号:v1.0

*内容摘要:对所有类,函数进行了定义

*修改内容:1.增加了一个Day类用于记录开户以及进行存取款转账等服务时的日期
            2.增加计算两个时间之间的天数之差的函数
            3.增加了根据业务发生的情况来计算活期利息的函数
            4.运用动态数组

*修改日期:2015年7月15日

*修改人:陆云杰

*/
#ifndef BANK_H_INCLUDED
#define BANK_H_INCLUDED
#include 
using namespace std;
const int upNum=2000; //系统最多容纳的用户数
class Day  //定义一个日期对象用于记录用户的开户日期
{
public:
    Day();
    Day(int y,int m,int d,int i,int ch);
    void set_Day(int y,int m,int d,int i,int ch);
    void showtime_0(); //显示用户的开户日期
    void showtime_1(); //显示用户上次有金额流动的日期
    int year;
    int month;
    int day;
    int I;  //记录下是否有过资金流动(0—没有过 大于0-有过)
    int choice;  //记录下上次资金流动时的选择(3-存款 4-取款 5-转入 6-转账)
};
class Bank;
class User :public Day
{
public:
    void setUser(int acc, char *nam, int pw, double bal,int sta,int y,int m,int d,int i,int ic);
    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;  //账户余额
    int status;  //状态 0-正常  1-挂失  2-销户
};

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();   //返回键盘输入的密码
double caculate(double ,int );  //计算利息
int DaysBetween2Date(int year1,int month1,int day1,int year2,int month2,int day2);  //计算两个时间之间的天数之差
bool IsLeap(int year);  //判断是否是闰年
int DayInYear(int year, int month, int day); //计算当天是这年的第几天
#endif // BANK_H_INCLUDED


Sources:

main.cpp

/*

*版权所有 (c) 2015, 烟台大学计算机与控制工程学院.

*All rights reserved.

*文件名称: main.cpp

*作者:陆云杰

*完成日期:2015年7月15日

*版本号:v1.0

*

*/
#include 
#include "bank.h"
using namespace std;
/*主函数:*/
int main()
{
    cout<<"+----------------------+\n";
    cout<<"+    欢迎光临CSDN银行  +\n";
    cout<<"+----------------------+\n";
    if (pass())
    {
        Bank b;
        b.work();

    }
    return 0;
}


bank.cpp

/*

*版权所有 (c) 2015, 烟台大学计算机与控制工程学院.

*All rights reserved.

*文件名称: main.cpp

*作者:陆云杰

*完成日期:2015年7月15日

*版本号:v1.0

*内容摘要:对所有类,函数进行了实现

*修改内容:1.运用二进制文件来存储用户的信息
            2.运用了动态数组
            3.增加了对用户开户,存取款以及转账的日期的记录
            4.根据业务发生的情况来计算活期利息

*修改日期:2015年7月15日

*修改人:陆云杰

*/
#include 
#include 
#include 
#include "bank.h"
#include 
using namespace std;
/*
功能:用构造函数读取文件中保存的业务数据
*/
Bank::Bank()
{
    ifstream infile("binary_account.txt",ios::in|ios::binary);//打开二进制文件
    {
        if(!infile)
        {
            cerr<<"open error!"<>nam;
    int iPass1, iPass2;
    cout<<"密码:";
    iPass1=inputPassword();  //输入密码1
    cout<<"确认密码:";
    iPass2=inputPassword();  //输入密码2
    if(iPass1==iPass2)
    {
        pw=iPass1;
        sta=0; //账户状态为“正常”
        cout<<"存入金额:";
        cin>>bal;
        cout<<"请输入存款日期(年/月/日):";
        cin>>y>>ch>>m>>ch>>d;
        i=0;
        ich=0;
        users[N].setUser(acc, nam, pw, bal, sta,y,m,d,i,ich);
        N++; //正式用户数增加1,确认了新用户已经加入
        cout<<"成功开户!"<=0)   //说明id账户存在
    {
        users[who].showName();
       if(users[who].I>0)
            users[who].showtime_1();
        else
             users[who].showtime_0();
        if(users[who].passwordIsRight())
        {
            users[who].showBalance("余额");   //提示"余额"二字,显示金额
            cout<<"确认销户(y/n)?";
            if(tolower(getchar())=='y')
            {
                cout<<"请输入销户日期(年/月/日):";
                cin>>y1>>ch>>m1>>ch>>d1;
                d=DaysBetween2Date(users[who].year,users[who].month,users[who].day,y1,m1,d1);
                users[who].balance+=caculate(users[who].balance,d);
                users[who].showBalance("销户成功!本次取款金额为");
                users[who].balance=0;  //取款后余额变0
                users[who].status=2;  //状态变为注销
            }
            else
            {
                cout<<"你取消了操作,销户失败!"<=0)   //说明id账户存在
    {
        if(users[who].status==0)
        {
            users[who].showName();
            if(users[who].I>0)
            users[who].showtime_1();
        else
             users[who].showtime_0();
            cout<<"输入存款额:";
            cin>>money;
            cout<<"请输入存款日期(年/月/日):";
            cin>>y1>>ch>>m1>>ch>>d1;
            i++;
            ich=3;
            d=DaysBetween2Date(users[who].year,users[who].month,users[who].day,y1,m1,d1);
            money+=caculate(users[who].balance,d);
            users[who].balance+=money;
            users[who].showBalance("存款后(算上活期余额),您有");
            users[who].set_Day(y1,m1,d1,i,ich);  //记录存款日期
        }
        else if(users[who].status==1)
        {
            cout<<"该用户处于挂失状态,存款失败!"<=0)   //说明id账户存在
    {
        if(users[who].isNormalUser())
        {
            users[who].showName();
        if(users[who].I>0)
            users[who].showtime_1();
        else
             users[who].showtime_0();
            if(users[who].passwordIsRight())
            {
                cout<<"输入取款额:";
                cin>>money;
                cout<<"请输入取款日期(年/月/日):";
                cin>>y1>>ch>>m1>>ch>>d1;
                d=DaysBetween2Date(users[who].year,users[who].month,users[who].day,y1,m1,d1);
                users[who].balance+=caculate(users[who].balance,d);
                if(money>users[who].balance)  //亲,不玩透支
                {
                    cout<<"余额不足,取款失败!"<=0)   //说明id账户存在
    {
        users[who].showName();
        if(users[who].I>0)
            users[who].showtime_1();
        else
             users[who].showtime_0();
        if(users[who].passwordIsRight())
        {
            cout<<"请输入查询日期(年/月/日):";
            cin>>y>>ch>>m>>ch>>d;
            d1=DaysBetween2Date(users[who].year,users[who].month,users[who].day,y,m,d);
            users[who].balance+=caculate(users[who].balance,d1);
            users[who].showBalance("余额");
            cout<<"状态:"<=0)   //说明id账户存在
    {
        if(users[whoout].isNormalUser())
        {
            users[whoout].showName();
            if(users[whoout].I>0)
            users[whoout].showtime_1();
        else
             users[whoout].showtime_0();
            if(users[whoout].passwordIsRight())
            {
                cout<<"请输入转账日期(年/月/日):";
                cin>>y>>ch>>m>>ch>>d;
                d1=DaysBetween2Date(users[whoout].year,users[whoout].month,users[whoout].day,y,m,d);
                users[whoout].balance+=caculate(users[whoout].balance,d1);
                cout<<"输入转账金额:";
                cin>>money;
                if(money>users[whoout].balance)  //亲,不玩透支
                {
                    cout<<"余额不足,转账失败!"<=0)   //说明id账户存在
                    {
                        if(users[whoin].isNormalUser())
                        {
                            users[whoout].balance-=money;
                            d1=DaysBetween2Date(users[whoin].year,users[whoin].month,users[whoin].day,y,m,d);
                            users[whoin].balance+=caculate(users[whoin].balance,d1);
                            users[whoin].balance+=money;
                            users[whoout].showBalance("转账后,您还有");
                            users[whoout].set_Day(y,m,d,i,ich1);
                            users[whoin].set_Day(y,m,d,j,ich2);
                        }
                    }
                }
            }
        }
    }
    return;
}
/*
功能:挂失账户
*/
void Bank::reportLoss()
{
    int who;
    who = getUser();  //根据账号查询用户,返回用户的下标
    if(who>=0)   //说明id账户存在
    {
        users[who].showName();
        if(users[who].I>0)
            users[who].showtime_1();
        else
             users[who].showtime_0();
        if(users[who].passwordIsRight())
        {
            if(users[who].status==0)
            {
                users[who].status=1;
                cout<<"挂失成功"<=0)   //说明id账户存在
    {
        users[who].showName();
        if(users[who].I>0)
            users[who].showtime_1();
        else
             users[who].showtime_0();
        if(users[who].passwordIsRight())
        {
            if(users[who].status==0)
            {
                cout<<"该账户处于正常状态,不需要解除挂失"<=0)   //说明id账户存在
    {
        users[who].showName();
        if(users[who].I>0)
            users[who].showtime_1();
        else
             users[who].showtime_0();
        if(users[who].passwordIsRight())
        {
            cout<<"新密码:";
            iPass1=inputPassword();  //输入密码1
            cout<<"确认密码:";
            iPass2=inputPassword();  //输入密码2
            if(iPass1==iPass2)
            {
                users[who].password=iPass1;
                cout<<"修改成功!"<>id;
    int index=-1;
    int low=0, high=N-1, mid;
    while(low<=high)
    {
        mid = (low+high)/2;
        if(users[mid].account==id)
        {
            index=mid;
            break;   //找到了,立即退出循环
        }
        else if (users[mid].account>id)
            high=mid-1;
        else
            low=mid+1;
    }
    if (index<0)
        cout<<"该用户不存在,本次操作失败!"<


day.cpp

/*

*版权所有 (c) 2015, 烟台大学计算机与控制工程学院.

*All rights reserved.

*文件名称: main.cpp

*作者:陆云杰

*完成日期:2015年7月15日

*版本号:v1.0

*内容摘要:对Day类的实现

*修改内容:1.增加了一个Day类用于记录开户以及进行存取款转账等服务时的日期

*修改日期:2015年7月15日

*修改人:陆云杰

*/
#include 
#include "bank.h"
using namespace std;
/*
功能:给这个类赋初值
*/
Day::Day()
{
    year=0;
    month=0;
    day=0;
    I=0;
    choice=0;
}
/*
功能:给类内的数据赋值
*/
Day::Day(int y,int d,int m,int i,int ch):year(y),month(m),day(d),I(i),choice(ch) {}
/*
功能:可以灵活地给类内的数据赋值
*/
void Day::set_Day(int y,int m,int d,int i,int ch)
{
    year=y;
    month=m;
    day=d;
    I=i;
    choice=ch;
}
/*
功能:输出开户日期
*/
void Day::showtime_0()
{
    cout<<"开户日期为:"<year<<"/"<month<<"/"<day<year<<"/"<month<<"/"<day<


user.cpp

/*

*版权所有 (c) 2015, 烟台大学计算机与控制工程学院.

*All rights reserved.

*文件名称: main.cpp

*作者:陆云杰

*完成日期:2015年7月15日

*版本号:v1.0

*修改内容:无

*修改日期:2015年7月15日

*修改人:陆云杰

*/
#include 
#include "bank.h"
using namespace std;
/*
功能:给用户的数据赋值
*/
void User::setUser(int acc, char *nam, int pw, double bal,int sta,int y,int m,int d,int i,int ch)
{
    account=acc;
    year=y;
    month=m;
    day=d;
    password=pw;
    strcpy(name,nam);
    balance=bal;
    status=sta;
    I=i;
    choice=ch;
}
/*
功能:输出户主的姓名
*/
void User::showName()
{
    cout<<"户主姓名:"<


work.cpp

/*

*版权所有 (c) 2015, 烟台大学计算机与控制工程学院.

*All rights reserved.

*文件名称: main.cpp

*作者:陆云杰

*完成日期:2015年7月15日

*版本号:v1.0

*修改内容:1.增加了用于计算两个日期之间的相隔天数

*修改日期:2015年7月15日

*修改人:陆云杰

*/
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "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!"<>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<0)
                cout<<"超过3次将退出,你还可以尝试"<>i;
        if(i>=0 && i<=9)
            break;
        else
            cout<<"请重新选择功能"< day2 ? day1 - day2 : day2 - day1;

     //如果年相同
     }else if(year1 == year2)
     {
         int d1, d2;
         d1 = DayInYear(year1, month1, day1);
         d2 = DayInYear(year2, month2, day2);
         return d1 > d2 ? d1 - d2 : d2 - d1;

     //年月都不相同
     }else{
         //确保year1年份比year2早
         if(year1 > year2)
         {
             //swap进行两个值的交换
             swap(year1, year2);
             swap(month1, month2);
             swap(day1, day2);
         }
         int d1,d2,d3;
         if(IsLeap(year1))
             d1 = 366 - DayInYear(year1,month1, day1); //取得这个日期在该年还于下多少天
         else
             d1 = 365 - DayInYear(year1,month1, day1);
         d2 = DayInYear(year2,month2,day2); //取得在当年中的第几天
         d3 = 0;
         for(int year = year1 + 1; year < year2; year++)
         {
             if(IsLeap(year))
                 d3 += 366;
             else
                 d3 += 365;
         }
         return d1 + d2 + d3;
     }
}
/*
功能:判断该年是否是闰年
*/
bool IsLeap(int year)
{
   return (year % 4 ==0 || year % 400 ==0) && (year % 100 !=0);
}
/*
功能:判断该天在当年是第几天
*/
int DayInYear(int year, int month, int day)
{
    int DAY[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    if(IsLeap(year))
        DAY[1] = 29;
    for(int i=0; i


运行结果截图:

程序设计项目实训——银行储蓄系统_第1张图片

程序设计项目实训——银行储蓄系统_第2张图片

程序设计项目实训——银行储蓄系统_第3张图片

程序设计项目实训——银行储蓄系统_第4张图片

程序设计项目实训——银行储蓄系统_第5张图片

程序设计项目实训——银行储蓄系统_第6张图片

程序设计项目实训——银行储蓄系统_第7张图片

程序设计项目实训——银行储蓄系统_第8张图片

程序设计项目实训——银行储蓄系统_第9张图片

二进制文件“binary_account.txt”查看:

程序设计项目实训——银行储蓄系统_第10张图片

过程心得体会:

       在老师提供的实力代码的基础上,进行了修改,运用了动态数组,二进制文件存储,增加了处理业务中的信息,并在相关业务中使用,根据业务发生情况计算活期存储利息。

       感觉自己在实训项目中的最大收获就是体会到了做大项目的那种“自顶向下,逐步求精”的思维,建立多文件组织使丝路更加地清晰。



你可能感兴趣的:(编程练习)