【C++ 第七章 个人银行账户管理程序案例】
生活随笔
收集整理的這篇文章主要介紹了
【C++ 第七章 个人银行账户管理程序案例】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【第七章】?個人銀行賬戶管理程序 ?案例實現
?
//account.cpp #include"account.h" #include<cmath> #include<iostream> using namespace std;double Account::total = 0; //Account類相關成員函數的實現 Account::Account(const Date &date, const string &id) : id(id), balance(0) {date.show();cout << "\t#" << id << " created" << endl;} void Account::record(const Date &date, double amount, const string &desc){amount = floor(amount * 100 + 0.5) / 100; //保留小數點后兩位balance += amount;total += amount;date.show();cout << "\t#" << id << "\t" << amount << "\t" << balance << "\t" << desc << endl;} void Account::show() const {cout << id << "\tBalance:" << balance; }void Account::error(const string &msg)const{cout << "Error(#" << id << "):" << msg << endl;}//SavingsAccount類相關成員函數的實現SavingsAccount::SavingsAccount(const Date &date, const string &id, double rate) : Account(date,id), rate(rate), acc(date,0) {}void SavingsAccount::deposit(const Date &date, double amount, const string &desc){record(date, amount, desc);acc.change(date, getBalance()); }void SavingsAccount::withdraw(const Date &date, double amount, const string &desc){if (amount > getBalance()) {error("not enough money"); }else {record(date, -amount, desc);acc.change(date, getBalance());} }void SavingsAccount::settle(const Date &date){double interest = acc.getSum(date)*rate / date.distance(Date(date.getYear() - 1, 1, 1)); //計算年息if (interest != 0)record(date, interest, "interest");acc.reset(date,getBalance());} CreditAccount::CreditAccount(const Date &date, const std::string &id, double credit, double rate, double fee): Account(date, id), credit(credit), fee(fee), rate(rate), acc(date, 0) {} void CreditAccount::deposit(const Date &date, double amount, const string &desc){record(date, amount, desc);acc.change(date, getDebt()); }void CreditAccount::withdraw(const Date &date, double amount, const string &desc){if (amount-getBalance() > credit) {error("not enough credit");}else {record(date, -amount, desc);acc.change(date, getDebt());} } void CreditAccount::settle(const Date &date){double interest = acc.getSum(date)*rate;if (interest != 0)record(date, interest, "interest");if (date.getMonth() == 1)record(date, -fee, "annual fee");acc.reset(date, getBalance());} void CreditAccount::show() const {Account::show();cout << "\tAvailable credit: " << getAvailableCredit(); }// account.h : Defines the entry point for the console application.#ifndef _ACCOUNT_H_#define _ACCOUNT_H_#include"date.h" #include"accumulator.h" #include<string>class Account //儲蓄賬戶類{private:std::string id; //賬號double balance; //余額static double total; //所有賬戶的總金額 protected:Account(const Date&date, const std::string &id);//記錄一筆賬,date為日期,desc為說明,amount為金額void record(const Date &date, double amount, const std::string &desc);//報告錯誤信息void error(const std::string &msg)const;public://構造函數const std::string &getId() const { return id; }double getBalance() const { return balance; }static double getTotal() { return total; }void show() const;//顯示賬戶信息 }; class SavingsAccount:public Account{ private:Accumulator acc;double rate; public:SavingsAccount(const Date &date, const std::string &id, double rate);double getRate() const { return rate; }void deposit(const Date &date, double amount, const std::string &desc); //存入現金void withdraw(const Date &date, double amount, const std::string &desc); //取出現金void settle(const Date &date);//結算利息,每年1月1日調用一次該函數}; class CreditAccount :public Account { private:Accumulator acc;double credit;double rate;double fee;double getDebt()const {double balance = getBalance();return(balance < 0 ? balance : 0);} public:CreditAccount(const Date &date, const std::string &id, double credit, double rate, double fee);double getCredit() const { return credit; }double getRate() const { return rate; }double getFee() const { return fee; }double getAvailableCredit() const {if (getBalance() < 0)return credit + getBalance();elsereturn credit;}void deposit(const Date &date, double amount, const std::string &desc); //存入現金void withdraw(const Date &date, double amount, const std::string &desc); //取出現金void settle(const Date &date);//結算利息,每年1月1日調用一次該函數void show() const;//顯示賬戶信息};#endif//_ACCOUNT_H_
//accumulator.h #ifndef _ACCUMULATOR_H_ #define _ACCUMULATOR_H_ #include"date.h" class Accumulator { private:Date lastDate;double value;double sum; public:Accumulator(const Date&date,double value):lastDate(date),value(value),sum(0){}double getSum(const Date &date)const {return sum + value*date.distance(lastDate);}void change(const Date&date, double value) {sum = getSum(date);lastDate = date;this->value = value;}void reset(const Date&date, double value) {lastDate = date;this->value = value;sum = 0;} }; #endif // _ACCUMULATOR_H_
// chapter07銀行賬戶.cpp : Defines the entry point for the console application. //// chapter06.cpp : Defines the entry point for the console application. //7_10.cpp//#include"account.h" #include"account.h" #include"date.h" #include<iostream> using namespace std;int main() {Date date(2008, 11, 1);//建立幾個賬戶SavingsAccount sa1(date, "03755217", 0.015);SavingsAccount sa2(date, "02342342", 0.015);CreditAccount ca(date, "C5392394", 10000, 0.0005, 50);//11月的幾筆賬目sa1.deposit(Date(2008, 11, 5), 5000, "salary");ca.withdraw(Date(2008, 11, 15), 2000, "buy a phone");sa2.deposit(Date(2008, 11, 25), 10000, "sell stock 0323");//結算信用卡ca.settle(Date(2008, 12, 1));//12月的幾筆賬目ca.deposit(Date(2008, 12, 1), 2016, "repay the credit");sa1.deposit(Date(2008, 12, 1), 5500, "salary");//結算所有的賬戶并輸出各個賬戶信息sa1.settle(Date(2009, 1, 1));sa2.settle(Date(2009, 1, 1));ca.settle(Date(2009, 1, 1));cout << endl;sa1.show();cout << endl;sa2.show();cout << endl;ca.show();cout << endl;cout << "Total: " << Account::getTotal() << endl;return 0; }
//date.cpp#include"date.h" #include<iostream> #include<cstdlib> using namespace std; namespace {const int DAYS_BEFORE_MONTH[] = { 0,31,59,90,120,151,181,212,243,273,304,334,365 }; } Date::Date(int year, int month, int day) :year(year), month(month), day(day) {if (day <= 0 || day > getMaxDay()) {cout << "Invalid date: ";show();cout << endl;exit(1);}int years = year - 1;totalDays = year * 365 + years / 4 - years / 100 + years / 400 + DAYS_BEFORE_MONTH[month - 1] + day;if (isLeapYear() && month > 2) totalDays++; } int Date::getMaxDay()const {if (isLeapYear() && month == 2)return 29;elsereturn DAYS_BEFORE_MONTH[month] - DAYS_BEFORE_MONTH[month - 1]; } void Date::show() const {cout << getYear() << "-" << getMonth() << "-" << getDay(); }
//date.h#ifndef _DATE_H_ #define _DATE_H_ class Date { private:int year;int month;int day;int totalDays; public:Date(int year, int month, int day);int getYear()const { return year; }int getMonth() const { return month; }int getDay()const { return day; }int getMaxDay()const;bool isLeapYear()const {return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;}void show()const;int distance(const Date &date)const {return totalDays - date.totalDays;} }; #endif // !_DATE_H_
ps:
配套教材:鄭莉《c++程序設計語言》
課程:學堂在線《c++程序設計語言》
轉載于:https://www.cnblogs.com/cswangchen/p/7645056.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的【C++ 第七章 个人银行账户管理程序案例】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ionic入门教程第十六课-在微信中使用
- 下一篇: java 23种设计模式 深入理解