Как сортировать структуры используя qsort?
Мне нужно написать программу которая принимает данные студентов и их оценок по трем предметам. И затем используя qsort отсортировать их по сумме оценок за три предмета. Если сумма 2-х учеников одинаковая, то оставить их в том же порядке. Прошу Вас, помоогите разобраться с qsort. Заранее благодарю!
using namespace std;
typedef struct {
string name;
int Chinese;
int Math;
int English;
}Student;
int compare(const void* p1, const void* p2) {
int s1=p1->Chinese+p1->Math+p1->English;
int s2=p2->Chinese+p2->Math+p2->English;
return s1-s2;
}
int main() {
int NumberOfStudents;
cin>>NumberOfStudents;
Student students[NumberOfStudents];
for(int i=0;i<NumberOfStudents;i++){
cin>>students[i].name>>students[i].Chinese>>students[i].Math>>students[i].English;}
qsort(*students, NumberOfStudents, sizeof(*students), compare);
// TODO: print result
return 0;
}
Ответы (1 шт):
Т.к. p1 и p2 - указатели на структуру, то обращение к её компонентам будет осуществляться через ->. Также следует выполнить приведение указателя void* к конкретному типу указателя на структуру Student*:
int comp(const void* p1, const void* p2){
int s1 = ((Student*)p1)->Chinese + ((Student*)p1)->Math + ((Student*)p1)->English;
int s2 = ((Student*)p2)->Chinese + ((Student*)p2)->Math + ((Student*)p2)->English;
return s1 - s2;
}
В функции qsort первым параметром передаётся ссылка на массив (students), а не первый его элемент. Третьим параметром является размер передаваемых элементов массива (в данном случае структуры) - sizeof(*students) или sizeof(Student). Информация о функции быстрой сортировки.
В начале главного файла вы создаёте статический массив, количество элементов которого принимаете из потока ввода. Лучше создать динамический массив и освободить память после его использования.
Student *students = new Student[NumberOfStudents]; //выделение памяти
//программа
delete [] students; //освобождение памяти
Помимо qsort в библиотеке <algorithm> описана другая функция сортировки sort,которая позволяет сортировать STL контейнеры и массивы:
sort(students, students + NumberOfStudents,
[](const Student &p1, const Student &p2){
int s1 = p1.Chinese + p1.Math + p1. English;
int s2 = p2.Chinese + p2.Math + p2. English;
return s1 > s2; //сравнение
});
Подробнее о функции sort здесь.