我有这个程序需要能够按字母等级对这个输入文件进行排序,每个文件由一个标签分隔。
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
答案 0 :(得分: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()将比较名称。