2014-11-07 6 views
1

Я создаю программу, которая принимает идентификаторы, имя и результаты тестов учащихся и вычисляет общий балл, который они получают, на основе других входов возможных оценок и относительных весов. Оттуда пользователь будет вводить наборы точечных точек, чтобы точно сказать, где находятся линии 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; 
} 

А вот мой метод (уродство), который должен хранить итоговую оценку в правильное положение массива в зависимости от того, что положения в точках сечения:

+0

Вместо указателей и новых, используйте 'std :: vector' для создания массивов, поскольку это безопаснее и проще. Чтобы избежать дублирования кода, как насчет массива точек отсечения, а не перечислять каждый член отдельно? Затем вы можете пройти через отсечки, пока не найдете правильный. –

+0

@NeilKirk К сожалению, для назначения нам не разрешено использовать векторы. :/Мы должны использовать динамически распределенные массивы. – Alex

+0

что-то подозрительное с getFinalGrade; вы устанавливаете 'finalGrade [j]' внутри цикла, который только видит 'j' один раз. Каждый раз вокруг цикла 'j' вы будете выделять новую память для каждого' students [i] .finalGrade', который потеряет всю память, установленную на предыдущих итерациях цикла j. –

ответ

1

Кажется, две основные проблемы, связанные с этим кодом:

  1. Вы Перебор каждой точки сечения установить внутри outputFinalGrade и внутри цикл, вы вызываете getFinalGrade, который также выполняет итерацию по каждому набору точек (даже если наборы точечных обозначений еще не инициализированы). Возможно, вы захотите изменить getFinalGrade, чтобы принять точку отсечения, и удалить дополнительный внешний цикл.

  2. Вы повторно инициализируете окончательный класс каждой итерацией :) это означает, что каждый раз, когда вы повторяете, вы уничтожаете результаты последней итерации. Это, скорее всего, причина вашей проблемы:

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

Есть несколько способов, чтобы исправить это, перемещающие intialization в другом месте, или просто проверить на NULL перед вызовом нового.

Смежные вопросы