#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef struct Student
{
char nume[20];
int grupa,nr_credite;
} S;
int cmpg(const void *a, const void *b);
int cmpc(const void *a, const void *b);
void ex();
int main()
{
ex(); //main program
return(0);
}
void ex() //sorting function
{
int n,i,c;
S st[100];
scanf("%d", &n);
for(i=0; i<n; i++)
scanf("%s %d %d", st[i].nume, &st[i].grupa, &st[i].nr_credite);
size_t no = sizeof(S)/sizeof(st->grupa);
size_t noo = sizeof(S)/sizeof(st->nr_credite);
qsort(st->grupa, no, sizeof(S), cmpg);
qsort(st->grupa, noo, sizeof(S), cmpc);
for(i=0; i<n; i++)
printf("%s %d %d", st[i].nume, &st[i].grupa, &st[i].nr_credite);
}
int cmpg(const void *a, const void *b)
{
struct Student *ia = (struct Student *)a;
struct Student *ib = (struct Student *)b;
return (int)(ia->grupa - ib->grupa);
}
int cmpc(const void *a, const void *b)
{
struct Student *ia = (struct Student *)a;
struct Student *ib = (struct Student *)b;
return (int)(ib->nr_credite - ia->nr_credite);
}
所以问题是我在一些不同的小组中有一些学生,他们有不同的学分。我想使用qsort按组(升序)和每组内部对它们进行排序,以按积分数(降序)对它们进行排序。
我有这个代码,但它正在停止使用此退出代码:进程终止,状态为-1073741819(0分钟,11秒)。
答案 0 :(得分:1)
问题来自你的qsort调用。 qsort
期望的是要排序的数组,应排序的元素数,每个元素的大小以及比较函数。所以你需要的是:
qsort(st, n, sizeof(S), cmpg);
qsort(st, n, sizeof(S), cmpc);
你的printf也错了:
for(i=0; i<n; i++)
printf("%s %d %d", st[i].nume, st[i].grupa, st[i].nr_credite);
顺便说一句,你从来没有测试过错的错误:
如评论中所述,这只能解决错误。但由于qsort
不需要是稳定的排序,因此连续两种排序可能无法产生您想要的排序。
答案 1 :(得分:0)
你想要这个:
void ex()
{
int n, i;
S st[100];
scanf("%d", &n);
for (i = 0; i<n; i++)
scanf("%s %d %d", st[i].nume, &st[i].grupa, &st[i].nr_credite);
qsort(st, n, sizeof(S), cmpg);
// ^ ^ ^
// | | |
// | | size of one element
// | |-- number of elements in array
// |-- address of first element of the array
//
qsort(st, n, sizeof(S), cmpc);
for (i = 0; i<n; i++)
printf("%s %d %d\n", st[i].nume, st[i].grupa, st[i].nr_credite); // removed &s
}