算法训练 P1102
时间限制:1.0s 内存限制:256.0MB
定义一个学生结构体类型student,包括4个字段,姓名、性别、年龄和成绩。然后在主函数中定义一个结构体数组(长度不超过1000),并输入每个元素的值,程序使用冒泡排序法将学生按照成绩从小到大的顺序排序,然后输出排序的结果。 输入格式:第一行是一个整数N(N<1000),表示元素个数;接下来N行每行描述一个元素,姓名、性别都是长度不超过20的字符串,年龄和成绩都是整型。 输出格式:按成绩从小到大输出所有元素,若多个学生成绩相同则成绩相同的同学之间保留原来的输入顺序。 输入: 3 Alice female 18 98 Bob male 19 90 Miller male 17 92 输出: Bob male 19 90 Miller male 17 92 Alice female 18 98
作者注释:自从学会了用结构体排序的方法,这种题目都蛮容易搞定的。
代码一:
1 #include2 #include 3 #include 4 #include 5 #include 6 /*定义一个结构体*/ 7 typedef struct Stu{ 8 char name[30]; 9 char sex[20];10 int age;11 int score;12 }stu;13 /* 定义排序(回调)函数cmp: 14 返回类型必须是int;15 两个参数的类型必须都是const void *;16 如果是升序,那么就是如果a比b大返回一个正值,小则负值,相等返回0;17 */ 18 int cmp(const void *a,const void *b){19 /* *(stu*)a是因为:a是个void *类型,要先20 用(stu*)将它转成stu*类型,然后再用*取值,21 变成stu类型,才能比较大小。*/22 stu c=*(stu*)a;23 stu d=*(stu*)b;24 //按成绩升序排序 25 return c.score-d.score;26 }27 main(){28 int n;29 stu sz[100];30 scanf("%d",&n);31 for(int i=0;i
代码二:
1 #include2 #include 3 //结构体 4 struct student 5 { 6 char name[20]; 7 char sex[10]; 8 int age; 9 int score;10 };11 int main()12 {13 int n;14 scanf("%d",&n);15 student stu[1000];16 for(int i=0;i stu[j].score)24 {25 char str[20];26 strcpy(str,stu[i].name);27 strcpy(stu[i].name,stu[j].name);28 strcpy(stu[j].name,str);29 30 strcpy(str,stu[i].sex);31 strcpy(stu[i].sex,stu[j].sex);32 strcpy(stu[j].sex,str);33 34 int t;35 t=stu[i].score;36 stu[i].score=stu[j].score;37 stu[j].score=t;38 39 t=stu[i].age;40 stu[i].age=stu[j].age;41 stu[j].age=t;42 i=-1;//如果进行了排序那么前面的可能还需排序。 43 }44 }45 for(int i=0;i