為了賬號安全,請及時綁定郵箱和手機立即綁定

Java 學生成績管理(數組,嵌套循環,冒泡排序,表格輸出四塊知識點融合)

2016.05.31 17:03 10456瀏覽

這個案例非常經典,嵌套了很多知識。做了一遍又一遍。干貨很多。推薦給大家。對數組長度,轉化的理解,嵌套循環,遍歷的理解,冒泡排序,輸出,多次輸出,換行等等都有涉及到。總之非常經典。

第一階段確定學生人數,確定課程數目,確定課程名稱。
圖片描述
/**

  • 第一階段去頂學生人數,確定課程數目,確定課程名稱。
  • 主要是確定數組長度,以及給其中一個數組賦值。
  • 數組長度不是事先確定,而是控制臺輸入確定,這一下子難度提高了一個臺階。
  • 很容易導致數組越界。
  • */
    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();
    }
點擊查看更多內容

本文原創發布于慕課網 ,轉載請注明出處,謝謝合作

46人點贊

若覺得本文不錯,就分享一下吧!

評論

相關文章推薦

正在加載中
意見反饋 幫助中心 APP下載
官方微信

舉報

0/150
提交
取消
lpl竞猜