Я создаю программу, которая принимает идентификаторы, имя и результаты тестов учащихся и вычисляет общий балл, который они получают, на основе других входов возможных оценок и относительных весов. Оттуда пользователь будет вводить наборы точечных точек, чтобы точно сказать, где находятся линии 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;
}
А вот мой метод (уродство), который должен хранить итоговую оценку в правильное положение массива в зависимости от того, что положения в точках сечения:
Вместо указателей и новых, используйте 'std :: vector' для создания массивов, поскольку это безопаснее и проще. Чтобы избежать дублирования кода, как насчет массива точек отсечения, а не перечислять каждый член отдельно? Затем вы можете пройти через отсечки, пока не найдете правильный. –
@NeilKirk К сожалению, для назначения нам не разрешено использовать векторы. :/Мы должны использовать динамически распределенные массивы. – Alex
что-то подозрительное с getFinalGrade; вы устанавливаете 'finalGrade [j]' внутри цикла, который только видит 'j' один раз. Каждый раз вокруг цикла 'j' вы будете выделять новую память для каждого' students [i] .finalGrade', который потеряет всю память, установленную на предыдущих итерациях цикла j. –