Java 學生成績管理(數組,嵌套循環,冒泡排序,表格輸出四塊知識點融合)
這個案例非常經典,嵌套了很多知識。做了一遍又一遍。干貨很多。推薦給大家。對數組長度,轉化的理解,嵌套循環,遍歷的理解,冒泡排序,輸出,多次輸出,換行等等都有涉及到。總之非常經典。
第一階段確定學生人數,確定課程數目,確定課程名稱。
/**
- 第一階段去頂學生人數,確定課程數目,確定課程名稱。
- 主要是確定數組長度,以及給其中一個數組賦值。
- 數組長度不是事先確定,而是控制臺輸入確定,這一下子難度提高了一個臺階。
- 很容易導致數組越界。
-
*/
Scanner in=new Scanner(System.in);
System.out.println("請輸入學生人數:");
int perNum=in.nextInt();
String [] perName=new String[perNum];
System.out.println("請輸入課程數:");
int scNum=in.nextInt();
String scName[]=new String [scNum];for (int i = 0; i < scNum; i++) { System.out.println("請輸入"+(i+1)+"課程名稱:"); scName[i]=in.next(); }
第二階段,確定每一個學生姓名,確定每一個課程成績
/*
- 第二階段,確定每一個學生姓名,確定每一個課程成績
- 循環嵌套,分別給學生姓名,學生成績賦值。嵌套遍歷輸入賦值。
- 注意長度,很容易混淆普通遍歷與數組遍歷的長度。
- 而且容易混淆學生與成績的長度。
- 從這一階段輸出語句變成了難點。
-
**/
Scanner in=new Scanner(System.in);
System.out.println("請輸入學生人數:");
int perNum=in.nextInt();
String [] perName=new String[perNum];
System.out.println("請輸入課程數:");
int scNum=in.nextInt();
String scName[]=new String [scNum];
double sc[][]=new double[perNum][scNum];double sum[]=new double [scNum]; double avg[]=new double [scNum]; for (int i = 0; i < scNum; i++) { System.out.println("請輸入"+(i+1)+"課程名稱:"); scName[i]=in.next(); } //外層循環perName[i]不變,內層循環scName[j]改變一輪。 for (int i = 0; i <perNum; i++) { System.out.println("請輸入"+(i+1)+"學生姓名"); perName[i]=in.next(); for (int j = 0; j < scNum; j++) { System.out.println("請輸入"+perName[i] +scName[j]+"的成績"); sc[i][j]=in.nextDouble(); }
}
第三階段測試。
/** - 中間測試代碼,不是正式程序代碼!!!
- 因為下一步很難,為了防止出現意外,最好寫一段程序,運行一下。
- 發下問題,改正后繼續編寫,這里也寫一個檢驗的程序。
- 分別遍歷三個數組。看是否將數據傳入了進去,然后在想辦法組合輸出。
- 這三個數組分別是學生姓名perName[],課程名字scName[],課程成績sc[].
- 如果能這樣輸出就容易多了,可惜要表格輸出,還要二維輸出。
- 確定正確了,將他注釋掉,也可以留作后面表格輸出的參考。
- 等待整個程序大功告成了,在注釋掉,刪除也行。
-
*/
/*for (int i = 0; i < sc.length; i++) { System.out.println("學名"+perName[i]); } System.out.println("***********"); for (int i = 0; i < sc.length; i++) { System.out.println("科名"+scName[i]); } System.out.println("***********"); for (int i = 0; i < sc.length; i++) { System.out.println("成績"+sc[i]); } System.out.println("***********"); for (int i = 0; i < sc.length; i++) { System.out.println("總分"+sum2[i]); } System.out.println("***********"); for (int i = 0; i < sc.length; i++) { System.out.println("平均分"+avg2[i]); } System.out.println("***********"); */
第四階段,計算總分,計算平均分。輸出。其實輸出非常難,應該算是第五階段。
請大家瞧一瞧我出的洋相。類似的等等七八次,還有第一行也出錯了不少、
第五階段輸出總分與平均分。
/**
- 這個注釋造型別致吧,嘿嘿。
- 第三階段,計算總分,計算平均分,這個簡單。難的是下面的輸出。
- 其實總分與平均分也可以賦值給新的數組。這一段代碼可要可不要。
- 輸出。輸出非常難,不僅豎向有變化,橫向也有變化.這就要用到二維數組。
-
。更變態的是排行榜排序。更是難上加難。應該算是第四階段。
而且因為表格太難,甚至可以分為三個階段。如此就算第四階段輸出學生成績
第五階段輸出計算的部分,總分,平均分。
第六階段,輸出排行榜。
首先將第三階段部分,以及測試階段的全部注釋掉。
**/
Scanner in=new Scanner(System.in);
System.out.println("請輸入學生人數:");
int perNum=in.nextInt();
String [] perName=new String[perNum];
System.out.println("請輸入課程數:");
int scNum=in.nextInt();
String scName[]=new String [scNum];
double sc[][]=new double[perNum][scNum];double sum[]=new double [scNum]; double avg[]=new double [scNum]; String aa[] =new String [perNum]; for (int i = 0; i < scNum; i++) { System.out.println("請輸入"+(i+1)+"課程名稱:"); scName[i]=in.next(); } String a=""; for (int i = 0; i <perNum; i++) { System.out.println("請輸入"+(i+1)+"學生姓名"); perName[i]=in.next(); for (int j = 0; j < scNum; j++) { System.out.println("請輸入"+perName[i] +"第"+(j+1)+"門成績"); //二維數組存放特定學生的特定科目的特定成績。 // 猛一看起來好像三維數組,這樣理解,經緯度確定一個地方的位置。 // 二維數組也是用豎向下標與橫向下標一對下標確定成績。 sc[i][j]=in.nextDouble(); sum[i]=sum[i]+sc[i][j]; } avg[i]=sum[i]/scNum; } System.out.print("學生"); for (int i = 0; i < scName.length; i++) { System.out.print("\t"+scName[i]); } System.out.print("\t總分"+"\t平均分"+"\t排行榜"); System.out.println(); //到了二維輸出的時候。嵌套循環搭配二維數組。絕配 //換行不換行也是二維數組輸出的難點。 for (int i = 0; i <perNum ; i++) { System.out.print(perName[i]); for (int j = 0; j < scNum; j++) { System.out.print("\t"+sc[i][j]); } System.out.print("\t"+sum[i]+"\t"+avg[i]); System.out.println();
}
}
第六階段輸出排行榜。
終于完成了排序。
再加上名詞的對比效果
最終代碼,內容限制,去掉了注釋,反正前面都有。
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
System.out.println("請輸入學生人數:");
int perNum=in.nextInt();
String [] perName=new String[perNum];
System.out.println("請輸入課程數:");
int scNum=in.nextInt();
String scName[]=new String [scNum];
double sc[][]=new double[perNum][scNum];
double sum[]=new double [scNum];
double avg[]=new double [scNum];
String aa[] =new String [perNum]; 用數組整合每一排的信息,方便調序。整體挪移。
for (int i = 0; i < scNum; i++) {
System.out.println("請輸入"+(i+1)+"課程名稱:");
scName[i]=in.next();
}
String a="";
for (int i = 0; i <perNum; i++) {
System.out.println("請輸入"+(i+1)+"學生姓名");
perName[i]=in.next();
for (int j = 0; j < scNum; j++) {
System.out.println("請輸入"+perName[i] +"第"+(j+1)+"門成績");
sc[i][j]=in.nextDouble();
sum[i]=sum[i]+sc[i][j];
a=a+sc[i][j]; //作用是整合變化成績信息,作為中轉。不然的有兩個變量ij又要嵌套循環了
}
avg[i]=sum[i]/scNum;
aa[i] =perName[i]+a+sum[i]+avg[i];//整合一行的信息為一個字符串,每一行的字符串構成一個數組。最大的數組。
}
System.out.print("學生"); //不能換行,將復雜問題化解成多個小問題。要一步步來
for (int i = 0; i < scName.length; i++) {
System.out.print("\t"+scName[i]);
}
System.out.print("\t總分"+"\t平均分"+"\t排行榜");
System.out.println();
//嵌套冒泡排序。注意總分排序,緊跟著這一行都要排序。
for (int j = 0; j < perNum-1; j++) {
for (int i = 0; i < perNum-1; i++) {
if (sum[i]<sum[i+1]) {
double t=sum[i]; String tt=aa[i];
sum[i]=sum[i+1]; aa[i]=aa[i+1];
sum[i+1]=t; aa[i+1]=tt;
}
}
}
for (int i = 0; i <perNum ; i++) {
System.out.print(perName[i]);
for (int j = 0; j < scNum; j++) {
System.out.print("\t"+sc[i][j]);
}
System.out.print("\t"+sum[i]+"\t"+avg[i]+"\t第"+(i+1)+"名");
System.out.println();
}
共同學習,寫下你的評論
評論加載中...
相關文章推薦