PAT乙级1004(C语言)- 成绩排名 (20)

读入n名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。

输入格式:每个测试输入包含1个测试用例,格式为

  第1行:正整数n
  第2行:第1个学生的姓名 学号 成绩
  第3行:第2个学生的姓名 学号 成绩
  ... ... ...
  第n+1行:第n个学生的姓名 学号 成绩
其中姓名和学号均为不超过10个字符的字符串,成绩为0到100之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。

输出格式:对每个测试用例输出2行,第1行是成绩最高学生的姓名和学号,第2行是成绩最低学生的姓名和学号,字符串间有1空格。

输入样例:
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
输出样例:
Mike CS991301
Joe Math990112
#include<stdio.h>
#include<string.h>
int main() {
  int n, i, score, maxs = -1, mins = 101;
  char maxname[10], maxnumber[10], minname[10], minnumber[10], tname[10], tnumber[10];
  scanf("%d", &n);
  for (i = 0; i<n; i++) {
    scanf("%s %s %d", tname, tnumber, &score);
    if (score>maxs) {
      maxs = score;
      strcpy(maxname, tname);
      strcpy(maxnumber, tnumber);
    }
    if (score<mins) {
      mins = score;
      strcpy(minname, tname);
      strcpy(minnumber, tnumber);
    }
  }
  printf("%s %s\n", maxname, maxnumber);
  printf("%s %s\n", minname, minnumber);
}

### PAT乙级1004题目解析 此题旨在处理输入的学生信息并找出成绩最高和最低的学生。通过结构体来管理学生的信息是一种高效的方法。 #### 结构体定义 为了便于管理和访问学生信息,使用`struct`关键字创建了一个名为`student`的结构体[^4]: ```c struct student { char name[100]; char ID[100]; int score; }; ``` 该结构体包含了三个成员变量:`name`(姓名),`ID`(学号), 和 `score`(分数)。 #### 数据读取与初始化 程序开始时会声明一个数组用于保存所有学生的记录,并接收用户输入的学生数量n以及每位同学的具体资料[^2]: ```c int main() { struct student a[10000]; int n = 0, maxIndex = 0, minIndex = 0; scanf("%d", &n); for (int i = 0; i < n; ++i) { scanf("%s %s %d", a[i].name, a[i].ID, &(a[i].score)); // 初始化最大最小索引位置 if(i == 0 || a[maxIndex].score < a[i].score){ maxIndex = i; } if(i == 0 || a[minIndex].score > a[i].score){ minIndex = i; } } printf("Highest Score:\nName: %s\nID: %s\nScore: %d\n", a[maxIndex].name, a[maxIndex].ID, a[maxIndex].score); printf("Lowest Score:\nName: %s\nID: %s\nScore: %d\n", a[minIndex].name, a[minIndex].ID, a[minIndex].score); return 0; } ``` 上述代码片段展示了如何利用单次遍历完成对学生数据的最大值和最小值查找操作。这里的关键在于每次迭代过程中更新最大/最小学生成绩对应的下标(maxIndex/minIndex)[^5]。 #### 输出结果 最后按照要求打印出具有最高分和最低分的同学的名字及其学籍号码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值