C++ 如何使用qsort对结构(由几个不同的元素组成)进行排序?

C++ 如何使用qsort对结构(由几个不同的元素组成)进行排序?,c++,list,sorting,struct,qsort,C++,List,Sorting,Struct,Qsort,具体来说,它是关于.txt文件中的一个列表,“char Name”(jmeno)“char姓氏”(prijmeni)“float Average”(普鲁默)-->学生的平均成绩(1-5级),根据平均成绩按qsort排序 到目前为止,我的代码如下所示: FILE *otevriSoubor(char *jmeno, char* mode) { FILE *soubor; soubor = fopen(jmeno, mode); if (!soubor) {

具体来说,它是关于.txt文件中的一个列表,“char Name”(jmeno)“char姓氏”(prijmeni)“float Average”(普鲁默)-->学生的平均成绩(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;
}
FILE*otevriSoubor(char*jmeno,char*模式)
{
文件*soubor;
soubor=fopen(jmeno,模式);
如果(!soubor)
{
printf(“斯帕坦·杰梅诺·苏博鲁”);
系统(“暂停”);
出口(1);
}
返回苏博尔;
}
int srovnaniprumeru(常数无效*a,常数无效*b)
{
INTC=((学生*)a)->prumer;
intd=((学生*)b)->prumer;
如果(c>d)返回-1;
如果(c
您走在正确的轨道上。以下是需要改进的地方:

  • 您的代码不完整:您没有阅读学生详细信息。您可以使用
    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;
}
int srovnaniprumeru(常数无效*a,常数无效*b){
浮点数c=((const Student*)a)->prumer;
浮点数d=((常量学生*)b)->prumer;
如果(c>d)返回-1;
如果(c
您走在正确的轨道上。以下是需要改进的地方:

  • 您的代码不完整:您没有阅读学生详细信息。您可以使用
    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;
}
int srovnaniprumeru(常数无效*a,常数无效*b){
浮点数c=((const Student*)a)->prumer;
浮点数d=((常量学生*)b)->prumer;
如果(c>d)返回-1;
如果(cC++中的首选代码> STD::排序< /COD>而不是<代码> qSoS> <代码>。不需要<代码> TyBuffsStuts{}};代码>技巧<代码>结构名称{…}行为。由于您标记为C++,所以宁愿使用<代码> STD::String < /C> >代替 char 数组。此外,由于学生< /C> >在<代码>主< <代码>之外的函数中使用,所以应该将 Stutt定义移到使用它的第一个函数之前。(或者更好,把它放在一个单独的头文件中).ToMasMatthWues是自动的。编译器在自动地嵌入小函数,但是在这种情况下,它甚至不重要:打开文件不是一个性能关键的操作。在C++中,喜欢<代码> STD::排序< /COD>而不是<代码> QSORT 。并且不需要<代码> TyBuffFrxt{{}}名称:<代码>结构> {…};< /COD>执行该行为。由于您标记为C++,所以宁愿使用<代码> STD::String < /C> >代替 char 数组。此外,由于学生< /C> >在主< <代码>之外的函数中使用,您应该将 Stutt定义移到使用它的第一个函数之前。(或者更好,把它放在一个单独的头文件中)。@ThomasMatthews这很愚蠢。编译器会自动内联小函数,但在这种情况下,它甚至都不重要:打开文件不是一个性能关键的操作。