gpt4 book ai didi

c++ - cout 在 vector 迭代器 C++ 中似乎无法正常工作

转载 作者:行者123 更新时间:2023-11-30 03:34:53 25 4
gpt4 key购买 nike

我目前正在处理需要遍历一些学生记录的作业。每条记录都有注册。 number, name, 0 到多个模块名称分别带有标记。

我有一个学生类和一个主类。在主类中,有一个函数可以遍历 Students vector 并打印平均成绩。

打印平均成绩和姓名的功能。

void aboveGiven(vector<Student> &students, float given) {

vector<Student>::iterator it;
for(it = students.begin(); it != students.end(); it++) {
if(it -> getAverageMark() >= given) {
cout << it->getName() << " " << setprecision(2) << it->getAverageMark() << endl;
}
}
}

计算平均成绩的功能。 “给定”参数是用于定义显示记录的平均值以上的输入。 (在这种情况下它是 70 意味着必须打印所有平均超过 70 的记录)

float Student::getAverageMark() const
{

if (marks.size() == 0)
return 0;
int count;
float sum;

map<string, float>::const_iterator it;

for (it = marks.begin(); it != marks.end(); ++it, ++count) {
sum += it->second;
}

return sum / count;
}

我遇到的大问题是 cout 的奇怪行为如果我将 60 或以上作为“给定”参数传递,它不会打印任何内容。

但是下面的代码:

void aboveGiven(vector<Student> &students, float given) {

vector<Student>::iterator it;
for(it = students.begin(); it != students.end(); it++) {
cout << "a" << endl;
if(it -> getAverageMark() >= given) {
cout << it->getName() << " " << setprecision(2) << it->getAverageMark() << endl;
}
}
}

只有行的不同 cout << "a" << endl;给我以下输出:

a
a
a
Lisa Simpson 88.03
a
Homer Simpson 99.90
a
a
Wayne Rooney 75.45
a
a
a
a

其中“a”对应于所有平均成绩低于 70 分的记录,正如我们所看到的,所有平均成绩高于 70 分的记录现在都打印良好。

有时,当为 cout 使用不同的参数时,实际上只会显示一些输出,而不是全部。

我是 C++ 的新手,对引用和指针仍然很困惑,所以我怀疑它们可能有问题。否则这可能是 IDE 的问题(我使用的是支持 C++11 的 CLion)。

很抱歉,如果这没有提供足够的信息,我以前从未在这里发布过任何内容。如果您需要任何其他信息,请随时询问,我会发布。

类(class)以防万一:学生.cpp

using namespace std;

#include "Student.h"
#include <iostream>

Student::Student(const string& name, int regNo)
: Person(name)
{
this->name = name;
this->regNo = regNo;

this->marks = marks;
}

int Student::getRegNo() const
{
return regNo;
}

void Student::addMark(const string& module, float mark)
{
marks[module] = mark;
}

float Student::getMark(const string& module) throw(NoMarkException)
{

if (marks.find(module) == marks.end()) {
throw NoMarkException();
}
return marks[module];
}

float Student::getAverageMark() const
{

if (marks.size() == 0)
return 0;
int count;
float sum;

map<string, float>::const_iterator it;

for (it = marks.begin(); it != marks.end(); ++it, ++count) {
sum += it->second;
}

cout << fixed;
return sum / count;
}

和 main:(目前它的样式真的很糟糕,抱歉)

using namespace std;
#include <iostream>
#include <fstream>
#include <sstream>
#include "Student.h"
#include <vector>
#include <iomanip>

void aboveGiven(vector<Student>& students, float given)
{

vector<Student>::iterator it;
for (it = students.begin(); it != students.end(); it++) {
cout << "a" << endl;
if (it->getAverageMark() >= given) {
cout << it->getName() << " " << setprecision(2) << it - > getAverageMark() << endl;
}
}
}

int main()
{

char studentFileName[30];
char marksFileName[30];
vector<Student> students;

cout << "Enter the name of a file with Students: " << endl;
cin >> studentFileName;

ifstream studentFile;
string line;
studentFile.open(studentFileName, ios::in);
if (studentFile.is_open()) {
while (getline(studentFile, line)) {

istringstream iss(line);

int regn;
string firstName, lastName;

iss >> regn >> firstName >> lastName;

students.push_back(Student(firstName + " " + lastName, regn));
}

studentFile.close();
}
else {
cout << "Failed to open: " << studentFileName << endl;
}

cout << "Enter the name of a file with Marks: " << endl;
cin >> marksFileName;

ifstream marksFile;
string ln;
marksFile.open(marksFileName, ios::in);
if (marksFile.is_open()) {
while (getline(marksFile, ln)) {

int regn;
string module;
float mark;
bool studentFound = false;

istringstream iss(ln);

iss >> regn >> module >> mark;

for (auto& student : students) {

if (student.getRegNo() == regn) {

student.addMark(module, mark);
studentFound = true;
}
}
if (!studentFound) {
cout << "Student with Registration Number " << regn << was not found." << endl;
}
}

marksFile.close();
}
else {
cout << "Failed to open: " << marksFileName << endl;
}

for (auto& student : students) {
map<string, float> tempMap = student.getMarks();
map<string, float>::iterator it;
cout << setw(20) << student.getName() << ": ";
if (tempMap.size() == 0) {
cout << "N/A";
}
else {

for (it = tempMap.begin(); it != tempMap.end(); it++) {
cout << setw(5) << it->first << '(' << it->second << "); ";
}
}
cout << endl;
}

aboveGiven(students, 70);
}

在此先感谢您的帮助!

最佳答案

您没有在 Student::getAverageMark 中初始化 int sumint count。然后没有人知道他们会是什么。它们必须是 int sum = 0;int count = 0;

关于c++ - cout 在 vector 迭代器 C++ 中似乎无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41687679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com