2014-11-07 39 views
1

我正在創建一個程序,它接收學生ID,姓名和考試分數,並根據可能分數和相對權重的其他輸入計算他們收到的總分數。從那裏,用戶將輸入切點集,以準確地說出A,B,C,D,F行的位置。例如,如果B分割點集合爲20.0,A分割點爲90.0,則90至20之間的任何內容都將獲得等級B.動態分配的數組只顯示最後的結果

要實現此目的,我創建了一個名爲Cutpoints的結構,這個。

struct Cutpoints { 
    double a; 
    double b; 
    double c; 
    double d; 
}; 

含有大約學生的一切,我創建了一個名爲學生爲他們的結構:

struct Student { 
    int id; // student ID 
    char gradeOption; // either G or P 
    double totalScore; 
    std::string studentName; 
    int* rawScores = NULL; // array that holds raw scores for a student 
    std::string* finalGrade; // final grade given in course 
}; 

我遇到的問題是我的最終成績輸出。用戶輸入他們想要的分割點數量,然後輸入實際的分割點。假設用戶輸入兩行cutpoints。我最終得到這樣的輸出:

2 
85.0 75.0 65.0 55.0 
80.0 70.0 60.0 50.0 
TOTAL SCORES 
123 Alex Thornton 79.1 
234 Boo Thornton 100 
345 Jane Student 92 
456 Joe Student 72.4 
567 Too-Many Courses 30.8 
CUTPOINT SET 1 
123 Alex Thornton 
234 Boo Thornton 
345 Jane Student 
456 Joe Student 
567 Too-Many Courses 
CUTPOINT SET 2 
123 Alex Thornton B 
234 Boo Thornton A 
345 Jane Student A 
456 Joe Student P 
567 Too-Many Courses F 

總分值沒有問題輸出和最後截點的最終成績將輸出正確的,但在此之前所有的切點也不會輸出最終的成績。我試圖用cout進行調試,然後嘗試跟蹤問題,但我無法弄清楚發生了什麼問題。下面是與最後的成績特別工作代碼:

void outputFinalGrade(int numOfStudents, int cutpointAmount, Cutpoints* cut, Student* students) { 
    for(int i = 0; i < cutpointAmount; i++) { 
     inputCutpoint(i, cut); // get user input for the current set of cutpoints 
     getFinalGrade(cutpointAmount, cut, students, numOfStudents); 
     /* OUTPUT */ 
     std::cout << "CUTPOINT SET " << (i + 1) << std::endl; 
     for(int j = 0; j < numOfStudents; j++) { // print all students 
      std::cout << students[j].id << students[j].studentName << " " << students[j].finalGrade[i] << std::endl; 
     } // end inner for (display students) 
    } // end outer for 
} // end outputFinalGrade 

// input cutpoints 
void inputCutpoint(int cutpointNumber, Cutpoints* cut) { 
     // user inputs cutpoints 
     std::cin >> cut[cutpointNumber].a >> cut[cutpointNumber].b >> cut[cutpointNumber].c >> cut[cutpointNumber].d; 
} 

這裏是我的(礙眼)方法應該最終成績存入靠的是在切點是什麼位置的正確陣列位置:

+0

而不是指針和新的,使用'std :: vector'來創建數組,因爲它更安全和更容易。爲了避免代碼重複,如何分割點而不是單獨列出每個成員?然後,您可以循環切入點,直到找到合適的點。 – 2014-11-07 01:56:44

+0

@NeilKirk不幸的是,我們不允許使用矢量。 :/我們必須使用動態分配的數組。 – Alex 2014-11-07 02:01:23

+0

有些東西是可疑的getFinalGrade;你在一個只能看到'j'的循環內設置'finalGrade [j]'一次。每次在'j'循環中,你都會爲每個'students [i] .finalGrade'分配新的內存,這會丟失你在'j'循環的前幾次迭代中設置的所有內存。 – 2014-11-07 02:34:03

回答

1

似乎是兩個主要的問題與此代碼:您遍歷每個分割點內outputFinalGrade設置

  1. ,並循環中,您調用getFinalGrade,其中遍歷每個切點集(儘管切點集尚未初始化)。您可能需要更改getFinalGrade以獲取切點,並刪除額外的for循環。

  2. 您正在重新初始化每次迭代的最終成績:)這意味着每次迭代時,都會清除最後一次迭代的結果。這很可能是你的問題的原因:

    students[i].finalGrade = new std::string[cutAmount]; 
    

有許多的方式來解決這個問題,其他地方移動intialization,或調用新之前簡單地檢查NULL。