【c++】2020大一下第二次考试

解析: 考题本身非常简单,需要注意书写格式(特别是我被扣分的注释QAQ)。

考试题目

请各位考生从课程教学群文件中下载数据文件account.txt,然后将数据文件手动保存在D 盘根文件夹下。按要求编写一个deposit 类,用于存储文件account.txt 中的数据。该文件中每行记录一个账户的信息,包含4 项数据,以tab字符分隔,各个字段的信息如下:
 第 1 列表示账户名称name;
 第 2 列表示账户存款余额balance;
 第 3 列表示账户贷款余额loan;
 第 4 列表示每次还贷金额charge;
根据account.txt 文件中的数据,现设计deposit 类的结构如下,其中包含4个私有数据成员变量:

class deposit
{
private:
string name;
double balance, loan, charge;
public:
……
}

按以下要求编写程序

  1. deposit 类包含构造函数,name默认值为“NoName”,其余参数默认值为0.0。
  2. deposit 类包含成员函数setName,用于设置账户名称。
  3. deposit 类包含成员函数pay,用于执行还贷操作。正常还贷操作的过程是:balance 减去charge,loan 减去charge。如果loan 大于charge,则还贷金额为charge,否则还贷金额为loan。如果余额balance 大于还贷金额charge,则正常还贷,并返回true,否则不执行还贷操作,并设置账户名称为原名称后面加“(*)”,并返回false。
  4. 重载后自增运算符++,用于将当前对象的每次还贷金额charge 增加100。
  5. 重载流输出运算符,用于显示一个对象的信息。其中,name 占10 列并左对齐,balance、loan、charge 各占15 列并精确到小数点后2 位。
  6. 编写函数 inputData,完成数据的读入,结果存放在向量v_acc 中。
  7. 编写函数 incData,将v_acc 中所有账户的还贷金额增加100。
  8. 编写函数 decData,将v_acc 中所有账户执行一次还贷操作,返回无法完成还贷的账户数;
  9. 编写函数 outPut,用于把向量v_acc 中的数据显示输出。显示格式在重载流输出运算符中已有表述。

程序的main 函数(注意:不得修改main 函数!对main 函数每修改
一处扣2 分,最多扣10 分。)

int main()
{
vector<deposit> v_acc;
string path = "d:\\account.txt";
inputData(path, v_acc);
outPut(v_acc);
cout << "-------------------------------" << endl;
incData(v_acc);
outPut(v_acc);
cout << "-------------------------------" << endl;
cout << "can not pay = " << decData(v_acc) << endl;
outPut(v_acc);
return 0;
}

考试代码

//1927405148,凌珑 

#include<iostream>
#include<sstream>
#include<istream>
#include<fstream>
#include<string>
#include<vector>
#include<algorithm>
#include<iomanip>
using namespace std;

class deposit {
private:
	string name;
	double balance, loan, charge;
public:
//1、构造函数,name默认值为“NoName”,其余参数默认值为0.0
	deposit(string tempname = "NoName", double tempbalance = 0.0, double temploan = 0.0, double tempcharge = 0.0) {
		name = tempname;
		balance = tempbalance;
		loan = temploan;
		charge = tempcharge;
	}

//2、成员函数setName,用于设置账户名称 
	void setName(string tempname) {
		name = tempname;
	}

//3、成员函数pay,用于执行还贷操作
	bool pay() {
		if (loan > charge && balance > charge) {//正常还款,还款金额为charge
			balance -= charge;
			loan -= charge;
			return true;
		}
		else if(loan <= charge && balance > charge){//还清贷款,还款金额为loan
			balance -= loan;
			loan -= loan;
			return true;
		}
		else {//不执行还款操作
			name = name + "(*)";
			return false;
		}
	}

//4、重载后自增运算符++,用于将当前对象的每次还贷金额charge增加100
	deposit operator++(int) {
		deposit temp(*this);
		this->charge += 100;
		return temp;
	}

//5、友元函数重载<<,用于显示一个对象的信息
	friend ostream& operator<<(ostream& out, const deposit& t) {
		out << left << setw(10) << t.name <<
			right << setw(15) << fixed << setprecision(2) << t.balance <<//这个的right是为了和参考样例一致,怕扣分
			right << setw(15) << fixed << setprecision(2) << t.loan <<
			right << setw(15) << fixed << setprecision(2) << t.charge;
		return out;
	}
};

//6、函数 inputData,完成数据的读入,结果存放在向量v_acc中
void inputData(string path, vector<deposit>& v_acc) {
	fstream data(path, ios::in);//打开文件
	if (!data) {
		cout << "wrong!";  //不能打开则输出"wrong!"
		return;
	}
	string tempname;
	double tempbalance, temploan, tempcharge;
	while (data >> tempname >> tempbalance >> temploan >> tempcharge) {
		deposit temp(tempname, tempbalance, temploan, tempcharge);
		v_acc.push_back(temp);
	}

	data.close();//关闭文件
}

//7、函数 incData,将v_acc 中所有账户的还贷金额增加100
void  incData(vector<deposit>& v_acc) {
	for (vector<deposit>::iterator it = v_acc.begin(); it != v_acc.end(); it++) {
		(*it)++;
	}
}

//8、函数 decData,将v_acc 中所有账户执行一次还贷操作,返回无法完成还贷的账户数
int decData(vector<deposit>& v_acc) {
	int sum = 0;
	for (vector<deposit>::iterator it = v_acc.begin(); it != v_acc.end(); it++) {
		bool judge=(*it).pay();
		if (!judge) {//如果不能完成一次还贷操作 
			sum++;
		}
	}
	return sum;
}

//9、函数 outPut,用于把向量v_acc 中的数据显示输出
void outPut(vector<deposit>& v_acc) {
	for (vector<deposit>::iterator it = v_acc.begin(); it != v_acc.end(); it++) {
		cout << *it << endl;
	}
}

int main()
{
	vector<deposit> v_acc;
	string path = "d:\\account.txt";
	inputData(path, v_acc);
	outPut(v_acc);
	cout << "-------------------------------" << endl;
	incData(v_acc);
	outPut(v_acc);
	cout << "-------------------------------" << endl;
	cout << "can not pay = " << decData(v_acc) << endl;
	outPut(v_acc);
	return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值