读入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 CS991301Joe Math990112
#include "iostream" using namespace std; typedef struct student //定义一个包好学生姓名,学号,分数的结构体 { char name[11]; char num[11]; int score; }Student; int main() { int n, first = 0, last = 0; cin >> n; Student *stu = new Student[n];//申请n个结构体的空间 for (int i = 0; i < n; i++) { cin >> stu[i].name >> stu[i].num >> stu[i].score; } if (n == 1) { cout << stu[0].name << " " << stu[0].num << endl; cout << stu[0].name << " " << stu[0].num << endl; } else { for (int i = 1; i<n; i++) { if (stu[first].score<stu[i].score) //判断最高分数 { first = i; } if (stu[last].score>stu[i].score){//判断最低分数 last = i; } } cout << stu[first].name << " " << stu[first].num << endl; cout << stu[last].name << " " << stu[last].num<< endl; } return 0; }
Adeng :题目中有明确要求要保证输入的学生成绩中不能出现相同的,所以我一开始的思路是将学生的成绩录入一个数组并判断是否有重复,然后再进行排序,输出最低最高分所对应的学号与姓名吗,然调试了很久没有成功。最后采用上面的方法判定最低最高分,虽然相对来说简单了不少,但是它并灭有检查成绩重复的功能,好在平台上能运行过去。
#include<stdio.h> #include<string.h> struct student { char name[20]; char number[20]; int score; }; int main() { int n=0,i; struct student input,first,last; input =(struct student){"a","b",0}; first =(struct student){"a","b",0}; last = (struct student){"a","b",100}; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%s %s %d",&input.name,&input.number,&input.score); if(input.score>=first.score) { first=input; } if(input.score<=last.score) { last=input; } } printf ("%s %s\n",first.name,first.number); printf ("%s %s\n",last.name,last.number); return 0; }
Adng:上面的设计思路更直接,只需要定义三个结构体,一个用来接收新的输入,一个储存目前最高分另一个储存最低分的信息。