我创建了一个程序,该程序接收学生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
}
答案 0 :(得分:1)
这个代码似乎是两个主要问题:
你正在迭代outputFinalGrade中的每个cutpoint,而在循环中,你调用getFinalGrade,也迭代每个cutpoint集(即使切割点集尚未全部初始化)。您可能希望更改getFinalGrade以获取切割点,并删除额外的外部for循环。
您正在重新初始化每次迭代的最终成绩:)这意味着每次迭代时,您都会清除上次迭代的结果。这很可能是导致问题的原因:
students[i].finalGrade = new std::string[cutAmount];
有很多方法可以解决这个问题,在其他地方移动初始化,或者只是在调用new之前检查NULL。