有一串打乱的成绩,现要求你把他们从低到高排列。

有一串打乱的成绩,现要求你把他们从低到高排列。
输入
每一行为姓名和成绩
以#作为输入结束标志
输出
输出排序后的结果

样例输入
LI 95
ZHAO 80
SUN 85
JIN 60
QIAN 70
WANG 90
ZHAN 85
#

样例输出
JIN 60
QIAN 70
ZHAO 80
SUN 85
ZHAN 85
WANG 90
LI 95 
*/

#include <stdio.h>
#include <stdlib.h>
typedef struct Student{                                   

	char name[20];
	float score;
} Student;

int  input(Student *st);                    //定义输入函数
void print(Student *st, int n);                    //定义输出函数
void sort(Student *st, int n); 
                    
int main()
{
	
	Student * stu;                                  //定义结构体指针stu
	int n;
	

	stu = (Student *)malloc(1000 * sizeof(Student)); //为stu分配内存空间
	
	while ((n = input(stu)) != -1)
	{
		sort(stu, n);  //调用排序函数
		print(stu, n); //调用输出函数

	} 
}

int input(Student *st)
{
	int i;
	for (i = 0;; i++)
	{
	
		if(scanf("%s", st[i].name) == EOF)
		{
			return -1;
		}
		
       /* 判断结束符这点,比较讲究,在读入数据时,
应该考虑分别使用(若干个)scanf来读入同一行得不同部分,可以比较灵活得判断 */
		else if (st[i].name[0] != '#')
		{
			scanf("%f", &st[i].score);
		}
		else
		{
			break;
		}
	}
	return i;//读入的items
}
//输出函数
void print(Student *st, int n)
{
	Student *p;
	for (p=st; p<st+n; printf("%s %.0f\n",p->name, p->score), p++);
}
//排序函数
void sort(Student *st, int n)
{
	int i, j;
	Student temp;

	for(i = 0;i < n - 1;i++)
	{
		for(j = 0;j<=n-2-i;j++)
		{
			if(st[j].score > st[j+1].score)/* 或者j<n-1-i,这个容易错.(是否取等号.) */
			{
				temp = st[j];
				st[j] = st[j+1];
				st[j+1] = temp;
			}
		}
	}
}
posted @ 2022-07-26 14:27  xuchaoxin1375  阅读(15)  评论(0)    收藏  举报  来源