C_北理工乐学_结构

C_北理工乐学_结构

58. 学生成绩排序

/* 如果有优化方案评论我啊 */
/为什么代码没有高亮?/

大家参加了期末考试,成绩出来后老师要对 n 个学生进行成绩汇总和排序。要求程序按成绩降序进行排序。在排序过程中对于成绩相同的学生,要按照输入数据的顺序进行排列。例如:有5名学生的成绩:
zhang1,90
zhang2,91
zhang3,99
zhang4,91
zhang5,98

则排序结果应该为:
zhang3,99
zhang5,98
zhang2,91
zhang4,91
zhang1,90

>请注意例题中“zhang2”和“zhang4”的排列顺序。

输入:
第一行为将要输入的学生数量n
从第二行起后面连续 n 行数据,每行为一名学生的姓名(长度不超过20个字符,不包括空格),考试成绩(int)

输出:
排序后的结果。每行为一名学生的姓名和成绩。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
	int num;
	int i,j,t=0;
	char inf[10000];
    int m[100];
    int temp;
    int flag;
	struct o
	{
		char name[1000];
		int score;
		int no;
	}student[100];
	/*输入学生个数*/
	scanf("%d",&num);  
	for(i=0;i<num;i++)
	{   student[i].no=i;     //标记序号
	     t=0;
	     flag=0;
		scanf("%s",inf);
		/*输入姓名*/
		for(j=0;inf[j]!=',';j++)
		{
		student[i].name[j]=inf[j];
	    }
	    student[i].name[j]='\0';    //添加姓名尾标
	    /*输入成绩*/
	    for(j++;inf[j]!='\0';j++)
	    {
	    	m[t]=inf[j]-'0';
	    	t++;
		}
		student[i].score=0;
		for(j=0;j<t;j++)
		student[i].score=m[j]*pow(10,t-j-1)+student[i].score;  //计算成绩
	}
	/*降序排序*/
	for(i=0;i<num;i++)
	for(j=i+1;j<num;j++)
	if(student[i].score<student[j].score&&student[i].no<student[j].no)
	{
	  temp=student[i].no;
	  student[i].no=student[j].no;
	  student[j].no=temp;	
	}
	/*分数相同根据姓名排序*/
	/*因为玄学把单独拿出来,否则测试用例1错误*/
	for(i=0;i<num;i++)
	for(j=i+1;j<num;j++)
    if(student[i].score==student[j].score)
      {
	  for(t=0;student[j].name[t]!='\0'&&student[i].name[t]!='0';t++)
      if(student[j].name[t]>student[i].name[t]&&student[j].no<student[i].no)
      {
      	temp=student[i].no;
	  student[i].no=student[j].no;
	  student[j].no=temp;	
	
	  }
     }
	/*输出*/
	for(i=0;i<num;i++)
	for(j=0;j<num;j++)
	if(student[j].no==i)
	{
		for(t=0;student[j].name[t]!='\0';t++)
		printf("%c",student[j].name[t]);
		printf(",");
		printf("%d\n",student[j].score);
	}
}

C_北理工乐学_结构