关于C语言的排序

来源:百度知道 编辑:UC知道 时间:2024/06/01 22:44:11
strcut stu a[3]定义了一个有学号,数学,英语,成绩,总分,平均分,排名的结构体数组。怎样根据总分,给排名赋值。不要打乱结构体里面的数据
strcut stu a[3]定义了一个有学号,数学,英语,成绩,总分,平均分,排名的结构体。怎样根据总分,给排名赋值。就是不里面对应的数据不变,就是根据总分成绩,排出名次,把名次再赋给排名
strrut stu{
char num[10];
int mt;
int en ;
int sum=mt+en;
float ave=sum/2;
int paiming;
}a[3],*p;

你的意思就是对结构体数据块根据它里面某一项(比如总分)的大小排序,结构体作为一个整体。给你两种方法:
第一种方法:比如总分,你可以开一个数组int total[3]作为a[3].sum(每个人的总分)的副本;每次计算总分a[i].sum后,把它赋给total[i].然后对3个数值total[0]--total[2]排序,设从高到低排序,得到按降序(或升序)排列的总分total[0]--total[2]。再写一个循环
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(a[j].sum==total[i]) /*判断是否相等,相等就输出,起排序作用*/
{a[j].paiming=i+1;/*就是这样,排名从高的第一名到最后一名*/
printf("%d%d%d",a[j].math,a[j].English,a[j].sum);
}
这样就可以按升序或降序打印出排名。
第二种方法:
设一个全局变量order[3],你在每次输入一个学号时给它赋值,即
for(i=0;i<3;i++)
{a[i].math=??;a[i].English=??; ...
order[i]=i;
}
然后再对a[order[i]].sum排序
for(i=0;i<2;i++)
for(j=i+1;j<3;j++)
if(a[order[i]].sum<a[order[j]].sum)/*实现编号的变动*/
{t=order[i];
order[i]=order[j];
order[j]=t;
}
最后:
for(i=0;i<3;i++) /*用不同的编号就实现了排序作用*/
printf("%d%d%d",a[order[i]].math,a[order[i]].English,a[order[i]].sum);

你要上机编程试验。你明白没有?哎,又没有分送我。