我是C ++的新手。这实际上是我写的第一个类(一些代码来自 C ++ Primer )。尝试组合具有相同名称的类对象时,我遇到了逻辑错误。事情是这样的:
构造函数从istream
struct StudentEntry {
StudentEntry() = default;
StudentEntry(std::istream &);
std::string getStudentName() const { return name; }
StudentEntry& combine (const StudentEntry&);
double avgMark() const;
std::string name = "";
unsigned passCources = 0;
double markSum = 0.0;
};
combine
函数是指+ =数据成员(passCources
& markSum
):
StudentEntry& StudentEntry::combine(const StudentEntry& st) {
passCources += st.passCources;
markSum += st.markSum;
return *this;
}
avgMark
正在计算标记平均值:
double StudentEntry::avgMark() const {
return passCources ? markSum / passCources : 0;
}
当我在main
中合并超过2个对象时,我出错了
标记总和和平均值
int main() {
StudentEntry st;
if (read(std::cin, st)) {
StudentEntry nextSt;
while (read(std::cin, nextSt)) {
if (st.getStudentName() == nextSt.getStudentName())
st.combine(nextSt);
}
}
print(std::cout, st);
}
结果错误:
Next ->
Nick 1 90
Next ->
Nick 1 90
Next ->
Nick 1 90
Next ->
Nick 3 360 | Average: 120
应该是Nick 3 270 | Average: 90
我被困在这里。
我的print
和read
函数(以及构造函数)。如果通过的课程数量> 1,read
应该得到所有后续标记。
std::ostream& print(std::ostream &os, const StudentEntry &st) {
os << st.getStudentName() << " " << st.passCources << " " << st.markSum
<< "\t | Average: " << st.avgMark() << "\n";
return os;
}
std::istream& read(std::istream &is, StudentEntry &st) {
std::cout << "Next -> " << std::endl;
is >> st.name >> st.passCources;
double mark;
for (unsigned i = 0; i < st.passCources; ++i) {
is >> mark;
st.markSum += mark;
}
return is;
}
StudentEntry::StudentEntry(std::istream &is) {
read(is, *this);
}
答案 0 :(得分:1)
while
循环的每次迭代都会在markSum
中累积nextSt
个值,因为它调用的read
方法内部
st.markSum += mark;
你应该在迭代之前重置总和:
st.markSum = 0.0;
double mark;
for (unsigned i = 0; i < st.passCources; ++i) {
is >> mark;
st.markSum += mark;
}