懂的都懂:
三个头文件
三个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盘内有:
- input.txt
- 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;
}