Java之多重循环控制基本使用

多重循环控制

1. 介绍

1) 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for ,while ,do…while 均可以作为外层循环和内层循环。
【建议一般使用两层,最多不要超过 3 层, 否则,代码的可读性很差】
2) 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为 false 时,才会完全跳出内
层循环,才可结束外层的当次循环,开始下一次的循环[听不懂,走案例]。
3) 设外层循环次数为 m 次,内层为 n 次,则内层循环体实际上需要执行 m*n
Java之多重循环控制基本使用

2. 多重循环执行步骤分析:

  • 请分析 下面的多重循环执行步骤, 并写出输出 => 内存分析法

Java之多重循环控制基本使用

    for(int i = 0; i < 2; i++) { 
        for( int j = 0; j < 3; j++) {
            System.out.println("i=" + i + "j=" + j);
        }
    }

Java之多重循环控制基本使用

3. 应用实例:

MulForExercise01.java

(1) 统计 3 个班成绩情况,每个班有 5 名同学,求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。

  • 思路分析:
  1. 化繁为简
    (1) 先计算一个班 , 5个学生的成绩和平均分 , 使用for

     1.1 创建 `Scanner` 对象然后,接收用户输入
     1.2 得到该班级的平均分 , 定义一个 `doubel sum` 把该班级5个学生的成绩累积
    
    
    Scanner sc = new Scanner(System.in);
    double sum = 0; //一个班的总成绩
    for (int j = 1;j <= 5;j++){
        System.out.println("请输入第一个班的第" + j + "个学生的成绩:");
        double score = sc.nextDouble();
        sum += score; //累积
        System.out.println("成绩为:"+score);
    }
    //因为 sum 是5个学生的总成绩
    System.out.println("sum="+sum+"平均分="+(sum /5 ));

Java之多重循环控制基本使用
(2) 统计3个班(每个班5个学生) 平均分,在外层加个 for 循环 i,因为是每个班,都要计算一个班的学生总成绩和平均分,所以再外层嵌套一层 for 循环 3,最后在把输入的第几个班改为 第 i 个班即可

    Scanner sc = new Scanner(System.in);
    for (int i = 1;i <= 3;i++) {    //i表示班级
        double sum = 0; //一个班的总成绩
        for (int j = 1; j <= 5; j++) {  //j表示学生
            System.out.println("请输入第"+i+"个班的第" + j + "个学生的成绩:");
            double score = sc.nextDouble();
            sum += score; //累积
            System.out.println("成绩为:" + score);
        }
        //因为 sum 是5个学生的总成绩
        System.out.println("sum=" + sum + "平均分=" + (sum / 5));
    }

Java之多重循环控制基本使用
(3) 所有班级的平均分

    3.1 定义一个变量,`double totalScore` 累积所有学生的成绩
    3.2 当多重循环结束后,`totalScore / (3 * 5)` 
    
    Scanner sc = new Scanner(System.in);
    double totalScore = 0;//累积所有学生的总成绩
    for (int i = 1;i <= 3;i++) {    //i表示班级
        double sum = 0; //一个班的总成绩
        for (int j = 1; j <= 5; j++) {  //j表示学生
            System.out.println("请输入第"+i+"个班的第" + j + "个学生的成绩:");
            double score = sc.nextDouble();
            sum += score; //累积
            System.out.println("成绩为:" + score);
        }
        //因为 sum 是5个学生的总成绩
        System.out.println("sum=" + sum + "平均分=" + (sum / 5));
        //把 sum 累积到 totalScore
        totalScore += sum;
    }
    System.out.println("三个班总分"+totalScore+"平均分="+totalScore / 15);

Java之多重循环控制基本使用
(4) 统计三个班及格人数

    4.1 定义变量 int passNum = 0; 当有一个学生成绩>=60, passNum++
    4.2 如果 >= 60 passNum++

    Scanner sc = new Scanner(System.in);
     double totalScore = 0;//累积所有学生的总成绩
     int passNum = 0; //累积 及格人数
     for (int i = 1;i <= 3;i++) {    //i表示班级
         double sum = 0; //一个班的总成绩
         for (int j = 1; j <= 5; j++) {  //j表示学生
             System.out.println("请输入第"+i+"个班的第" + j + "个学生的成绩:");
             double score = sc.nextDouble();
             if (score >= 60){
                 passNum++;
             }
             sum += score; //累积
             System.out.println("成绩为:" + score);
         }
         //因为 sum 是5个学生的总成绩
         System.out.println("sum=" + sum + "平均分=" + (sum / 5));
         //把 sum 累积到 totalScore
         totalScore += sum;
     }
     System.out.println("三个班总分"+totalScore+"平均分="+totalScore / 15);
     System.out.println("及格人数="+passNum);

Java之多重循环控制基本使用

(5) 可以优化[效率,可读性, 结构],班级人数和学生人数分别使用变量来替换

    Scanner sc = new Scanner(System.in);
    double totalScore = 0;//累积所有学生的总成绩
    int passNum = 0; //累积 及格人数
    int classNum = 3; //班级个数
    int stuNum = 5; //学生个数
    for (int i = 1;i <= classNum;i++) {    //i表示班级
        double sum = 0; //一个班的总成绩
        for (int j = 1; j <= stuNum; j++) {  //j表示学生
            System.out.println("请输入第"+i+"个班的第" + j + "个学生的成绩:");
            double score = sc.nextDouble();
            if (score >= 60){
                passNum++;
            }
            sum += score; //累积
            System.out.println("成绩为:" + score);
        }
        //因为 sum 是5个学生的总成绩
        System.out.println("sum=" + sum + "平均分=" + (sum / stuNum));
        //把 sum 累积到 totalScore
        totalScore += sum;
    }
    System.out.println("三个班总分"+totalScore+"平均分="+totalScore / classNum*stuNum);
    System.out.println("及格人数="+passNum);

(2) 统计三个班及格人数,每个班有 5 名同学。

(3) 打印出九九乘法表

    for    (int i = 1; i <= 9; i++){
          for(int j = 1; j <= i; j++){
          // "\t"这是JAVA语言默认的制表符号,使用此符号,打印出的乘法表格较为美观
              System.out.print(" " + i + "*" + j + "=" + (i * j)+"\t");
              if(i == j){
                  System.out.print("\n");//当换行条件成立时,进行换行打印
              }
      }

Java之多重循环控制基本使用

4. 经典的打印金字塔

  • 使用 for 循环完成下面的案例

请编写一个程序,可以接收一个整数,表示层数(totalLevel),打印出金字塔。(Stars.java) [化繁为简,先死后活]
Java之多重循环控制基本使用

  • 思路分析
    化繁为简

    1. 先打印一个矩形
    *****
    *****
    *****
    *****
    *****
  for (int i = 1; i <= 5; i++) {
            System.out.println("*****");
        }
  1. 打印半个金字塔
    *        //第1层 有 1个*
    **       //第2层 有 2个*
    ***        //第3层 有 3个*
    ****    //第4层 有 4个*
    *****   //第5层 有 5个*
    for (int i = 1; i <= 5; i++) {  // i 表示层数
          // 控制打印每层的 * 个数
          for (int j = 1; j <= i; j++) {
              System.out.print("*");
          }
          // 每打印完一层 * 后,就换行
          System.out.println("");
        }

Java之多重循环控制基本使用

  1. 打印整个金字塔
                             2 * 层数-1
    *       //第1层 有 1个*   2 * 1 -1   有4=(总层数-1)个空格
   ***      //第2层 有 3个*   2 * 2 -1   有3=(总层数-2)个空格
  *****     //第3层 有 5个*   2 * 3 -1   有2=(总层数-3)个空格
 *******    //第4层 有 7个*   2 * 4 -1   有1=(总层数-4)个空格
*********   //第5层 有 9个*   2 * 5 -1   有0=(总层数-5)个空格
    for (int i = 1; i <= 5; i++) {  // i 表示层数

        //在输出*之前,还有输出 对应空格 = 总层数-当前层
        for (int k = 1; k <= 5-i; k++){
            System.out.print(" ");
        }
        
        // 控制打印每层的 * 个数
        for (int j = 1; j <= 2 * i - 1; j++) {
            System.out.print("*");
        }
        
        // 每打印完一层 * 后,就换行
        System.out.println("");
    }

Java之多重循环控制基本使用

  1. 打印空心的金字塔 [最难的]
    *       //第1层 有 1个*   当前行的第一个位置是*,最后一个位置也是*
   * *      //第2层 有 2个*   当前行的第一个位置是*,最后一个位置也是*
  *   *     //第3层 有 2个*   当前行的第一个位置是*,最后一个位置也是*
 *     *    //第4层 有 2个*   当前行的第一个位置是*,最后一个位置也是*
*********   //第5层 有 9个*   全部输出*
    for (int i = 1; i <= 5; i++) {  // i 表示层数

        //在输出*之前,还有输出 对应空格 = 总层数-当前层
        for (int k = 1; k <= 5-i; k++){
            System.out.print(" ");
        }
    
        // 控制打印每层的 * 个数
        for (int j = 1; j <= 2 * i - 1; j++) {
            //当前行的第一个位置是*,最后一个位置也是*,最后一层全部输出 *
            if (j == 1 || j == 2 * i - 1 || i == 5){
                System.out.print("*");
            }else { //其他情况输出 空格
                System.out.print(" ");
            }
        }
    
        // 每打印完一层 * 后,就换行
        System.out.println("");
    }

Java之多重循环控制基本使用

  1. 先死后活:5 层数做成变量 int totalLevel = 5;
  • 把 5 改成 10
        int totalLeavel = 10;
        for (int i = 1; i <= totalLeavel; i++) {  // i 表示层数
    
            //在输出*之前,还有输出 对应空格 = 总层数-当前层
            for (int k = 1; k <= totalLeavel-i; k++){
                System.out.print(" ");
            }
    
            // 控制打印每层的 * 个数
            for (int j = 1; j <= 2 * i - 1; j++) {
                //当前行的第一个位置是*,最后一个位置也是*,最后一层全部输出 *
                if (j == 1 || j == 2 * i - 1 || i == totalLeavel){
                    System.out.print("*");
                }else { //其他情况输出 空格
                    System.out.print(" ");
                }
            }
    
            // 每打印完一层 * 后,就换行
            System.out.println("");
        }
    }

Java之多重循环控制基本使用

上一篇:LeetCode -1319 连通网络的操作次数


下一篇:Java之while循环基本使用