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


    多重循环控制

    1. 介绍

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

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

    • 请分析 下面的多重循环执行步骤, 并写出输出 => 内存分析法
      在这里插入图片描述
    	for(int i = 0; i < 2; i++) { 
    		for( int j = 0; j < 3; j++) {
    		    System.out.println("i=" + i + "j=" + j);
    		}
    	}
    

    在这里插入图片描述

    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 ));
    

    在这里插入图片描述
    (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));
    	}
    

    在这里插入图片描述
    (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);
    

    在这里插入图片描述
    (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);
    

    在这里插入图片描述

    (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");//当换行条件成立时,进行换行打印
    		      }
    	  }
    

    在这里插入图片描述

    4. 经典的打印金字塔

    • 使用 for 循环完成下面的案例
      请编写一个程序,可以接收一个整数,表示层数(totalLevel),打印出金字塔。(Stars.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("");
    		}
    

    在这里插入图片描述

    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("");
    	}
    

    在这里插入图片描述

    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("");
    	}
    

    在这里插入图片描述

    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("");
    	    }
    	}
    

    在这里插入图片描述

    本文来自博客园,作者:兮动人,转载请注明原文链接:https://www.cnblogs.com/xdr630/p/15254670.html

  • 相关阅读:
    Codeforces 514C Watto and Mechanism(字典树)
    计蒜客 直线的交点(计算几何 + 逆序对)
    Codeforces 837D Round Subset(背包)
    计蒜客 商汤科技的行人检测(随机化+计算几何)
    HDU 5893 List wants to travel(树链剖分+线段树)
    操作系统的中断处理
    Linux 安装 webmin
    Fedora 安装 phpMyAdmin(可能只有自己看得懂)
    httpd编译安装php
    IA-32e架构下的内核初始化内存管理
  • 原文地址:https://www.cnblogs.com/xdr630/p/15254670.html
Copyright © 2020-2023  润新知