解析: 考题本身非常简单,需要注意书写格式(特别是我被扣分的注释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:
……
}
按以下要求编写程序
deposit 类包含构造函数,name默认值为“NoName”,其余参数默认值为0.0。deposit 类包含成员函数setName,用于设置账户名称。deposit 类包含成员函数pay,用于执行还贷操作。正常还贷操作的过程是:balance 减去charge,loan 减去charge。如果loan 大于charge,则还贷金额为charge,否则还贷金额为loan。如果余额balance 大于还贷金额charge,则正常还贷,并返回true,否则不执行还贷操作,并设置账户名称为原名称后面加“(*)”,并返回false。重载后自增运算符++,用于将当前对象的每次还贷金额charge 增加100。重载流输出运算符,用于显示一个对象的信息。其中,name 占10 列并左对齐,balance、loan、charge 各占15 列并精确到小数点后2 位。编写函数 inputData,完成数据的读入,结果存放在向量v_acc 中。编写函数 incData,将v_acc 中所有账户的还贷金额增加100。编写函数 decData,将v_acc 中所有账户执行一次还贷操作,返回无法完成还贷的账户数;编写函数 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;
}
考试代码
#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:
deposit(string tempname
= "NoName", double tempbalance
= 0.0, double temploan
= 0.0, double tempcharge
= 0.0) {
name
= tempname
;
balance
= tempbalance
;
loan
= temploan
;
charge
= tempcharge
;
}
void setName(string tempname
) {
name
= tempname
;
}
bool pay() {
if (loan
> charge
&& balance
> charge
) {
balance
-= charge
;
loan
-= charge
;
return true;
}
else if(loan
<= charge
&& balance
> charge
){
balance
-= loan
;
loan
-= loan
;
return true;
}
else {
name
= name
+ "(*)";
return false;
}
}
deposit
operator++(int) {
deposit
temp(*this);
this->charge
+= 100;
return temp
;
}
friend ostream
& operator<<(ostream
& out
, const deposit
& t
) {
out
<< left
<< setw(10) << t
.name
<<
right
<< setw(15) << fixed
<< setprecision(2) << t
.balance
<<
right
<< setw(15) << fixed
<< setprecision(2) << t
.loan
<<
right
<< setw(15) << fixed
<< setprecision(2) << t
.charge
;
return out
;
}
};
void inputData(string path
, vector
<deposit
>& v_acc
) {
fstream
data(path
, ios
::in
);
if (!data
) {
cout
<< "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();
}
void incData(vector
<deposit
>& v_acc
) {
for (vector
<deposit
>::iterator it
= v_acc
.begin(); it
!= v_acc
.end(); it
++) {
(*it
)++;
}
}
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
;
}
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;
}