如何使用 qsort 对结构(由几个不同的元素组成)进行排序?
How do I sort structures (consisting of several different elements) using qsort?
特别是关于 .txt 文件中的列表,"char Name"(jmeno) "char Surname"(prijmeni) "float Average"(prumer) --> 学生的平均成绩 ( 1-5年级),按平均数用qsort排序。
到目前为止我的代码如下所示:
FILE *otevriSoubor(char *jmeno, char* mode)
{
FILE *soubor;
soubor = fopen(jmeno, mode);
if (!soubor)
{
printf("spatne jmeno souboru\n");
system("PAUSE");
exit(1);
}
return soubor;
}
int srovnaniprumeru(const void *a, const void *b)
{
int c = ((Student *) a)->prumer;
int d = ((Student *) b)->prumer;
if (c > d) return -1;
if (c < d) return 1;
return 0;
}
int main(void)
{
typedef struct
{
char jmeno[MAXDELKA];
char prijmeni[MAXDELKA];
float prumer;
} Student;
qsort(bakaweb, 5, sizeof(Student), srovnaniprumeru);
system("PAUSE");
return 0;
}
你走在正确的轨道上。以下是需要改进的地方:
您的代码不完整:您没有阅读学生详细信息。您可以为此使用 fscanf()
。
您根据成绩转换为 int
进行排序。如果成绩不是整数,这可能不正确。
以这种方式完成您的代码并修复您的排序功能:
int srovnaniprumeru(const void *a, const void *b) {
float c = ((const Student *)a)->prumer;
float d = ((const Student *)b)->prumer;
if (c > d) return -1;
if (c < d) return 1;
return 0;
}
特别是关于 .txt 文件中的列表,"char Name"(jmeno) "char Surname"(prijmeni) "float Average"(prumer) --> 学生的平均成绩 ( 1-5年级),按平均数用qsort排序。
到目前为止我的代码如下所示:
FILE *otevriSoubor(char *jmeno, char* mode)
{
FILE *soubor;
soubor = fopen(jmeno, mode);
if (!soubor)
{
printf("spatne jmeno souboru\n");
system("PAUSE");
exit(1);
}
return soubor;
}
int srovnaniprumeru(const void *a, const void *b)
{
int c = ((Student *) a)->prumer;
int d = ((Student *) b)->prumer;
if (c > d) return -1;
if (c < d) return 1;
return 0;
}
int main(void)
{
typedef struct
{
char jmeno[MAXDELKA];
char prijmeni[MAXDELKA];
float prumer;
} Student;
qsort(bakaweb, 5, sizeof(Student), srovnaniprumeru);
system("PAUSE");
return 0;
}
你走在正确的轨道上。以下是需要改进的地方:
您的代码不完整:您没有阅读学生详细信息。您可以为此使用
fscanf()
。您根据成绩转换为
int
进行排序。如果成绩不是整数,这可能不正确。
以这种方式完成您的代码并修复您的排序功能:
int srovnaniprumeru(const void *a, const void *b) {
float c = ((const Student *)a)->prumer;
float d = ((const Student *)b)->prumer;
if (c > d) return -1;
if (c < d) return 1;
return 0;
}