模拟银行账户

题目描述

前面创建了Account类来建模银行账户:

(1)一个名为id的int型数据域,表示账户的身份号。

(2)一个名为balance的double型的数据域,表示账面余额。

(3)一个名为annualInterestRate的double型数据域,保存当前年利率。

(4)一个无参的构造函数,创建一个缺省的账户,其数据域id为0,balance为0,annualInterestRate为0。

(5)id、balance和annualInterestRate的访问器和更改器函数。

一个账户有账号、余额、年利率和账户创建时间等属性,还有存款和取款函数。创建它的两个派生类——支票账户和储蓄账户,前者有一个透支额度,后者不允许透支。定义Account类的一个常量虚函数toString(),并在派生类覆盖它,用来以字符串形式返回账号的余额。

画出这些类的UML图,实现该类,并编写一个测试程序,它创建一个Account、一个SavingsAccount和一个CheckingAccount账户,并调用它们的toString()函数。

C++代码

Account.h

//
// Created by blue on 16-12-8.
//

#ifndef CHECKINGACCOUNTCLASS_ACCOUNT_H
#define CHECKINGACCOUNTCLASS_ACCOUNT_H

#include<string>

class Account {

private:
    int id;
    double balance;
    double annualInterestRate;
public:
    Account();
    virtual std::string toString();

public:
    int getId();

    void setId(int id);

    double getBalance();

    void setBalance(double balance);

    double getAnnualInterestRate();

    void setAnnualInterestRate(double annualInterestRate);
};



#endif //CHECKINGACCOUNTCLASS_ACCOUNT_H

account.cpp

//
// Created by blue on 16-12-8.
//

#include "iostream"
#include "sstream"
#include "Account.h"

Account::Account() {
    Account::id = 0;
    Account::balance = 0;
    Account::annualInterestRate = 0;
}

int Account::getId() {
    return id;
}

void Account::setId(int id) {
    Account::id = id;
}

double Account::getBalance() {
    return balance;
}

void Account::setBalance(double balance) {
    Account::balance = balance;
}

double Account::getAnnualInterestRate() {
    return annualInterestRate;
}

void Account::setAnnualInterestRate(double annualInterestRate) {
    Account::annualInterestRate = annualInterestRate;
}

std::string Account:: toString(){

    std::ostringstream ostring;
    ostring <<  "Account:" << Account::getId() << " balance:" << Account::getBalance();

    return ostring.str();
};

SavingsAccount.h

//
// Created by blue on 16-12-8.
//

#ifndef CHECKINGACCOUNTCLASS_SAVINGSACCOUNT_H
#define CHECKINGACCOUNTCLASS_SAVINGSACCOUNT_H
#include <string>
#include "Account.h"
class SavingsAccount : public Account {
private:
    bool allowedOverdraft;
    std::string createAt;
public:
    std::string toString() override;
    bool deposit(int id,double money);
    bool withdrawal(int id,double money);
public:
    SavingsAccount();
    const std::string &getCreateAt() const;
    bool isAllowedOverdraft() const;
};
#endif //CHECKINGACCOUNTCLASS_SAVINGSACCOUNT_H

SavingsAccount.cpp

//
// Created by blue on 16-12-8.
//
#include "iostream"
#include "sstream"
#include "SavingsAccount.h"
#include "Date.h"
bool SavingsAccount::deposit(int id,double money){
    if (id == SavingsAccount::getId()){
        SavingsAccount::setBalance(SavingsAccount::getBalance()+money);
        return true;
    }
    return false;
}
bool SavingsAccount::withdrawal(int id,double money){
    if (id == SavingsAccount::getId()){
        if (SavingsAccount::getBalance() < money){
            return false;
        }else{
            SavingsAccount::setBalance(SavingsAccount::getBalance()-money);
            return true;
        }
    }
    return false;
}
const std::string &SavingsAccount::getCreateAt() const {
    return createAt;
}
SavingsAccount::SavingsAccount() {
    SavingsAccount::createAt = DateTime::currentTime();
}
bool SavingsAccount::isAllowedOverdraft() const {
    return allowedOverdraft;
}
std::string SavingsAccount:: toString(){
    std::ostringstream ostring;
    ostring <<  "Account:" << SavingsAccount::getId() << " balance:" << SavingsAccount::getBalance() << " CreateAt:" << SavingsAccount::getCreateAt();
    return ostring.str();
};

CheckingAccount.h

//
// Created by blue on 16-12-8.
//

#ifndef CHECKINGACCOUNTCLASS_CHECKINGACCOUNT_H
#define CHECKINGACCOUNTCLASS_CHECKINGACCOUNT_H
#include "Account.h"
class CheckingAccount : public Account {
private:
    bool allowedOverdraft;
    double overdraft;
    std::string createAt;
public:
    std::string toString() override;
    bool deposit(int id,double money);
    bool withdrawal(int id,double money);
public:
    CheckingAccount();
    const std::string &getCreateAt() const;
    bool isAllowedOverdraft() const;
    double getOverdraft() const;
    void setOverdraft(double overdraft);
};
#endif //CHECKINGACCOUNTCLASS_CHECKINGACCOUNT_H

CheckingAccount.cpp

//
// Created by blue on 16-12-8.
//

#include "iostream"
#include "sstream"
#include "CheckingAccount.h"
#include "Date.h"
bool CheckingAccount::deposit(int id,double money){
    if (id == CheckingAccount::getId()){
        CheckingAccount::setBalance(CheckingAccount::getBalance()+money);
        return true;
    }
    return false;
}
bool CheckingAccount::withdrawal(int id,double money){
    if (id == CheckingAccount::getId()){
        if (CheckingAccount::getBalance()-money <= (-CheckingAccount::getOverdraft())){
            return false;
        }else{
            CheckingAccount::setBalance(CheckingAccount::getBalance()-money);
            return true;
        }
    }
    return false;
}
const std::string &CheckingAccount::getCreateAt() const {
    return createAt;
}
CheckingAccount::CheckingAccount() {
    CheckingAccount::overdraft = 10000;
    CheckingAccount::createAt = DateTime::currentTime();
}
bool CheckingAccount::isAllowedOverdraft() const {
    return allowedOverdraft;
}
double CheckingAccount::getOverdraft() const {
    return CheckingAccount::overdraft;
}
void CheckingAccount::setOverdraft(double overdraft) {
    CheckingAccount::overdraft = overdraft;
}
std::string CheckingAccount:: toString(){
    std::ostringstream ostring;
    ostring << "Account:" << CheckingAccount::getId() << " balance:" << CheckingAccount::getBalance() << " CreateAt:" << CheckingAccount::getCreateAt();
    return ostring.str();
};

Date.h

//
// Created by blue on 16-12-8.
//

#ifndef CHECKINGACCOUNTCLASS_DATE_H
#define CHECKINGACCOUNTCLASS_DATE_H
#include <ctime>
#include <string>
#include <type_traits>
class DateTime {
public:
    template<typename T>
    static std::string convert(time_t t) {
        return time2string(t);
    }

    template<typename T>
    static time_t convert(const std::string& timeStr) {
        return string2time(timeStr);
    }
    static std::string currentTime() {
        return time2string(time(nullptr));
    }
private:
    static std::string time2string(time_t t) {
        struct tm* tmNow = localtime(&t);
        char timeStr[sizeof("yyyy-mm-dd hh:mm:ss")] = {'\0'};
        std::strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M:%S", tmNow);
        return timeStr;
    }
    static time_t string2time(const std::string& timeStr) {
        struct tm stTm;
        sscanf(timeStr.c_str(), "%d-%d-%d %d:%d:%d",
               &(stTm.tm_year),
               &(stTm.tm_mon),
               &(stTm.tm_mday),
               &(stTm.tm_hour),
               &(stTm.tm_min),
               &(stTm.tm_sec));
        stTm.tm_year -= 1900;
        stTm.tm_mon--;
        stTm.tm_isdst = -1;
        return mktime(&stTm);
    }
};
#endif //CHECKINGACCOUNTCLASS_DATE_H

main.cpp

#include <iostream>
#include "CheckingAccount.h"
#include "SavingsAccount.h"

using namespace std;

int main() {

    SavingsAccount savingsAccount;
    CheckingAccount checkingAccount;

    cout << "SavingsAccount:" << savingsAccount.toString() << endl;
    cout << "CheckingAccount" << checkingAccount.toString() << endl;

    return 0;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容