C++贷款类(等额本金,等额本息)

懂的都懂:
三个头文件
三个cpp文件
一个报错类
一个主函数cpp文件

贷款类
DaiKuan.h

#pragma once

#include<cstdlib>
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<sstream>
#include<cmath>
using namespace std;
class DaiKuan
{
public:
	DaiKuan();
	DaiKuan(double xdaiKuanZongE,double xnianLiLv=0,int xhuanKuanYueShu=0);
	void init(double xdaiKuanZongE, double xnianLiLv = 0, int xhuanKuanYueShu = 0);
	virtual void compute() = 0;
	virtual void print() = 0;

	virtual ostream& tostream(ostream& out, DaiKuan *d)=0;
	virtual ostream& operator<<(ostream& out)=0;
	friend ostream& operator<<(ostream& out,DaiKuan *d);

	void setDaiKuanZongE(double xdaiKuanZongE);
	void setNianLiLv(double xnianLiLv);
	void setHuanKuanYueShu(int xhuanKuanYueShu);
	void setZongLiXi(double xZongLiXi);
	void setYueZongE(double *xyueZongE);
	void setYueLiXi(double *xyueLiXi);
	void setDaiKuanShengYu(double *xdaiKuanShengYu);
	void setYueBenJin(double *xyueBenJin);
	void setType(int mode);

	double getDaiKuanZongE();
	double getNianLiLv();
	int getHuanKuanYueShu();
	double *getYueZongE();
	double *getYueLiXi();
	double *getDaiKuanShengYu();
	double *getYueBenJin();
	double getZongLiXi();
	int getType();

private:
	int type;
	double daiKuanZongE;                  /*借款金额 */
	double nianLiLv;                      /*银行利率 */
	int huanKuanYueShu;                   /*还款月数 */
	double *yueZongE;                     /*月总额 */
	double *yueLiXi;                      /*月利息 */
	double *daiKuanShengYu;               /*贷款剩余*/
	double *yueBenJin;                     /*月本金 */
	double zongLiXi;                      /*总利息 */
};

DaiKuan.cpp

#include"DaiKuan.h"
DaiKuan::DaiKuan() {
}
/*无参数构造函数*/
DaiKuan::DaiKuan(double xdaiKuanZongE,double xnianLiLv,int xhuanKuanYueShu)
{
	daiKuanZongE=xdaiKuanZongE;
	nianLiLv=xnianLiLv;
	huanKuanYueShu=xhuanKuanYueShu;
}/*构造函数*/
void DaiKuan::init(double xdaiKuanZongE, double xnianLiLv, int xhuanKuanYueShu)
{
	daiKuanZongE = xdaiKuanZongE;
	nianLiLv = xnianLiLv;
	huanKuanYueShu = xhuanKuanYueShu;
}
void DaiKuan::setType(int mode) { type = mode; };
void DaiKuan::setDaiKuanZongE(double xdaiKuanZongE) { daiKuanZongE = xdaiKuanZongE; };         /*设置贷款总数*/
void DaiKuan::setNianLiLv(double xnianLiLv) { nianLiLv = xnianLiLv; };                         /*设置年利率*/
void DaiKuan::setHuanKuanYueShu(int xhuanKuanYueShu) { huanKuanYueShu = xhuanKuanYueShu; }; /*设置还款月数*/
void DaiKuan::setZongLiXi(double xzongLiXi) { zongLiXi = xzongLiXi; };
void DaiKuan::setYueZongE(double *xyueZongE) { yueZongE = xyueZongE; };
void DaiKuan::setYueLiXi(double *xyueLiXi) { yueLiXi = xyueLiXi; };
void DaiKuan::setDaiKuanShengYu(double *xdaiKuanShengYu) { daiKuanShengYu = xdaiKuanShengYu; };
void DaiKuan::setYueBenJin(double *xyueBenJin) { yueBenJin = xyueBenJin; };

int DaiKuan::getType(){ return(type); };
int DaiKuan::getHuanKuanYueShu() { return(huanKuanYueShu); };                     /*返回还款月数*/
double DaiKuan::getNianLiLv() { return(nianLiLv); };                              /*返回年利率*/
double DaiKuan::getDaiKuanZongE() { return(daiKuanZongE); };                      /*返回贷款总数*/
double* DaiKuan::getYueZongE() { return(yueZongE); };                             /*返回月总额*/
double* DaiKuan::getYueLiXi() { return(yueLiXi); };                               /*返回月利息*/
double* DaiKuan::getDaiKuanShengYu() { return(daiKuanShengYu); };                 /*返回贷款剩余*/
double* DaiKuan::getYueBenJin() { return(yueBenJin); };                            /*返回月本金*/
double DaiKuan::getZongLiXi() { return(zongLiXi); };                              /*返回总利息*/

ostream& operator<<(ostream& out, DaiKuan *d) {
	int mode = d->getType();
	if (mode == 0) {
		double *temp_yueZongE = d->getYueZongE();
		double *temp_yueBenJin = d->getYueBenJin();
		double *temp_yueLiXi = d->getYueLiXi();
		double *temp_daiKuanShengYu = d->getDaiKuanShengYu();
		out << endl;
		out << setw(6) << setfill(' ') << "月份"
			<< setw(15) << setfill(' ') << "总额"
			<< setw(12) << setfill(' ') << "利息" << endl;
		out << "---------------------------------" << endl;
		for (int i = 0; i < d->getHuanKuanYueShu(); i++)
		{
			out << setw(4) << setfill(' ') << i + 1 << " | "
				<< setw(12) << setfill(' ') << temp_yueZongE[i] << " | "
				<< setw(10) << setfill(' ') << temp_yueLiXi[i] << endl;
		}
		return out;

	}
	else{
		double *temp_yueZongE = d->getYueZongE();
		double *temp_yueBenJin = d->getYueBenJin();
		double *temp_yueLiXi = d->getYueLiXi();
		double *temp_daiKuanShengYu = d->getDaiKuanShengYu();
		out << endl
			<< setw(6) << setfill(' ') << "月份"
			<< setw(15) << setfill(' ') << "剩余贷款"
			<< setw(15) << setfill(' ') << "当月利息"
			<< setw(15) << setfill(' ') << "当月还款"
			<< setw(15) << setfill(' ') << "当月归还本金" << endl
			<< "------------------------------------------------------------------" << endl;
		for (int i = 0; i < (int)d->getHuanKuanYueShu(); i++)
		{
			out << setw(4) << setfill(' ') << i + 1 << " | " <<
				setw(12) << setfill(' ') << temp_daiKuanShengYu[i] << " | " <<
				setw(12) << setfill(' ') << temp_yueLiXi[i] << " | " <<
				setw(12) << setfill(' ') << temp_yueZongE[0] << " | " <<
				setw(12) << setfill(' ') << temp_yueBenJin[i] << " | " << endl;
		}
		return out;
	}
}

等额本金类:
DengEBenJin.h

#include"DaiKuan.h"

class DengEBenJin :virtual public DaiKuan {
public:
	DengEBenJin();
	DengEBenJin(double xdaiKuanZongE, double xnianLiLv = 0, int xhuanKuanYueShu = 0);
	ostream& tostream(ostream& out,DaiKuan *d);
	ostream& operator<<(ostream& out);

	void compute();
	void print();
};

DengEBenJin.cpp

#include"DengEBenJin.h"
using namespace std;
DengEBenJin::DengEBenJin(double xdaiKuanZongE, double xnianLiLv, int xhuanKuanYueShu){
	init(xdaiKuanZongE,xnianLiLv,xhuanKuanYueShu);
}
DengEBenJin::DengEBenJin() {}

ostream& DengEBenJin::tostream(ostream& out,DaiKuan *d) {
	double *temp_yueZongE = d->getYueZongE();
	double *temp_yueBenJin = d->getYueBenJin();
	double *temp_yueLiXi = d->getYueLiXi();
	double *temp_daiKuanShengYu = d->getDaiKuanShengYu();
	out << endl;
	out << setw(6) << setfill(' ') << "月份"
		<< setw(15) << setfill(' ') << "总额"
		<< setw(12) << setfill(' ') << "利息" << endl;
	out << "---------------------------------" << endl;
	for (int i = 0; i < d->getHuanKuanYueShu(); i++)
	{
		out << setw(4) << setfill(' ') << i + 1 << " | "
			<< setw(12) << setfill(' ') << temp_yueZongE[i] << " | "
			<< setw(10) << setfill(' ') << temp_yueLiXi[i] << endl;
	}
	return out;
}
ostream& DengEBenJin::operator<<(ostream& out){
	double *temp_yueZongE = this->getYueZongE();
	double *temp_yueBenJin = this->getYueBenJin();
	double *temp_yueLiXi = this->getYueLiXi();
	double *temp_daiKuanShengYu = this->getDaiKuanShengYu();
	out << endl;
	out << setw(6) << setfill(' ') << "月份"
		<< setw(15) << setfill(' ') << "总额"
		<< setw(12) << setfill(' ') << "利息" << endl;
	out << "---------------------------------" << endl;
	for (int i = 0; i < this->getHuanKuanYueShu(); i++)
	{
		out << setw(4) << setfill(' ') << i + 1 << " | "
			<< setw(12) << setfill(' ') << temp_yueZongE[i] << " | "
			<< setw(10) << setfill(' ') << temp_yueLiXi[i] << endl;
	}
	return out;
}

void DengEBenJin::compute()
{
	/*计算*/
	double *temp_yueZongE = (double*)malloc(sizeof(double)*getHuanKuanYueShu());
	double *temp_yueBenJin = (double*)malloc(sizeof(double)*getHuanKuanYueShu());
	double *temp_yueLiXi = (double*)malloc(sizeof(double)*getHuanKuanYueShu());
	double *temp_daiKuanShengYu = (double*)malloc(sizeof(double)*getHuanKuanYueShu());
	double money_left = getDaiKuanZongE();
	setZongLiXi(0);
	temp_yueBenJin[0] = getDaiKuanZongE() / getHuanKuanYueShu();
	for (int i = 0; i < getHuanKuanYueShu(); i++)
	{
		money_left -= temp_yueBenJin[0];
		temp_daiKuanShengYu[i] = money_left;
		setZongLiXi(getZongLiXi() +(getDaiKuanZongE() - getDaiKuanZongE() / getHuanKuanYueShu() * i)*getNianLiLv() / 12);
		temp_yueZongE[i] = temp_yueBenJin[0] + (getDaiKuanZongE() - getDaiKuanZongE() / getHuanKuanYueShu() * i)*getNianLiLv() / 12;
		temp_yueLiXi[i] = (getDaiKuanZongE() - getDaiKuanZongE() / getHuanKuanYueShu() * i)*getNianLiLv() / 12;
	}
	setYueZongE(temp_yueZongE);
	setYueLiXi(temp_yueLiXi);
	setDaiKuanShengYu(temp_daiKuanShengYu);
	setYueBenJin(temp_yueBenJin);
}

void DengEBenJin::print()
{
	double *temp_yueZongE = getYueZongE();
	double *temp_yueBenJin = getYueBenJin();
	double *temp_yueLiXi = getYueLiXi();
	double *temp_daiKuanShengYu = getDaiKuanShengYu();
	/*输出*/
	cout << endl;
	cout << setw(6) << setfill(' ') << "月份"
		<< setw(15) << setfill(' ') << "总额"
		<< setw(12) << setfill(' ') << "利息" << endl;
	cout << "---------------------------------" << endl;
	for (int i = 0; i < getHuanKuanYueShu(); i++)
	{
		cout << setw(4) << setfill(' ') << i + 1 << " | "
			<< setw(12) << setfill(' ') << temp_yueZongE[i] << " | "
			<< setw(10) << setfill(' ') << temp_yueLiXi[i] << endl;
	}
}

等额本息类:
DengEBenXi.h

#include"DaiKuan.h"

class DengEBenXi :virtual public DaiKuan {
public:
	DengEBenXi();
	DengEBenXi(double xdaiKuanZongE, double xnianLiLv = 0, int xhuanKuanYueShu = 0);
	ostream& tostream(ostream& out, DaiKuan *d);
	ostream& operator<<(ostream& out);

	void compute();
	void print();
};

DengEBenXi.cpp

#include"DengEBenXi.h"

DengEBenXi::DengEBenXi(double xdaiKuanZongE, double xnianLiLv, int xhuanKuanYueShu) {
	init(xdaiKuanZongE, xnianLiLv, xhuanKuanYueShu);
}
DengEBenXi::DengEBenXi() {}

ostream& DengEBenXi::tostream(ostream& out, DaiKuan *d) {
	double *temp_yueZongE = d->getYueZongE();
	double *temp_yueBenJin = d->getYueBenJin();
	double *temp_yueLiXi = d->getYueLiXi();
	double *temp_daiKuanShengYu = d->getDaiKuanShengYu();
	out << endl
		<< setw(6) << setfill(' ') << "月份"
		<< setw(15) << setfill(' ') << "剩余贷款"
		<< setw(15) << setfill(' ') << "当月利息"
		<< setw(15) << setfill(' ') << "当月还款"
		<< setw(15) << setfill(' ') << "当月归还本金" << endl
		<< "------------------------------------------------------------------" << endl;
	for (int i = 0; i < (int)d->getHuanKuanYueShu(); i++)
	{
		out << setw(4) << setfill(' ') << i + 1 << " | " <<
			setw(12) << setfill(' ') << temp_daiKuanShengYu[i] << " | " <<
			setw(12) << setfill(' ') << temp_yueLiXi[i] << " | " <<
			setw(12) << setfill(' ') << temp_yueZongE[0] << " | " <<
			setw(12) << setfill(' ') << temp_yueBenJin[i] << " | " << endl;
	}
	return out;
}
ostream& DengEBenXi::operator<<(ostream& out) {
	double *temp_yueZongE = this->getYueZongE();
	double *temp_yueBenJin = this->getYueBenJin();
	double *temp_yueLiXi = this->getYueLiXi();
	double *temp_daiKuanShengYu = this->getDaiKuanShengYu();
	out << endl
		<< setw(6) << setfill(' ') << "月份"
		<< setw(15) << setfill(' ') << "剩余贷款"
		<< setw(15) << setfill(' ') << "当月利息"
		<< setw(15) << setfill(' ') << "当月还款"
		<< setw(15) << setfill(' ') << "当月归还本金" << endl
		<< "------------------------------------------------------------------" << endl;
	for (int i = 0; i < (int)this->getHuanKuanYueShu(); i++)
	{
		out << setw(4) << setfill(' ') << i + 1 << " | " <<
			setw(12) << setfill(' ') << temp_daiKuanShengYu[i] << " | " <<
			setw(12) << setfill(' ') << temp_yueLiXi[i] << " | " <<
			setw(12) << setfill(' ') << temp_yueZongE[0] << " | " <<
			setw(12) << setfill(' ') << temp_yueBenJin[i] << " | " << endl;
	}
	return out;
}
void DengEBenXi::compute()
{
	/*计算*/
	double *temp_yueZongE = (double*)malloc(sizeof(double)*getHuanKuanYueShu());
	double *temp_yueBenJin = (double*)malloc(sizeof(double)*getHuanKuanYueShu());
	double *temp_yueLiXi = (double*)malloc(sizeof(double)*getHuanKuanYueShu());
	double *temp_daiKuanShengYu = (double*)malloc(sizeof(double)*getHuanKuanYueShu());

	double money_left = getDaiKuanZongE();
	temp_yueZongE[0] = getDaiKuanZongE() * getNianLiLv() / 12 * pow((1 + getNianLiLv() / 12), getHuanKuanYueShu()) / (pow((1 + getNianLiLv() / 12), getHuanKuanYueShu()) - 1);

	setZongLiXi(getHuanKuanYueShu() * temp_yueZongE[0] - getDaiKuanZongE());
	for (int i = 0; i < (int)getHuanKuanYueShu(); i++)
	{
		temp_yueLiXi[i] = (money_left)*(getNianLiLv() / 12);
		temp_yueBenJin[i] = temp_yueZongE[0] - (money_left)*(getNianLiLv() / 12);
		temp_daiKuanShengYu[i] = money_left;
		money_left -= temp_yueZongE[0] - (money_left)*(getNianLiLv() / 12);

	}
	setYueZongE(temp_yueZongE);
	setYueLiXi(temp_yueLiXi);
	setDaiKuanShengYu(temp_daiKuanShengYu);
	setYueBenJin(temp_yueBenJin);
}

void DengEBenXi::print()
{
	double *temp_yueZongE = getYueZongE();
	double *temp_yueBenJin = getYueBenJin();
	double *temp_yueLiXi = getYueLiXi();
	double *temp_daiKuanShengYu = getDaiKuanShengYu();
	/*输出*/
	cout << endl
		<< setw(6) << setfill(' ') << "月份"
		<< setw(15) << setfill(' ') << "剩余贷款"
		<< setw(15) << setfill(' ') << "当月利息"
		<< setw(15) << setfill(' ') << "当月还款"
		<< setw(15) << setfill(' ') << "当月归还本金" << endl
		<< "------------------------------------------------------------------" << endl;
	for (int i = 0; i < (int)getHuanKuanYueShu(); i++)
	{
		cout << setw(4) << setfill(' ') << i + 1 << " | " <<
			setw(12) << setfill(' ') << temp_daiKuanShengYu[i] << " | " <<
			setw(12) << setfill(' ') << temp_yueLiXi[i] << " | " <<
			setw(12) << setfill(' ') << temp_yueZongE[0] << " | " <<
			setw(12) << setfill(' ') << temp_yueBenJin[i] << " | " << endl;
	}
}

报错类:

#pragma once
#include<iostream>
using namespace std;

class MyException {
public:
	MyException(const string &message) :message(message) {}
	MyException() {}
	const string &getMessage()const { return message; }
private:
	string message;
};

应用举例:
从文件(input.txt)中读取数据并进行计算后导入另一文件(output.txt)
需要保证D盘内有:

  1. input.txt
  2. output.txt

input.txt示例:
(第一列为贷款方式:0为等额本金,1为等额本息
第二列是贷款金额,第三列是贷款月数,第四列为年利率)
在这里插入图片描述
运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实例代码:

#include "DaiKuan.h"
#include"DengEBenJin.h"
#include"DengEBenXi.h"
#include"MyException.h"
#include<cstdlib>
#include<iostream>
#include<iomanip>
#include<string>
#include<fstream>
#include<sstream>
#include<cmath>

using namespace std;
int main()
{
	/*DaiKuan *d;
	d = new DengEBenJin(120000, 0.048, 12);
	d->compute();
	d->print();*/


	DaiKuan *d[10];
	int mode;
	double zongE;
	double liLv;
	int yueShu;
	int num = 0;

	ofstream out;
	ifstream in;
	istringstream ins;
	string line;
	try {
		in.open("d://input.txt", ios_base::in);
		if (!in) {
			throw MyException("Where is your txt???");
		}else {
			cout << "数据已由d://input.txt导入" << endl;
		}
		while (getline(in, line)) {
			ins.clear();
			ins.str(line);
			ins >> mode;
			if (mode != 0 && mode != 1) {
				cout << "you\' chose the wrong way" << endl;
				continue;
			}
			ins >> zongE;
			ins >> yueShu;
			ins >> liLv;
			if (mode == 0) {
				d[num] = new DengEBenJin();
				d[num]->setType(0);
				cout << 0 << " 等额本金" << endl;
			}
			else {
				d[num] = new DengEBenXi();
				d[num]->setType(1);
				cout << 1 << " 等额本息" << endl;
			}
			d[num]->setDaiKuanZongE(zongE);
			d[num]->setHuanKuanYueShu(yueShu);
			d[num]->setNianLiLv(liLv);
			num++;
		}
		for (int i = 0; i < num; i++) {
			d[i]->compute();
		}
		in.close();

	}catch (MyException& i) {
		cout << i.getMessage();
	}
	try{
		out.open("d://output.txt",ios_base::_Nocreate);
		if (!out) {
			throw MyException("Where's my output?");
		}else {
			cout << "数据将导出至d://output.txt" << endl;
		}
		for (int i = 0; i < num; i++) {
			out << "--------------------------------" << endl;
			out << "贷款方式:";
			if (dynamic_cast<DengEBenJin*>(d[i])) {
				out << "等额本金" << endl;
			}
			else {
				out << "等额本息" << endl;
			}
			out << "贷款总额:" << d[i]->getDaiKuanZongE() << endl;
			out << "贷款月数:" << d[i]->getHuanKuanYueShu() << endl;
			out << "年利率  :" << d[i]->getNianLiLv() << endl;
			out << d[i];
			/*d[i]->tostream(out,d[i]);
			d[i]->operator<<(out);*/

		}
		out.close();
	}catch (MyException& o) {
		cout << o.getMessage();
	}


	system("pause");
	return 0;

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

slandarer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值