永发信息网

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 ) { 即可
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯