动态分配的数组仅显示最后的结果

时间:2014-11-07 01:52:12

标签: c++ arrays pointers dynamic-allocation

我创建了一个程序,该程序接收学生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;
};

为了包含学生的一切,我为他们创建了一个名为Student的结构:

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

我遇到的问题是我的最终成绩。用户输入他们想要的切割点数量,然后输入实际切割点。让我们说用户输入两行切点。我最终得到了这个输出:

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

这是我的(眼睛)方法,应该将最终成绩存储到正确的数组位置,具体取决于切点中的位置:

void getFinalGrade(int cutAmount, Cutpoints* cut, Student* students, int amountOfStudents) {
    for(int j = 0; j < cutAmount; j++) {
        for(int i = 0; i < amountOfStudents; i++) {
            students[i].finalGrade = new std::string[cutAmount];
            // if students grade option is P/NP
            if(students[i].gradeOption == 'P') {
                if(students[i].totalScore >= cut[j].c) { // we pass
                    students[i].finalGrade[j] = "P";
                } else { // we didn't pass
                    students[i].finalGrade[j] = "NP";
                } // end P/NP grade option
            // check grade based on cutpoints for the G option
            } else {
                if(students[i].totalScore >= cut[j].a) {
                    students[i].finalGrade[j] = "A";
                } else if(students[i].totalScore >= cut[j].b) {
                    students[i].finalGrade[j] = "B";
                } else if(students[i].totalScore >= cut[j].c) {
                    students[i].finalGrade[j] = "C";
                } else if(students[i].totalScore >= cut[j].d) {
                    students[i].finalGrade[j] = "D";
                } else {
                    students[i].finalGrade[j] = "F";
                }
            } // end checking statement
        } // end inner for
    } // end outer for
}

1 个答案:

答案 0 :(得分:1)

这个代码似乎是两个主要问题:

  1. 你正在迭代outputFinalGrade中的每个cutpoint,而循环中,你调用getFinalGrade,迭代每个cutpoint集(即使切割点集尚未全部初始化)。您可能希望更改getFinalGrade以获取切割点,并删除额外的外部for循环。

  2. 您正在重新初始化每次迭代的最终成绩:)这意味着每次迭代时,您都会清除上次迭代的结果。这很可能是导致问题的原因:

    students[i].finalGrade = new std::string[cutAmount];
    
  3. 有很多方法可以解决这个问题,在其他地方移动初始化,或者只是在调用new之前检查NULL。