【問題描述】
對某班學生成績排序。從鍵盤依次輸入某班學生的姓名和成績(一個班級人數最多不超過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檔案打包壓縮送出即可。
程式運作結果如下:
