结构的qsort

时间:2018-01-18 12:20:59

标签: c

#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秒)。

2 个答案:

答案 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);
顺便说一句,你从来没有测试过错的错误:

  • 如果n> 100,您将获得S
  • 以外的债券访问权限
  • 如果答案中的某个值不正确,您将看到错误,但仍会继续使用不确定的值。

如评论中所述,这只能解决错误。但由于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
}