【问题描述】
对某班学生成绩排序。从键盘依次输入某班学生的姓名和成绩(一个班级人数最多不超过50人)并保存,然后分别按学生成绩由高到低顺序输出学生姓名和成绩,成绩相同时,则按输入次序排序。
【输入形式】
从键盘依次输入最多不超过50个学生的学生姓名和成绩:
第一行输入班级学生人数;
在单独行上输入空格隔开的学生姓名和成绩,其中学生成绩是整数。
【输出形式】
按学生成绩由高到低顺序输出学生姓名和成绩,每行输出一位学生的姓名和成绩,其中姓名(英文)占15位,成绩占5位,均按缺省方式对齐。成绩相同时按输入次序排序。
【输入样例】
4
aaa 50
bbb 70
ccc 65
ddd 90
【输出样例】
############ddd###90
############bbb###70
############ccc###65
############aaa###50
(注意:其中"#"号代表空格)
算法说明
今天有同学问我这道题,才想起来还没分享到博客上,最近有点划水,再加上学业压力还挺大的,更博倦怠了,要改!
在解决这个问题的时候,为了熟悉一下JAVA类的用法,并且方便解决问题,我定义了一个学生类,类中含有姓名与成绩两个属性,同时为了在排序的时候偷懒一下下,定义了一个flag标志,代表该名学生的信息是否被输出了。
Student类
该类的代码如下:
package work4;
public class student { //类名
String name; //姓名
int grade; //成绩
boolean flag; //是否输出
void setname(String newname) { //设置姓名
name = newname;
}
void setgrade(int newgrade) { //设置成绩
grade = newgrade;
}
void setflag(boolean newflag) { //设置标志
flag = newflag;
}
String getname() { //获得学生姓名
return name;
}
int getgrade() { //获得学生成绩
return grade;
}
boolean getflag() { //查询是否访问
return flag;
}
}
相信没有学过面向对象的同学可能会有些疑问,为什么这些赋值、查询的操作要通过类中的方法实现?我这种写法其实是沿袭了在C++中书写类的方法,在类的定义中,为了保证数据的安全性,属性类的值如name,grade,其访问权限都会设置为private,而这些赋值函数的访问权限会设置为pubic,即对象通过调用方法才能实现对数据的修改。
排序主类
主类的定义如下:
package work4;
import java.util.Scanner;
public class paixu {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int i = input.nextInt(); //读取学生数
int j,m,n;
student[] students = new student[i]; //定义学生类的数组students
for(j=0;j<i;j++) { //存储所有学生的信息
students[j] = new student(); //这里在对学生存储信息之前,要分配一下存储空间
students[j].setname(input.next());; //next读取字符串型学生姓名
students[j].setgrade(input.nextInt()); //nextInt读取学生成绩
students[j].setflag(true); //未被访问设为true
}
int tem=0; //在循环中,存储每一次遍历成绩最高的学生数组数
int max; //存储最大成绩
for(m=0;m<i;m++) {
max=-1; //初始化设置为-1
for(n=0;n<i;n++) {
if(students[n].getflag() && students[n].getgrade()>max) { //当该名学生未被输出且成绩大于现存的最大值时,对tem和max进行更新
max = students[n].getgrade();
tem = n;
}
}
System.out.printf("%15s%5d\n",students[tem].getname(),max); //输出本次遍历中成绩最高的学生信息,printf为典型的C语言风格输出,利用格式化输出,达到题目的格式要求
students[tem].setflag(false); //更改该名学生的flag
}
}
}
相关解读均在注释中给出了。显然,该种排序方法复杂度是比较高的,但是奈何逻辑简单,而且评分系统不综合考虑运行时间,就偷了个懒嘤嘤嘤。
最需要注意的是,在定义student类的数组时,在第一次对其中的元素进行操作之前,要通过new初始化。
在提交时,将两个类的JAVA文件打包压缩提交即可。
程序运行结果如下: