输入格式:
每个测试输入包含 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
实现步骤:
解题一:
- 首先要找个东西把数据装进去
- 再遍历全部成绩找到最大和最小的(不知道有什么简单的算法可以更快的找到)
解题二:
- 核心思想:在用户输入数据的时候同时判断其成绩的大小(就不需要遍历输出)
- 设置最大与最小数,最大数从0开始,遇到比它大的数就取代0(这里没有必要用-1,那会多走一步),最小数同理
- 将其拷贝进数组当中,最后输出结果
遇到的问题:
- 想打印两个字符串和一个数字,结果中间的字符串不显示出来
- 关于输出与输入的理解不到位
- 代码还是有些问题
代码:
#include<stdio.h>
#include<string.h>
struct stu_inf{
char name[10];
char num[20];
short score;
};
int main(void) {
// 用作输出的两个结构体变量
struct stu_inf s_max, s_min;
// 判断用的最大和最小数
short num_max = 0;
short num_min = 100;
// 即将输入的个数
int input_num = 0;
// 输入的缓存数据
char stu_name[10];
char stu_num[20];
int stu_score;
scanf("%d", &input_num);
for (int i = 0; i < input_num; i++) {
scanf("%s %s %d", stu_name, stu_num, &stu_score);
if (stu_score > num_max) {
num_max = stu_score;
strcpy(s_max.name,stu_name);
strcpy(s_max.num, stu_num);
}
if (stu_score < num_min) {
num_min = stu_score;
strcpy(s_min.name,stu_name);
strcpy(s_min.num, stu_num);
}
}
printf("%s %s\n", s_max.name, s_max.num);
printf("%s %s", s_min.name, s_min.num);
}
有一个测试点错了,感谢大家的修改!