题目:
读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入格式:
每个测试输入包含 1 个测试用例,格式为
第 1 行:正整数 n
第 2 行:第 1 个学生的姓名 学号 成绩
第 3 行:第 2 个学生的姓名 学号 成绩
... ... ...
第 n+1 行:第 n 个学生的姓名 学号 成绩
输出格式:
对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。
思路:
该题考察结构体/类+排序+最大最小值寻找。
C语言代码思路:
定义maxname、maxnum、minname、minnum来记录分数最大值/最小值的名字和学号,这里是遍历每一次输入,如果分数大于当前最大值,则替换maxname/maxnum,如果分数小于当前最小值,则替换minname/minnum。
Java语言代码思路:
定义类Student,然后用Arrays.sort()+自定义排序new Comparator完成按分数的排序,然后输出最后一个学生的名字和学号、第一个学生的名字和学号。
代码:
《C语言版本》
#include<stdio.h>
#include<string.h>
int main(){
int n,max=-1,min=101,score;
scanf("%d",&n);
char maxname[20],minname[20],maxnum[20],minnum[20],name[20],num[20];
for(int i=0;i<n;i++){
scanf("%s %s %d",name,num,&score);
if(score>max){
max=score;
strcpy(maxname,name);
strcpy(maxnum,num);
}
if(score<min){
min=score;
strcpy(minname,name);
strcpy(minnum,num);
}
}
printf("%s %s\n",maxname,maxnum);
printf("%s %s\n",minname,minnum);
}
《Java语言版本》
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
int n = Integer.parseInt(scan.nextLine());
Student[] student = new Student[n];
for(int i = 0;i < n;i++){
String s = scan.nextLine();
String[] info = s.split(" ");
student[i] = new Student();
student[i].setName(info[0]);
student[i].setId(info[1]);
student[i].setScore(Integer.parseInt(info[2]));
}
Arrays.sort(student, new Comparator<Student>(){
public int compare(Student s1,Student s2){
return s1.getScore() - s2.getScore();
}
});
System.out.println(student[n-1].getName() + " " + student[n-1].getId());
System.out.println(student[0].getName() + " " + student[0].getId());
}
}
class Student{
private String name;
private String id;
private int score;
Student(){
}
public String getName(){
return name;
}
public String getId(){
return id;
}
public int getScore(){
return score;
}
public void setName(String name){
this.name = name;
}
public void setId(String id){
this.id = id;
}
public void setScore(int score){
this.score = score;
}
}
总结:
1、这题是查找元素问题。关键在于字符串的赋值,要使用strcpy()函数讲字符串复制,同时要注意复制包括“\0”,则定义的字符数组空间应该大一些。
2、在寻找最大最小值的位置时,是分开寻找的,是两个if语句,而不是if、elseif语句!
3、Student[] student = new Student[n]只是创建数组,并没有创建类对象,所以要在每次循环中对student[i] = new Student()创建对象,才能调用类的属性和方法,否则会报空指针错误。