Java学习笔记2.5.3 循环结构 - 循环嵌套

Posted howard2005

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习笔记2.5.3 循环结构 - 循环嵌套相关的知识,希望对你有一定的参考价值。

文章目录

零、本讲学习目标

  1. 掌握循环嵌套的使用
  2. 理解两种跳转的作用

一、嵌套循环

(一)嵌套循环概念

  • 嵌套循环是指在一个循环语句的循环体中再定义一个循环语句的语法结构。注意必须是包含关系,不能出现交叉。while、do…while、for循环语句都可以进行循环嵌套,并且它们之间也可以互相嵌套。在实际开发时,最常用的是for循环嵌套。

(二)双重for循环

1、语法格式

for(初始化表达式; 循环条件; 操作表达式) 
    ...
    for(初始化表达式; 循环条件; 操作表达式) 
        执行语句
        ...
    
    ...

2、执行规则

  • 在双层for循环嵌套中,外层循环每执行一轮,都要执行完内层循环中的整个for循环,然后执行外层循环第二轮,接着再执行完内层循环中的整个for循环,以此类推,直至外层循环的循环条件不成立,才会跳出整个嵌套for循环。如果外循环有 m m m次,内循环有 n n n次,那么内循环里的操作会执行 m × n m\\times n m×n次。

(三)案例演示

任务1、打印字符图形

(1)打印矩形

  • 内循环的输出语句如果换行,那么结果是是输出一列星号,如下图所示:
  • 如果内循环的输出语句不换行,那么结果是输出一行星号,如下图所示:
  • 因此,内循环完了之后,必须要换行才行,代码如下
package net.hw.lesson07;

import java.util.Scanner;

/**
 * 功能:打印矩形字符图形
 * 作者:华卫
 * 日期:2020年4月19日
 */
public class Example704 
    public static void main(String[] args) 
        // 声明部分
        int row, col;
        Scanner sc = new Scanner(System.in);

        // 输入部分
        System.out.print("row = ");
        row = sc.nextInt();
        System.out.print("col = ");
        col = sc.nextInt();

        // 处理与输出部分
        for (int i = 1; i <= row; i++) 
            // 负责打印星号
            for (int j = 1; j <= col; j++) 
                System.out.print("*");
            
            System.out.println(); // 换行
        
    

  • 运行程序,查看结果

(2)打印平行四边形

  • 平行四边形有两种情况,一个向右倾斜的平行四边形,如下图所示:
  • 我们来研究一下每行前导空格数与当前行数的关系,这对我们编写程序至关重要。
  • 假设总行数 row = 10,我们可以发现一个规律:第i行的前导空格数等于总行数减去当前行数,即 spaces = row - i = 10 - i。
i = 1    spaces = 9      1 + 9 = 10
i = 2    spaces = 8      2 + 8 = 10
……
i = i    spaces = 10 - i  i + (10 - i) = 10
……
i = 8    spaces = 2       8 + 2 = 10
i = 9    spaces = 1       9 + 1 = 10
i = 10   spaces = 0       10 + 0 = 10

package net.hw.lesson07;

import java.util.Scanner;

/**
 * 功能:打印平行四边形
 * 作者:华卫
 * 日期:2020年4月19日
 */
public class Example705 
    public static void main(String[] args) 
        // 声明部分
        int row, col;
        Scanner sc = new Scanner(System.in);

        // 输入部分
        System.out.print("row = ");
        row = sc.nextInt();
        System.out.print("col = ");
        col = sc.nextInt();

        // 打印向右倾斜的平行四边形
        for (int i = 1; i <= row; i++) 
            // 负责打印前导空格
            for (int j = 1; j <= row - i; j++) 
                System.out.print(" ");
            
            // 负责打印星号
            for (int j = 1; j <= col; j++) 
                System.out.print("*");
            
            System.out.println(); // 换行
        

        System.out.println();

        // 打印向左倾斜的平行四边形
        for (int i = 1; i <= row; i++) 
            // 负责打印前导空格
            for (int j = 1; j <= i - 1; j++) 
                System.out.print(" ");
            
            // 负责打印星号
            for (int j = 1; j <= col; j++) 
                System.out.print("*");
            
            System.out.println(); // 换行
        
    

  • 运行程序,查看结果

课堂练习:打印直角三角形

挑战练习:打印实心钻石

  • 实心钻石,其实由一个正立的等腰三角形和一个倒立的等腰三角形组合而成,也就是一个菱形。
  • 当然还可以更有挑战性,打印输出空心钻石。只有边上有星号,里面全部被镂空。

任务2、打印乘法九九表

  • 作为启蒙教材,我们都背过九九乘法表:一一得一、一二得二、……、九九八十一。而古代是从"九九八十一"开始,因此称"九九表"。九九表的使用,对于完成乘法是大有帮助的。齐桓公纳贤的故事说明,到公元前7世纪时,九九歌诀已不稀罕。也许有人认为这种成绩不值一提。但在古代埃及作乘法却要用倍乘的方式呢。举个例子说明:比如计算23×13,就需要从23开始,加倍得到23×2,23×4,23×8,然后注意到13=1+4+8,于是23+23×4+23×8加起来的结果就是23×13。通过对比,不难看出使用九九表的优越性了。
package net.hw.lesson07;

/**
 * 功能:打印乘法九九表
 * 作者:华卫
 * 日期:2020年4月19日
 */
public class Example706 
    public static void main(String[] args) 
        // 外层循环,变量i控制输出1~9行
        for (int i = 1; i <= 9; i++) 
            // 内层循环,变量j控制输出1~i列
            for (int j = 1; j <= i; j++) 
                // 输出乘法算式
                System.out.print(i + " × " + j + " = " + (i * j) + "\\t");
            
            // 控制外层循环进行换行
            System.out.println();
        
    

  • 运行程序,查看结果
  • 注意内循环的循环条件
  • 将内循环条件改成j <= 9,结果如下:

任务3、百钱买百鸡问题

  • 我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?

  • 翻译过来,意思是公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只?

  • 需要定义三个整型变量cock, hen, chick,分别代表公鸡、母鸡和小鸡的购买数量。

  • 有两方面的条件:关于钱的条件与关于鸡的条件
    – 钱的条件: c o c k × 5 + h e n × 3 + c h i c k 3 = 100 cock \\times5+hen\\times3+\\displaystyle\\fracchick3=100 cock×5+hen×3+3chick=100
    – 鸡的条件: c o c k + h e n + c h i c k = 100 cock+hen+chick=100 cock+hen+chick=100

(1)采用三重循环

cock:0 ~ 20
hen:0 ~ 34
chick:0 ~ 100

package net.hw.lesson07;

/**
 * 功能:求解百钱买百鸡问题
 *      采用三重循环
 * 作者:华卫
 * 日期:2020年4月19日
 */
public class Example707 
    public static void main(String[] args) 
        //声明部分
        int cock, hen, chick, count = 0;

        //处理部分
        for (cock = 0; cock <= 20; cock++) 
            for (hen = 0; hen <= 34; hen++) 
                for (chick = 0; chick <= 100; chick++) 
                    if (cock + hen + chick == 100 && cock * 5 + hen * 3 + chick / 3.0 == 100) 
                        count++;
                        System.out.println("cock = " + cock + " hen = " + hen + " chick = " + chick);
                    
                
            
        
        System.out.print("百钱买百鸡总共有" + count + "种购买方案。");
    

  • 运行程序,查看结果

  • 验证四种购买方案是否正确:
    – 方案1: 0 + 25 + 75 = 100 , 0 × 5 + 25 × 3 + 75 3 = 75 + 25 = 100 0+25+75=100, 0\\times5+25\\times3+\\displaystyle\\frac753=75+25=100 0+25+75=100,0×5+25×3+375=75+25=100
    – 方案2: 4 + 18 + 78 = 100 , 4 × 5 + 18 × 3 + 78 3 = 20 + 54 + 26 = 100 4+18+78=100, 4\\times5+18\\times3+\\displaystyle\\frac783=20+54+26=100 4+18+78=100,4×5+18×3+378=20+54+26=100
    – 方案3: 8 + 11 + 81 = 100 , 8 × 5 + 11 × 3 + 81 3 = 40 + 33 + 27 = 100 8+11+81=100, 8\\times5+11\\times3+\\displaystyle\\frac813=40+33+27=100 8+11+81=100,8×5+11×3+381=40+33+27=100
    – 方案4: 12 + 4 + 84 = 100 , 12 × 5 + 4 × 3 + 84 3 = 60 + 12 + 28 = 100 12+4+84=100, 12\\times5+4\\times3+\\displaystyle\\frac843=60+12+28=100 12+4+84=100,12×5+4×3+Java学习笔记2.5.1 循环结构 - 条件循环

    Java 第五章 循环结构学习笔记

    Java学习笔记2.5.2 循环结构 - 计数循环

    JAVA学习笔记-循环结构

    Java自学笔记第二十二天

    Java学习笔记--循环总结