2017-01-17 6 views
0

私は現在、いくつかの学生レコードを繰り返し処理する必要がある割り当てに取り組んでいます。各レコードにはregがあります。 number、name、0を複数のモジュール名にそれぞれマークします。coutがベクトルイテレータC++で正しく動作しないようです。

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

平均グレードを計算する機能。 「与えられた」パラメータは、レコードを表示する平均を超える値を定義するために使用される入力です。 (この場合には、それは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; 
} 

私が持っている大規模な問題は、私は "として60以上を合格した場合、それは何も出力しないcoutの奇妙な動作です「与えられた」パラメータ。

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で問題になる可能性があります(私は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); 
} 

ありがとう!

+2

でなければなりません。 – Barmar

+2

'cout'は正常に動作しています。あなたは、変数を初期化していないので、あなたは不確定な結果を返しているので、given' 'との比較が失敗していると、あなたは何を印刷していません。 – Barmar

+0

あなたは[STD ::累積](http://en.cppreference.com/w/cpp/algorithm/accumulate)を使用して初期化されていない変数を避けることができました。 [こちらはサンプルです](http:// ideone。com/HxIuNq) – PaulMcKenzie

答えて

2

int sumint countStudent::getAverageMarkに初期化していません。それで誰も何ができるのか分からない。彼らはあなたが `getAverageMark()`で '0'に `sum`と` count`を初期化することはありませんint sum = 0;int count = 0;

+1

彼は 'sum'を初期化する必要もあります。 – Barmar

+0

はい、編集しました。ありがとうございました。 –

+0

これに約3時間を費やしました。大いに感謝する!すべて今はうまくいく。 –

関連する問題