C++ 仅显示最后结果的动态分配数组
我正在创建一个程序,接收学生ID、姓名和考试分数,并根据可能的分数和相对权重的其他输入计算他们收到的总分。从那里,用户将输入切点集,准确地说出A、B、C、D、F线的位置。例如,如果B切点集为20.0,而A切点集为90.0,则介于90和20之间的任何对象都将获得B级 为了实现这一点,我创建了一个名为Cutpoints的结构,它只有这个C++ 仅显示最后结果的动态分配数组,c++,arrays,pointers,dynamic-allocation,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; }; 为了包
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 outputFinalGrade(int numOfStudents,int cutpointAmount,Cutpoints*cut,Student*students){
对于(int i=0;i
下面是我的(视觉障碍)方法,它应该根据切入点中的位置将最终坡度存储到正确的阵列位置:
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
}
void getFinalGrade(整数切割量、切割点*切割、学生*学生、整数数量学生){
对于(int j=0;j=cut[j].c){//我们通过了
学生[i].最终成绩[j]=“P”;
}否则我们没有通过
学生[i].期末成绩[j]=“NP”;
}//结束P/NP等级选项
//基于G选项的切割点检查坡度
}否则{
如果(学生[i].totalScore>=cut[j].a){
学生[i].最终成绩[j]=“A”;
}否则如果(学生[i].totalScore>=cut[j].b){
学生[i].最终成绩[j]=“B”;
}否则如果(学生[i].totalScore>=cut[j].c){
学生[i].最终成绩[j]=“C”;
}否则如果(学生[i].totalScore>=cut[j].d){
学生[i].最终成绩[j]=“D”;
}否则{
学生[i].最终成绩[j]=“F”;
}
}//结束检查语句
}//内端为
}//外部结束
}
这段代码似乎有两个主要问题:
students[i].finalGrade = new std::string[cutAmount];
有很多方法可以解决这个问题,将初始化移到别处,或者在调用new之前简单地检查NULL。使用
std::vector
来创建数组,而不是指针和new,因为这样更安全、更容易。为了避免代码重复,不如使用一个截断点数组,而不是单独列出每个成员。然后,您可以p通过截止点,直到找到正确的为止。@NeilKirk不幸的是,对于分配,我们不允许使用向量。:/我们必须使用动态分配的数组。getFinalGrade有些东西是可疑的;您设置了finalGrade[j]
在只看到j
一次的循环中。每次j
循环中,您将为每个学生[i]分配新内存。finalGrade
将丢失您在j
循环的上一次迭代中设置的所有内存。