Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 仅显示最后结果的动态分配数组_C++_Arrays_Pointers_Dynamic Allocation - Fatal编程技术网

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

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; }; 为了包

我正在创建一个程序,接收学生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 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”;
}
}//结束检查语句
}//内端为
}//外部结束
}

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

  • 您在outputFinalGrade内迭代每个切点集,在循环内调用getFinalGrade,它也在每个切点集上迭代(即使切点集尚未全部初始化)。您可能希望更改getFinalGrade以获取切点,并删除额外的外部for循环

  • 每次迭代都会重新初始化最终分数:)这意味着每次迭代都会删除上次迭代的结果。这很可能是问题的原因:

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

  • 有很多方法可以解决这个问题,将初始化移到别处,或者在调用new之前简单地检查NULL。

    使用
    std::vector
    来创建数组,而不是指针和new,因为这样更安全、更容易。为了避免代码重复,不如使用一个截断点数组,而不是单独列出每个成员。然后,您可以p通过截止点,直到找到正确的为止。@NeilKirk不幸的是,对于分配,我们不允许使用向量。:/我们必须使用动态分配的数组。getFinalGrade有些东西是可疑的;您设置了
    finalGrade[j]
    在只看到
    j
    一次的循环中。每次
    j
    循环中,您将为每个
    学生[i]分配新内存。finalGrade
    将丢失您在
    j
    循环的上一次迭代中设置的所有内存。