成绩排序 - 华科

桃扇骨 2023-07-20 15:57 143阅读 0赞

题目描述:

有N个学生的数据,将学生数据按成绩从低到高排序,如果成绩相同则按姓名字符的字典序排序,如果姓名的字典序也相同则按照学生的年龄从小到大排序,并输出N个学生排序后的信息。

题目要求:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NpbW9uczI0_size_16_color_FFFFFF_t_70

分析:

当前一个数据需要和前面数据进行位置交换时,需要满足的条件(条件为并列关系,满足其中一项即可):

  1. 数据s[i-1]比数据s[i]的成绩要小 s[i-1].grade<s[i].grade

2.数据s[i-1]成绩和数据s[i]一样,数据s[i-1]的名字和s[i]逐个比较字符,如果遇到s[i-1]比s[i]大的字符,则交换。用strcmp函数:

两个字符串自左向右逐个字符相比(按 ASCII 值大小相比较),直到出现不同的字符或遇 \0 为止。

  1. 数据s[i-1]成绩和数据s[i]一样,名字也一样。则比较年纪。若s[i-1].age>s[i].age则交换。

条件判断语句:

  1. if(s[j-1].grade>s[j].grade||
  2. (s[j-1].grade==s[j].grade&&(strcmp(s[j-1].name,s[j].name)>0))||
  3. (s[j-1].grade==s[j].grade&&strcmp(s[j-1].name,s[j].name)==0&&s[j-1].age>s[j].age))
  4. {
  5. StudentGrade tmp=s[j-1];
  6. s[j-1]=s[j];
  7. s[j]=tmp;
  8. flag=1;
  9. }

代码:

  1. #include<stdio.h>
  2. /**
  3. 有N个学生的数据,将学生数据按成绩从低到高排序,
  4. 如果成绩相同则按姓名字符的字典序排序,
  5. 如果姓名的字典序也相同则按照学生的年龄从小到大排序,
  6. 并输出N个学生排序后的信息。
  7. **/
  8. #define N1 100 // 姓名
  9. #define N 1000 // 学生人数
  10. typedef struct
  11. {
  12. char name[N1];
  13. int age;
  14. int grade;
  15. }StudentGrade;
  16. //冒泡排序
  17. void bubblesort(StudentGrade s[],int n){
  18. int flag;
  19. for(int i=0;i<n-1;i++){
  20. flag=0;
  21. for(int j=n-1;j>i;j--){
  22. if(s[j-1].grade>s[j].grade||
  23. (s[j-1].grade==s[j].grade&&(strcmp(s[j-1].name,s[j].name)>0))||
  24. (s[j-1].grade==s[j].grade&&strcmp(s[j-1].name,s[j].name)==0&&s[j-1].age>s[j].age))
  25. {
  26. StudentGrade tmp=s[j-1];
  27. s[j-1]=s[j];
  28. s[j]=tmp;
  29. flag=1;
  30. }
  31. }
  32. if(flag==0)break;
  33. }
  34. }
  35. int main()
  36. {
  37. int n=0;
  38. StudentGrade gradeTable[N];
  39. while(scanf("%d", &n)!=EOF)
  40. {
  41. for(int i=0; i<n; i++)
  42. {
  43. scanf("%s %d %d", gradeTable[i].name, &gradeTable[i].age, &gradeTable[i].grade);
  44. }
  45. bubblesort(gradeTable, n);
  46. for(int i=0; i<n; i++)
  47. {
  48. printf("%s ", gradeTable[i].name);
  49. printf("%d ", gradeTable[i].age);
  50. printf("%d\n", gradeTable[i].grade);
  51. }
  52. }
  53. return 0;
  54. }

发表评论

表情:
评论列表 (有 0 条评论,143人围观)

还没有评论,来说两句吧...

相关阅读

    相关 成绩排序 -

    题目描述: 有N个学生的数据,将学生数据按成绩从低到高排序,如果成绩相同则按姓名字符的字典序排序,如果姓名的字典序也相同则按照学生的年龄从小到大排序,并输出N个学生排序后的信

    相关 成绩排序

    题目: 有 N 个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名 字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出 N

    相关 2019复试机试题

          华科机试时,草稿纸是禁止带出机房的,所以机试题目都是回忆版,可能和实际有些差别,不过影响不大       3月16日早上8点-9:30进行复试机试,总体而言,机试

    相关 190506 | 成绩排序

    想好好准备夏令营机试,以及巩固自己忘得差不多的基础算法,今天起开始每天三道刷题打卡,愿自己能从手生到敲代码飞到溜的转变。 -------------------- 题目描述

    相关 190515 | 成绩排序

    题目描述 用一维数组存储学号和成绩,然后,按成绩排序输出。 输入描述: 输入第一行包括一个整数N(1<=N<=100),代表学生的个数。 接下来的N行每行包括两个整