继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Java 学生成绩管理(数组,嵌套循环,冒泡排序,表格输出四块知识点融合)

玄鉴
关注TA
已关注
手记 96
粉丝 237
获赞 4217

这个案例非常经典,嵌套了很多知识。做了一遍又一遍。干货很多。推荐给大家。对数组长度,转化的理解,嵌套循环,遍历的理解,冒泡排序,输出,多次输出,换行等等都有涉及到。总之非常经典。

第一阶段确定学生人数,确定课程数目,确定课程名称。
图片描述
/**

  • 第一阶段去顶学生人数,确定课程数目,确定课程名称。
  • 主要是确定数组长度,以及给其中一个数组赋值。
  • 数组长度不是事先确定,而是控制台输入确定,这一下子难度提高了一个台阶。
  • 很容易导致数组越界。
  • */
    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();
    }
打开App,阅读手记
46人推荐
发表评论
随时随地看视频慕课网APP

热门评论

运行结果显示列表,姓名,成绩和总分没有匹配上。只有总分进行了排序,其他字段没有排序。

感觉aa【】这个整体排序有问题。

为什么运行起来不一样哇

”用数组整合每一排的信息,方便调序。整体挪移。”这一行注释忘了加//注释了。害得我查了好几遍。不好意思。

查看全部评论