学生数据排序


Description

某班 有n个学生(不超过100),每个学生的信息包括学号(long no),姓名(char name[9])和三门课的成绩(int score[4],其中score[0]~score[3]分别用来存放总分,语文,数学和英语的成绩)。

编写程序,录入n个学生的信息,然后按照总分降序排序(如果总分相同的按照学号小的在前),最后输出排序后的学生信息。

注意:main函数已经给定(如下所示)。

           请将程序补充完整。

           提交时只需要提交自己补充的代码部分,不需要提交给定的main函数的代码部分。

#include<stdio.h>

int main()
{
    int n;
    struct student stu[100];
    while(scanf("%d",&n)!=EOF)
    {
        input(stu,n);   //读入n个学生的数据
        sort(stu,n);   //按照总分降序排序,如果总分相同的学号小的在前面
        print(stu,n);   //输出n个学生的信息
    }
    return 0;
}

Input

 包含多组测试数据,每组测试数据第一行包含1个整数n(大于1小于等与100),表示学生人数。接下来的n行为n个学生的详细信息,包括学号,姓名,语文,数学和英语的分数,个数据之间用空格隔开。

Output

 每组测试数据输出占n行,每行输出一个学生的信息。每一行的输出数据依次为:排名,学号,姓名,总分,英文成绩,数学成绩和英语成绩。各部分数据之间用空格隔开。(具体详见样例输出)

Sample Input

5
1001 aaa 54 85 65
1002 bbb 54 65 85
1003 ccc 88 99 99
1004 ddd 35 50 50
1005 eee 99 99 99

 

Sample Output

1 1005 eee 297 99 99 99
2 1003 ccc 286 88 99 99
3 1001 aaa 204 54 85 65
4 1002 bbb 204 54 65 85
5 1004 ddd 135 35 50 50

题目分析:

仔细读题,能读懂这题的意思,一个结构体的好例题。

C语言中结构体的用法:

参考https://blog.csdn.net/eric_e/article/details/79340947

涉及到结构体的互换,需要另外定义一个结构体来交换。(详见代码中的 “ t ” )

我用的冒泡排序(因为不想手打快排,说白了就是懒。。)

打代码的时候一定要仔细……结构体看得眼花……

以下提供完整代码,抄作业是不对的哟~


#include<stdio.h>
struct student
{
	char name[9];
	long no;
	int score[4];
};
void input(struct student stu[100],int n)
{
	int i;
	for(i=1;i<=n;i++)
	{
		scanf("%ld %s %d %d %d",&stu[i].no,&stu[i].name,&stu[i].score[1],&stu[i].score[2],&stu[i].score[3]);
		stu[i].score[0]=stu[i].score[1]+stu[i].score[2]+stu[i].score[3];
	}
	return;
}
void sort(struct student stu[100],int n)
{
	struct student t;
	int i,j;
	for(i=1;i<=n;i++)
		for(j=i+1;j<=n;j++)
		{
			if(stu[i].score[0]<stu[j].score[0] || stu[i].score[0]==stu[j].score[0] && stu[i].no>stu[j].no)
			{
				t=stu[i];
				stu[i]=stu[j];
				stu[j]=t;
			}
		}
	return;
}
void print(struct student stu[100],int n)
{
	int i;
	for(i=1;i<=n;i++)
	{
		printf("%d ",i);
		printf("%ld %s %d %d %d %d\n",stu[i].no,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3]);
	}
	return;
}
int main()
{
    int n;
    struct student stu[100];
    while(scanf("%d",&n)!=EOF)
    {
        input(stu,n);   //读入n个学生的数据
        sort(stu,n);   //按照总分降序排序,如果总分相同的学号小的在前面
        print(stu,n);   //输出n个学生的信息
    }
    return 0;
}