残念ながら非常に具体的な質問です(そして、私はどちらかというと初心者なので、事前にお詫び申し上げます):
私は現在、大学のオブジェクト指向 C++ コースの最終プロジェクトを完成させようとしています。学生の試験結果を保存する学生データベースを作成しています。私のセットアップにはカスタムクラスがたくさんありますが、すべてが完全に機能します (または、少なくとも私がやりたいことを実行します)。
プロジェクトは次のように設定されます。
すべての「コース」の「マスター」マップがあり、すべてがそこを指しています (したがって、複数の学生がコースを受講している場合、コースは複製されません)。
「学生」は、「コース」へのポインターのベクトルと、対応する二重の「結果」であり、システム内のすべての学生のマスターマップを持っています。
「学位」は、その学位によって提供されるコースへのポインタと、その学位を取得する学生へのポインタの 2 つのベクトルのクラスです。度が作成されると、両方のマスター マップが検索されます。コース ID の最初の x 文字が学位プレフィックスと一致する場合、コースが追加されます。学生の科目がコース名と一致する場合、その学生は追加されます。
私の問題はこれです:
CSV ファイルからの初期セットアップ後にコースと学生を手動で入力するオプションがいくつかあるため、学位に含める必要があるコース/結果が追加された場合に学位を更新する関数を作成しました (以下を参照)。ただし、このコードでは、この関数が最初に呼び出されたときに、必然的に最初のコースと学生が最初の学位に再追加 (つまり、繰り返されます) されます。関数が再度呼び出された場合、この問題は繰り返されません。理由はまったくわかりません。後で膨大な時間とコストのステートメントが発生し、これを解決することはできません。最初の実行について明らかな何かが欠けていますか? ループの設定が間違っている可能性があります (マップに詳しくありません)。私を馬鹿と呼ぶのをためらわないでください!
上で述べたように、プログラムの残りの部分はすべてグレービーですが、この奇妙な問題がなければ、プログラムは問題ありません。問題は私の印刷機能にも起因していないようです。
よろしくお願いいたします。
//upgrade degrees function: used whenever new courses or students could be created by the user. It ticks through all stored degrees and scans cd and sd. If it finds an unstored course or student that should be stored, they are added.
void degree_database::update_degrees(course_database &cd, student_database &sd) {
cout << "updating degrees..." << endl;
bool found = false;
vector<degree>::iterator current;
for (current = start; current < end; ++current) {
//scan course list
map<string, course>::iterator x;
for (x = cd.get_start(); x != cd.get_end(); ++x) {
if (x->first.substr(0,3) == current->get_prefix().substr(0,3) || current->get_prefix() == "ALL") {
//check to see if course is already stored
vector<course*>::iterator a;
for (a = current->get_c_start(); a < current->get_c_end(); ++a) {
if (*a == &(x->second)) {
found = true;
break;
}
}
//if found == true, then while loop broke early (i.e. the course was already stored).
if (found == false) current->add_course(x->second);
found = false;
}
}
//scan student list
found = false;
map<string, student>::iterator y;
for (y = sd.get_start(); y != sd.get_end(); ++y) {
if (y->second.get_subject() == current->get_name() || current->get_name() == "All") {
//check to see if course is already stored
vector<student*>::iterator b;
for (b = current->get_s_start(); b < current->get_s_end(); ++b) {
if (*b == &(y->second)) {
found = true;
break;
}
}
//if found == true, then while loop broke early (i.e. the student was already stored).
if (found == false) current->add_student(y->second);
found = false;
}
}
}
cout << "done." << endl;
}