从键盘中读入最多不超过50个学生的学生信息(包括空格隔开的学号、姓名、年龄)
【输入形式】
每次键盘读入最多不超过50个学生的学生信息:
第一行为学生人数;
后面每一行为空格隔开的学生学号、姓名、年龄,其中学号和年龄是整数。
【输出形式】
分别以姓名顺序(从低到高)和年龄顺序(从低到高)将学生信息输出,每行输出一位学生的信息,其中学号占3位,姓名占6位,年龄占3位。年龄相同时按姓名从低到高排序。两种顺序的输出结果用一行空行相隔。
【输入样例】
4
1 aaa 22
45 bbb 23
54 ddd 20
110 ccc 19
【输出样例】
1 aaa 22
45 bbb 23
110 ccc 19
54 ddd 20
110 ccc 19
54 ddd 20
1 aaa 22
45 bbb 23
【样例说明】
从键盘输入四个学生记录,分别按姓名和年龄排序并输出。
【评分标准】
分别以姓名顺序和年龄顺序输出学生信息
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <stdio.h>
typedef struct stu
{
int num;//学号
char name[20];//姓名
int age;//年龄
}stu;
int main()
{
int n,i,j,p=0;
scanf("%d",&n);//输入学生个数
stu s[50];//用于存放学生的顺序
for(i=0;i<n;i++)
{
scanf("%d %s %d",&s[i].num,s[i].name,&s[i].age);//通过循环输入学生学号,姓名,年龄
}
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
while(1)
{
if(s[i].name[p]>s[j].name[p])//通过三重循环嵌套判断姓名字母大小,然后进行排序
{
stu temp=s[i];
s[i]=s[j];
s[j]=temp;
p=0;
break;//换位之后即刻终止循环
}
else if(s[i].name[p]==s[j].name[p])//如果姓名当前字母相等,p++进入下一个字母的比较
{
p++;
}
else//如果前一个人名字小于后一个人名字......
{
p=0;
break;
}
}
}
}
for(i=0;i<n;i++)
{
printf("%3d%6s%3d\n",s[i].num,s[i].name,s[i].age);
}
printf("\n");
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(s[i].age>s[j].age)//通过双重循环比较年龄大小
{
stu u=s[i];
s[i]=s[j];
s[j]=u;
}
}
}
for(i=0;i<n;i++)
{
printf("%3d%6s%3d\n",s[i].num,s[i].name,s[i].age);
}
return 0;
}