【问题标题】:How to sort struct by grade, and last name alphabetically如何按年级和姓氏字母顺序对结构进行排序
【发布时间】:2015-12-15 04:55:25
【问题描述】:

我有这个程序需要能够按字母等级对这个输入文件进行排序,每个都用制表符分隔。

Casanova        910017  A
Smith   934422  C
Jones   878766  B
Briggs  123456  D
Anderson        989420  A

但如果成绩相同,则需要按姓氏字母顺序排序。

Anderson        989420  A
Casanova        910017  A
Jones   878766  B
Smith   934422  C
Briggs  123456  D

我只是不知道该怎么做。 我尝试了其他几种我发现的算法,但都失败了,因为程序只在列表中显示了名字两次。

for(i = 1; i < 14; i++)
{
     j = i - 1;
     while( j >= 0 && strcmp( stu[j+1].last_name, stu[j].last_name ) < 0 )
     {
         temp =  stu[j + 1];
         stu[j+1] = stu[j];
         stu[j] = temp;
         j--;
     }
     printf("\n%s\n",stu[j].last_name);
}

展示

Casanova

Casanova

/

struct student
{
        char last_name[25];
        int stu_id;
        char grade;
}a;
struct student temp, stu[100];

int main(void)
{
     int n, i, cnt = 0;
     char *name, *id, *grd,fgrade, data[2000];
     int iid;
     void *v;
     while(!(fgets(data, 2000, stdin) == NULL))
     {

          name = strtok(data, "\t");
          strcpy(stu[cnt].last_name, name);

          id = strtok(NULL, "\t");
          iid = atoi(id);
          stu[cnt].stu_id = iid;

          grd = strtok(NULL, "\n");
          v = grd;
          fgrade = *((char*) v);
          //printf("%c\n", stu[cnt].last_name[0]);
          stu[cnt].grade = fgrade;

          //printf("\n%s %s %s cnt: %d last_nam = %s\n", name, id, grd, cnt, stu[cnt].last_name);
          ++cnt;
    }
}

我在考虑一个 qsort,但我以前从未使用过。 输出需要按以下顺序:

    Anderson        989420  A
    Casanova        910017  A
    Jones   878766  B
    Smith   934422  C
    Briggs  123456  D

【问题讨论】:

  • 我在考虑一个 qsort,但我以前从未使用过。 你在正确的轨道上。在网上查找使用qsort 的示例。这并不难。
  • 我建议您学习sorting algorithms 并了解它们的工作原理。

标签: c sorting numbers alphabetical alphabetical-sort


【解决方案1】:

试试这个:

typedef struct 
{
        char last_name[25];
        int stu_id;
        char grade;
} student;

student input[5] = {
 {"Casanova",910017,'A'},
 {"Smith",934422,'C'},
 {"Jones",878766,'B'},
 {"Briggs",123456,'D'},
 {"Anderson",989420,'A'}
};

static int cmpstudents(const void *p1, const void *p2)
{
    student *l = (student *)p1;
    student *r = (student *)p2;
    if (l->grade==r->grade)
    {
        return strcmp(l->last_name,r->last_name);
    }
    return (l->grade > r->grade)?(1):(-1);
}

int main ()
{
    int i;
    for (i=0;i<5;i++)
    {
       printf("%s\t%d\t%c\n",input[i].last_name,input[i].stu_id,input[i].grade);
    }
    printf("\n----------------------------\n");
    qsort(input,5,sizeof(student),cmpstudents);
    for (i=0;i<5;i++)
    {
       printf("%s\t%d\t%c\n",input[i].last_name,input[i].stu_id,input[i].grade);
    }

    return 0;
}

关键是给qsort()提供你自己的比较函数。 cmpstudents() 会在同级的情况下比较name。

【讨论】:

    猜你喜欢
    • 2020-09-10
    • 2010-10-26
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    相关资源
    最近更新 更多