繁体   English   中英

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

[英]cout doesn't seem to work correctly within vector iterator C++

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

我有一个学生班和一个主班。 在主班级中,有一个函数可以遍历学生向量并打印平均成绩。

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

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;行不同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);
}

在此先感谢您的帮助!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM