描述:
输入格式:
每个测试输入包含 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<stdlib.h>
struct student{
char name[20];
char num[20];
int grade;
};
int main()
{
//分配空间并存储输入的值
int n_stu;
scanf("%d", &n_stu);
struct student** students = (struct student**)malloc(sizeof(struct student*) * n_stu);
for (int i = 0; i < n_stu; ++i){
students[i] = (struct student*)malloc(sizeof(struct student));
scanf("%s %s %d", students[i]->name, students[i]->num, &(students[i]->grade));
}
//创建用于记录分数最大和最小的学生的结构指针并将其指向输入的第一个对象
struct student* min = students[0];
struct student* max = students[0];
//比较得出分数最大和分数最小的学生
for (int i = 1; i < n_stu; ++i){
if (students[i]->grade > max->grade)
max = students[i];
if (students[i]->grade < min->grade)
min = students[i];
}
//输出
printf("%s %s\n", max->name, max->num);
printf("%s %s\n", min->name, min->num);
return 0;
}
总结
总体来说题目较为简单,需要注意的是你是用结构指针进行动态的编程,还是使用结构数组进行静态编程,这两种方法取数据的操作有区别。