天天看點

面向程設作業的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檔案打包壓縮送出即可。

程式運作結果如下:

面向程設作業的JAVA學習——學生成績排序