Question:
读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入格式:
每个测试输入包含 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
解题思路:
问题的关键是比较学生成绩,通过成绩大小来输出答案。所以需要将学生成绩与学生信息进行关联。以下是三种解决问题的思维。
1.因此可以将这些信息定义为一个类,实例化学生对象,通过成绩属性来判断成绩。
2.通过数组下标映射关联学生属性,例如姓名数组,学号数组,成绩数组。比较成绩数组之后,通过下标映射关系来找出需要的信息。
3.直接用字符串存储学生的全部信息,通过对字符串的解析来get成绩最高学生的字符串信息和成绩最低的字符串信息。
我的方法是根据第三种思路来解决问题的,具体的思路如下:
因为输入的格式是一行一行的字符串,并且学生信息由空格隔开,因此可以将每一行的学生字符串信息拆解为一个字符串数组【split方法】,从而得到学生的具体信息。
初始化一个最最低学生信息成绩以及一个最高学生信息成绩,都以输入学生信息的第一行为标准
继续输入学生信息,并获取当前输入的学生成绩,与最高成绩和最低成绩作比较,若大于最高成绩则更新最高成绩和学生信息。若低于最低成绩,则更新最低成绩和最低成绩学生信息。
package PATC4;
import java.util.Scanner;
public class Main {
String name;
String id;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//实例化最高成绩学生信息与最低成绩学生
Main best_stu=new Main();
Main worst_stu=new Main();
//最高成绩与最低成绩初始化【读入第一行输入数据】
int stu_num=Integer.parseInt(sc.nextLine());
String init_info=sc.nextLine();
String[] init_info_stu =init_info.split(" ");
int worst_score=Integer.parseInt(init_info_stu[2]);
int best_score=Integer.parseInt(init_info_stu[2]);
//最高成绩学生信息与最低学生信息初始化
best_stu.name=init_info_stu[0];
best_stu.id=init_info_stu[1];
worst_stu.name=init_info_stu[0];
worst_stu.id=init_info_stu[1];
//读入其余输入信息
for(int i=1;i<stu_num;i++)
{
String info=sc.nextLine();
String[] split = info.split(" ");
//获取当前行学生成绩
int score = Integer.parseInt(split[2]);
//与最高学生成绩和最低学生成绩作比较,并且更新学生信息
//若当前分数高于最高分数,则更新最高分数和最高分数学生信息
if(score>=best_score)
{
best_stu.name=split[0];
best_stu.id=split[1];
best_score=score;
}
//若当前分数低于最低分数,则更新最低分数和最低分数学生信息
if(score<=worst_score)
{
worst_stu.name=split[0];
worst_stu.id=split[1];
worst_score=score;
}
}
//输出最高学生信息和最低学生信息
System.out.println(best_stu.name+" "+best_stu.id);
System.out.println(worst_stu.name+" "+worst_stu.id);
}
}