C语言 关于排序的问题
答案:2 悬赏:60 手机版
解决时间 2021-05-01 07:03
- 提问者网友:鐵馬踏冰河
- 2021-04-30 20:46
#include<stdio.h>
#define SIZE 3
typedef struct
{
char name[8];
float math;
float chinese;
float english;
float sum;
float average;
}sden;
void fun(sden *);
void main(void)
{
sden studen[SIZE];
for(int i=0;i<SIZE;++i){
printf("请输入第%d个学生的姓名及数学、中文、英文三门课程的成绩:\n",i+1);
scanf("%s%f%f%f",studen[i].name,&studen[i].math,&studen[i].chinese,&studen[i].english);
}
printf("\n\n姓 名\t数 学\t中 文\t英 文\t总 分\t平均分\n");
for(int j=0;j<SIZE;++j){
fun(&studen[j]);
printf("%s\t%.1f\t%.1f\t%.1f\t%.1f\t%.2f\n",studen[j].name,studen[j].math,studen[j].chinese,studen[j].english,studen[j].sum,studen[j].average);
}
}
void fun(sden *p)
{
p->sum=(p->chinese)+(p->english)+(p->math);
p->average=p->sum/3;
}
这里输出时不能按总分从高到低的来排序。
请问:
1、如何实现按总分从高到低的方式,将他们输出。
2、如何实现升降序排序,即想升序时按升序排,想降序时也能按降序排,如果没有指定就按输入的顺序输出?
最佳答案
- 五星知识达人网友:洎扰庸人
- 2021-04-30 21:22
//因为你还没有对sum排序啊!怎么会按你的预想输出呢?
#include<stdio.h>
#define SIZE 5
typedef struct
{
char name[8];
float math;
float chinese;
float english;
float sum;
float average;
}sden;
void fun(sden *);
void main(void)
{
int i , j ;
sden studen[SIZE];
for( i=0;i<SIZE;++i)
{
printf("请输入第%d个学生的姓名及数学、中文、英文三门课程的成绩:\n",i+1);
scanf("%s%f%f%f",studen[i].name,&studen[i].math,&studen[i].chinese,&studen[i].english);
}
for( j = 0 ; j < SIZE ; ++ j )
fun(&studen[j]); //计算sum
for( i= 0 ; i < SIZE-1 ; ++ i )
for( j = 1 ; j < SIZE ; ++ j )
{
if(studen[j-1 ].sum > studen[j].sum )//这里我先把studen[SIZE]按降序排列好,若按升序输出即倒序输出即可。
{
sden t = studen[j] ;
studen[j] = studen[j-1] ;
studen[j -1 ] = t ;
}
}
printf("\n按成绩低到高输出");
printf("\n\n姓 名\t数 学\t中 文\t英 文\t总 分\t平均分\n");
for( j=0;j<SIZE;++j)
{
printf("%s\t%.1f\t%.1f\t%.1f\t%.1f\t%.2f\n",studen[j].name,studen[j].math,studen[j].chinese,
studen[j].english,studen[j].sum,studen[j].average);
}
printf("\n\n按成绩高到底输出 ");
printf("\n\n姓 名\t数 学\t中 文\t英 文\t总 分\t平均分\n");
for( j=SIZE-1;j>=0;--j)
{
printf("%s\t%.1f\t%.1f\t%.1f\t%.1f\t%.2f\n",studen[j].name,studen[j].math,studen[j].chinese,
studen[j].english,studen[j].sum,studen[j].average);
}
//如果没有指定就按studen[SIZE]数组顺序输出啊,sum没有顺序的。
}
void fun(sden *p)
{
p->sum=(p->chinese)+(p->english)+(p->math);
p->average=p->sum/3.0;
}
全部回答
- 1楼网友:未来江山和你
- 2021-04-30 22:37
貌似你的代码里就没有排序的代码- -
给你写个
void sort( sden* a, int n ) // 结构体数组 | 数组长度
{
int i, j;
sden tmp;
for ( i = 0; i < n; ++i )
for ( j = n-1; j > i; --j )
if ( a[j].average < a[j-1].average ) {
memcpy( &tmp, &a[j], sizeof( sden ) );
memcpy( &a[j], &a[j-1], sizeof( sden ) );
memcpy( &a[j-1], &tmp, sizeof( sden ) );
}
}
这是按平均分升序排序
如果要降序,将
if ( a[j].average < a[j-1].average ) {
改成
if ( a[j].average > a[j-1].average ) {
即可
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯