面向程设作业的JAVA学习——学生成绩排序

【问题描述】
对某班学生成绩排序。从键盘依次输入某班学生的姓名和成绩(一个班级人数最多不超过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文件打包压缩提交即可。
程序运行结果如下:
在这里插入图片描述

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值