cout似乎在矢量迭代器C ++中没有正常工作

时间:2017-01-17 01:27:22

标签: c++ iterator

我目前正在完成作业,我需要迭代一些学生记录。每个记录都有reg。数字,名称和0到多个模块名称分别带标记。

我有一个Student课程和一个Main课程。 在主要课程中,有一个函数可以迭代学生矢量并打印平均成绩。

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

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;
    }
  }
}

计算平均成绩的功能。 “Given”参数是用于定义上面显示记录的平均值的输入。 (在这种情况下,它是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或更高版本作为“Given”参数传递,它就不会打印任何内容。

但是以下代码:

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)。

如果这个内容不够丰富,我很抱歉,之前从未发布任何内容。如果您需要任何其他信息,请随时提出,我会发布。

类以防万一: Student.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;
}

主要:(目前风格很糟糕,对不起)

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);
}

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

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