2017-01-17 8 views
0

В настоящее время я работаю над заданием, в котором мне нужно перебирать некоторые записи студентов. Каждая запись имеет рег. число, имя и 0 для нескольких имен модулей с метками соответственно.cout не работает корректно в векторном итераторе C++

У меня есть класс учеников и основной класс. В основном классе есть функция для итерации через вектор учеников и печати среднего класса.

Функция печати средних оценок, а также имен.

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 

Где «а» соответствует всем записям с средним баллом ниже 70 и, так как мы видим, что все записи со средним классом выше 70 теперь хорошо напечатаны.

Иногда при использовании разных параметров для cout только некоторые из выходов будут отображаться на дисплее, но не все.

Я новичок в C++ и все еще очень смущен ссылками и указателями, поэтому я подозреваю, что с ними может возникнуть проблема. В противном случае это может быть проблемой с IDE (я использую CLion, который поддерживает C++ 11).

Прошу прощения, если это не достаточно информативно, никогда не публиковал ничего здесь раньше. Если вам нужна дополнительная информация, пожалуйста, не стесняйтесь спрашивать, я отправлю ее.

классы только в случае, если: 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); 
} 

Заранее спасибо за вашу помощь!

+2

Вы никогда не инициализировали 'sum' и' count' '' '' 'getAverageMark()'. – Barmar

+2

'cout' работает нормально. Поскольку вы не инициализировали переменные, вы возвращаете неопределенный результат, поэтому сравнение с 'given' не выполняется, и вы ничего не печатаете. – Barmar

+0

Вы могли бы использовать [std :: accumulate] (http://en.cppreference.com/w/cpp/algorithm/accumulate) и избегать неинициализированных переменных. [Вот пример] (http: // ideone.com/HxIuNq) – PaulMcKenzie

ответ

2

Вы не инициализировали int sum и int count в Student::getAverageMark. Тогда никто не знает, что это такое. Они должны быть int sum = 0; и int count = 0;

+1

Ему также нужно инициализировать 'sum'. – Barmar

+0

Да, отредактирован. Спасибо. –

+0

Прошло почти 3 часа. Большое спасибо! Сейчас все работает отлично. –