有一串打乱的成绩,现要求你把他们从低到高排列。
输入
每一行为姓名和成绩
以#作为输入结束标志
输出
输出排序后的结果
样例输入
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
*/
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;
}
}
}
}