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

在这里插入图片描述

posted @ 2021-05-11 15:48  兮动人  阅读(239)  评论(0编辑  收藏  举报