注意事项:
分配足够的内存空间

char name[101]!!!  100会只得50分
参考代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct student {
  char name[101];
  int age;
  int score;
};

int main() {
    int n;
  while (scanf("%d", &n) != EOF) {
    struct student *p;
    p = (struct student *)malloc(n * sizeof(struct student)); // 分配足够的内存空间

    for (int i = 0; i < n; i++) {
      scanf("%s %d %d", p[i].name, &p[i].age, &p[i].score);
    }

    // 冒泡排序算法
    for (int i = 0; i < n - 1; i++) {
      int swapped = 0; // 用于标记是否发生了交换
      for (int j = 0; j < n - i - 1; j++) {
        if (p[j].score > p[j + 1].score) {
          struct student temp = p[j];
          p[j] = p[j + 1];
          p[j + 1] = temp;
          swapped = 1; // 设置交换标志
        } else if (p[j].score == p[j + 1].score) {
          if (strcmp(p[j].name, p[j + 1].name) > 0) { // 使用 strcmp 比较字符串
            struct student temp0 = p[j];
            p[j] = p[j + 1];
            p[j + 1] = temp0;
            swapped = 1; // 设置交换标志
          } else if (strcmp(p[j].name, p[j + 1].name) == 0) {
            if (p[j].age > p[j + 1].age) { // 比较年龄
              struct student temp0 = p[j];
              p[j] = p[j + 1];
              p[j + 1] = temp0;
              swapped = 1; // 设置交换标志
            }
          }
        }
      }
      // 如果没有发生交换,则表示已经排序完成,跳出循环
      if (!swapped)
        break;
    }


    for (int i = 0; i < n; i++) {
      printf("%s %d %d\n", p[i].name, p[i].age, p[i].score);
    }

    free(p);
  }

  return 0;
}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论