银行账户管理系统

这个代码实现了一个银行账户管理系统,包括日期类Date、累加器Accumulator、储蓄账户SavingsAccount和信用账户CreditAccount。Date类处理日期的合法性,计算月份天数,以及判断闰年。Accumulator用于计算日期间的累加值,如利息。SavingsAccount和CreditAccount分别处理存款、取款、利息结算等操作,模拟实际的银行账户流程。
摘要由CSDN通过智能技术生成

银行账户管理系统

//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(Date& date) const{
		return totalDays-date.totalDays;
	}
}

#endif
//date.cpp
#include"date.h"
#include<iostream>
#include<cstdlib>
using namespace std;

namespace{
	//namespace使下面的定义只在当前文件中有效
	//存储平年中某个月1日之前有多少天,为便于getMaxday函数实现,该数组多出一项
	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<<"Invlid date:";
		show();
		cout<<endl;
		exit(1);
	}
	int years = year-1;
	totalDays=years*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;
	else return DAYS_BEFORE_MONTH[month]-DAYS_BEFORE_MONTH[month-1];
}

void Date::show() const{
	cout<<getYear()<<"-"<<getMonth()<<"-"<<getDay();
}
//accumulator.h
#ifndef __ACCUMULATOR_H__
#define __ACCUMULATOR_H__
#include "date.h"

class Accumulator{
private:
	Date lastDate; //上次变更数值的日期
	double value; //数值的当前值
	double sum;   //数值按日累加之和
public:
	//构造函数,date为开始累加的日期,value为初始值
	Accumulator(const Date& date,double value):lastDate(date),value(value),sum(0){}
	
	//获得到日期date的累加结果
	double getSum(const Date& date) const{
		return sum+value*date.distance(lastDate);
	}
	//在date将数值变更为value
	void change(const Date& date,double value){
		sum=getSum(date);
		lastDate=date;
		this->value=value;
	}
	//初始化,将日期变为date,数值变为value,累加器清零
	void reset(const Date& date, double value){
		lastDate=date;
		this->value=value;
		sum=0;
	}
};

#endif
//account.h
#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:
	//供派生类调用的构造函数,id为账户
	Account(const Date& date, const std::string& id);
	//记录一笔账,date为日期,amount为金额,desc为说明
	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; }
	const 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);
	//结算利息,每年1月1日调用一次该函数
	void settle(const Date& date);
};

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 getAvaliableCredit() const {//获得可用信用
		if(getBalance()<0)
			return credit + getBalance();
		else
			return credit;
	}
	//存入现金
	void deposit(const Date& date, double amount, const std::string& desc);
	//取出现金
	void withdraw(const Date& date, double amount, const std::string& desc);
	//结算利息和年费,每月1日调用一次该函数
	void settle(const Date& date);
	void show() const;
};
#endif
//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) cosnt{
	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::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::CreditAccount(const Date& date,const string& id, double credit, 
	double rate, double fee):Account(date,id),credit(credit), 
		rate(rate),fee(fee),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, getDebt());
}

void CreditAccount::show() const {
	Account::show();
	cout << "\tAvailable credit:" << getAvailableCredit();
}
//main.cpp   银行账户系统
#include "account.h"
#include <iostream>
using namespace std;

int main() {
	Date date(2008, 11, 1);	//起始日期
	//建立几个账户
	SavingsAccount sa1(date, "S3755217", 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 cell");
	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, 5), 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;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值