gpt4 book ai didi

c - 使用 qsort 按字母顺序组织结构体

转载 作者:行者123 更新时间:2023-11-30 15:28:11 24 4
gpt4 key购买 nike

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define ARRAY_MAX 100
#define FNAME 31
#define LNAME 31

typedef int (*compfn)(const void*, const void*);

struct student {

char firstName[FNAME];
char lastName[LNAME];
int quiz1, quiz2 , quiz3, quiz4, mid1, mid2, final;
char letterGrade;
int finalGradePercentage;
};

// Function for Qsort
int compare(struct student *element1, struct student *element2)
{
if ( element1->firstName[0] < element2->firstName[0])
return -1;

else if (element1->firstName[0] > element2->firstName[0])
return 1;

else
return 0;
}


int main(int argc, char *argv[]){


FILE *inputFile, *outputFile;
char buf[100];
char *token;
int count = 0;

inputFile = fopen("/Users/Home/Desktop/input_data.txt", "r");


struct student studentData[ARRAY_MAX];
while (fgets(buf, sizeof(buf), inputFile) != NULL){ //scan through the input file
token = strtok(buf, " ");
strcpy(studentData[count].firstName, token);
token = strtok(NULL, ",");
strcpy(studentData[count].lastName, token);
token = strtok(NULL, ",");
studentData[count].quiz1 = atoi(token);
token = strtok(NULL, ",");
studentData[count].quiz2 = atoi(token);
token = strtok(NULL, ",");
studentData[count].quiz3 = atoi(token);
token = strtok(NULL, ",");
studentData[count].quiz4 = atoi(token);
token = strtok(NULL, ",");
studentData[count].mid1 = atoi(token);
token = strtok(NULL, ",");
studentData[count].mid2 = atoi(token);
token = strtok(NULL, ",");
studentData[count].final= atoi(token);


studentData[count].finalGradePercentage = studentData[count].quiz1 * .10 +studentData[count].quiz2 * .10 + studentData[count].quiz3 * .10 + studentData[count].quiz4 * .10 + studentData[count].mid1 * .20 + studentData[count].mid2 * .15 + studentData[count].final * .25;

if (studentData[count].finalGradePercentage <=100 && studentData[count].finalGradePercentage>=90 )
{
studentData[count].letterGrade = 'A';
}
else if(studentData[count].finalGradePercentage <= 89 && studentData[count].finalGradePercentage >=80)
{
studentData[count].letterGrade = 'B';
}
else if(studentData[count].finalGradePercentage <= 79 && studentData[count].finalGradePercentage >=70)
{
studentData[count].letterGrade = 'C';
}
else if(studentData[count].finalGradePercentage <= 69 && studentData[count].finalGradePercentage >=60)
{
studentData[count].letterGrade = 'D';
}
else if(studentData[count].finalGradePercentage <= 59){
studentData[count].letterGrade = 'F';
}


count++;
}


qsort((void *) &studentData,count,sizeof(struct student),(compfn)compare);


for (int i = 0; i< count; i++) {
char name[62];

sprintf(name, "%s %s", studentData[i].firstName, studentData[i].lastName);
printf("%-20s %c\n", name, studentData[i].letterGrade);

}

fclose(inputFile);
fclose(outputFile);

return 0;
}

大家好我很难按字母顺序组织我的结构。如有任何帮助,我们将不胜感激。这是我到目前为止所拥有的。我认为问题出在比较函数中。但我不确定我是否真的理解 qsort 。任何人都知道一些很好的引用资料来阅读它。

最佳答案

使用现有结构,您仅比较名字的第一个字符。您需要使用 strcmp() 比较字符串,并且考虑到类(class)中可能有两个名为 John 或 Jane 的学生,您可能还想比较姓氏。

int compare(struct student *element1, struct student *element2)
{
if ((rc = strcmp(element1->firstName, element2->firstName)) != 0)
return rc;
return strcmp(element1->lastName, element2->lastName);
}

总的来说,我更喜欢将比较函数编写为:

int compare(const void *v1, const void *v2)
{
const struct student *p1 = (struct student *)v1;
const struct student *p2 = (struct student *)v2;

if ((rc = strcmp(p1->firstName, p2->firstName)) != 0)
return rc;
return strcmp(p1->lastName, p2->lastName);
}

然后,我不必将指针强制转换为 qsort(),因为指向函数的指针与 qsort() 期望的类型相同。实际上,没有太大区别。

另请参阅How to sort an array of structs in C?

关于c - 使用 qsort 按字母顺序组织结构体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26703616/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com