Java学习笔记2.5.1 循环结构 - 条件循环

Posted howard2005

tags:

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

文章目录

零、本讲学习目标

  1. 理解为什么要使用循环
  2. 掌握while循环结构语句的使用
  3. 掌握do…while循环结构语句的使用

一、为什么要用循环

  • 如果要求输出一百遍“好好学习,天天向上!”,那你会怎么做?

(一)老老实实的笨方法

System.out.println("第1遍写:好好学习,天天向上!"); 
System.out.println("第2遍写:好好学习,天天向上!"); 
System.out.println("第3遍写:好好学习,天天向上!"); 
System.out.println("第4遍写:好好学习,天天向上!"); 
……
System.out.println("第100遍写:好好学习,天天向上!");     
  • 此方法显然很糟糕,如果要你输出一万遍,那岂不令人崩溃?

(二)采用循环结构的巧方法

1、采用计数循环(for循环)

package net.hw.lesson06;

/**
 * 功能:重复口号一百遍
 * 作者:华卫
 * 日期:2020年4月12日
 */
public class Example609 
    public static void main(String[] args) 
        for (int i = 1; i <= 100; i++) // 循环头:初始条件、循环条件、更新条件
            System.out.println("第" + i + "遍写:好好学习,天天向上!");
        
    


  • 运行程序,查看结果
  • 大家可以参看一下Python代码完成同样的任务

2、采用条件循环(while循环)

package net.hw.lesson06;

/**
 * 功能:重复口号一百遍
 * 作者:华卫
 * 日期:2020年4月12日
 */
public class Example610 
    public static void main(String[] args) 
        int i = 1; // 初始条件
        while (i <= 100)  // 循环条件
            System.out.println("第" + i + "遍写:好好学习,天天向上!");
            i++; // 更新条件
        
    

  • 运行程序,查看结果
  • 大家可以参看用Python代码完成同样的任务

二、条件循环

  • 条件循环是根据条件来决定是否要执行循环或终止循环。条件循环有两种,前测试条件循环while循环,后测试条件循环do…while循环。

(一)前测试循环 - while循环

1、语法格式

初始条件
while (循环条件) 
     语句块
     break|continue;
     更新条件

2、执行情况


首先判断循环条件是真还是假,如果是真的,执行循环体,然后再次判断循环条件。如果是真的,继续循环,直到循环条件变成假的。有一种特殊情况:如果第一次判断循环条件就不成立,那么一次循环也不执行。

3、案例演示

任务1、演示死循环(永真循环)

package net.hw.lesson06;

/**
 * 功能:演示死循环(永真循环)
 * 作者:华卫
 * 日期:2020年4月12日
 */
public class Example611 
    public static void main(String[] args) 
        // 理论上是死循环,但实际上会结束
        int i = 1; // 初始条件
        while (i >= 1)  // 循环条件
            System.out.println("i = " + i);
            i = i + 10000; // 更新条件
        
        System.err.println("i = " + i);

        // 最直接了当的死循环
        while (true) 
            System.out.println("我要出去玩!");
        
    

  • 运行程序,查看结果

  • 会一直输出“我要出去玩!”,永远都不会结束,除非我们强制终止应用程序。

任务2、计算1 + 2 + 3 + …… + 100的值

  • 这是一个非常经典的数学计算问题:公差为1的等差数列求和。
package net.hw.lesson06;

/**
 * 功能:计算1 + 2 + 3 + …… + 100的值
 * 作者:华卫
 * 日期:2020年4月12日
 */
public class Example612 
    public static void main(String[] args) 
        int i, sum = 0;

        i = 1; // 初始条件
        while (i <= 100)  // 循环条件
            sum += i; 
            i++; // 更新条件
        

        System.out.println("1 + 2 + 3 + …… + 100 = " + sum);
    

  • 只要i <= 100成立,循环都会继续,直到i = 101,不满足条件了,循环才终止。

  • 运行程序,查看结果

  • 修改一下代码,输出循环结束后循环变量i的值

  • 大家可以参看一下完成同样任务的Python代码

课堂练习:编程计算1 + 3 + 5 + …… + 99的值

  • 提示:有三种方法可以解决此问题。
    (1)修改循环的更新条件:i = i + 2;
    (2)在循环结构里嵌套一个过滤器:if (i % 2 == 1) sum += i;
    (3)修改循环条件:i <= 50,修改累加语句 sum += 2 * i - 1;

任务3、打印全部水仙花数

  • 所谓水仙花数,是指等于其各位数字立方和的三位数。

\\qquad 153 = 1 3 + 5 3 + 3 3 153=1^3+5^3+3^3 153=13+53+33
\\qquad 370 = 3 3 + 7 3 + 0 3 370=3^3+7^3+0^3 370=33+73+03
\\qquad 371 = 3 3 + 7 3 + 1 3 371=3^3+7^3+1^3 371=33+73+13
\\qquad 407 = 4 3 + 0 3 + 7 3 407=4^3+0^3+7^3 407=43+03+73

  • 分析问题,首先水仙花数是三位数,那么我们可以确定范围:100~999,这个我们可以通过循环结构来搞定:
n = 100;
while (n <= 999) 
    n++;

  • 然后对于这个范围的每个数n,我们要去判断它是否等于其各位数字的立方和,这里的难点或关键在于如何分解一个三位数,得到它的每位数字。

  • 假设我们已经把三位数n分解成百位数p3,十位数p2,个位数p1,

  • 这样我们的筛选条件就可以写出来:n == p3 * p3 * p3 + p2 * p2 * p2 + p1 * p1 * p1。

  • 如何拆分一个三位数n呢?

  • 首先求n的个位数:n % 10
    然后要将三位数变成两位数:n = n / 10;
    对于新的两位数n,又求它的个位数:n % 10
    然后要将两位数变成一位数:n = n / 10;

  • 也就是说我们可以交替使用求余和整除运算将一个三位数拆分,得到它的个位数、十位数和百位数。当然这个分解方法可以推广到任何多位数的拆分。

package net.hw.lesson06;

/**
 * 功能:打印水仙花数
 * 作者:华卫
 * 日期:2020年4月12日
 */
public class Example613 
    public static void main(String[] args) 
        // 声明部分
        int n;
        int p3; // 百位数
        int p2; // 十位数
        int p1; // 个位数

        // 处理部分
        n = 100; // 初始条件
        while (n <= 999) // 循环条件
            p1 = n % 10; // 得到个位数
            p2 = n / 10 % 10; // 得到十位数
            p3 = n / 100; // 得到百位数
            if (n == p1 * p1 * p1 + p2 * p2 * p2 + p3 * p3 * p3) // if负责筛选工作
                System.out.println(n + " = " + p3 + "^3 + " + p2 + "^3 + " + p1 + "^3");
            
            n++; // 更新条件
        
    

  • 运行程序,查看结果
  • 大家可以参看一下完成同样任务的Python代码

(二)后测试循环 - do…while循环

1、语法格式

初始条件
do 
     语句块
     break|continue;
     更新条件
 while (循环条件);

2、执行情况

  • 首先执行一次循环,然后判断循环条件,如果为真,继续循环,直到条件为假时结束循环。后测试当型循环,属于先上车后买票,无论如何都会执行一次循环。

3、案例演示

任务:计算1 + 2 + 3 + …… + 100的值

package net.hw.lesson06;

/**
 * 功能:计算1 + 2 + 3 + …… + 100的值
 * 作者:华卫
 * 日期:2020年4月12日
 */
public class Example614 
    public static void main(String[] args) 
        int i, sum = 0;

        i = 1; // 初始条件
        do 
            sum += i;
            i++; // 更新条件
         while (i <= 100); // 循环条件

        System.out.println("1 + 2 + 3 + …… + 100 = " + sum);
    

运行程序,查看结果:

三、课后作业

任务1、输出所有的玫瑰花数

  • 所谓玫瑰花数,是指等于其各位数字四次方之和的四位数

\\qquad 1634 = 1 4 + 6 4 + 3 4 + 4 4 1634=1^4+6^4+3^4+4^4 1634=14+64+34+44
\\qquad 8208 = 8 4 + 2 4 + 0 4 + 8 4 8208=8^4+2^4+0^4+8^4 8208=84+24+04+84
\\qquad 9474 = 9 4 + 4 4 + 7 4 + 4 4 9474=9^4+4^4+7^4+4^4 9474=94+44+74+44

任务2、完成猜数游戏,

  • 处理只玩一次就结束的情况

任务3、判断一个整数是否是素数

  • 什么是素数?一个整数除了1和本身之外没有其它因子,这个整数就是素数。比如,2、3、5、7、11、13……这些整数都是素数,但是我们来看6,除了1和6之外,还有其它因子2和3,6 = 2 * 3,因此6是合数。有一个特殊情况,1既不是素数,也不是合数。

任务4、打印输出素数

  • 输出100以内的全部素数,每行打印5个素数

任务5、解决征婚测试问题

四、补充案例

(一)可进可退多级购物菜单系统

package net.hw.lesson06;

import java.util.Scanner;

/**
 * 功能:设计购物系统的多级菜单
 * 要求菜单操作可进可退
 * 作者:华卫
 * 日期:2020年4月12日
 */
public class Example620 
    public static void main(String[] args) 
        int choice; // 菜单选择号
        boolean isReturn; // 是否要返回
        Scanner sc = new Scanner(System.in); // 扫描器
        while (true) 
            isReturn = false; // 不返回
            // 显示登录菜单
            System.out.println(" 登录菜单");
            System.out.println("=============");
            System.out.println(" 1. 登录系统");
            System.out.println(" 2. 退出系统");
            System.out.println("=============");
            System.out.print("输入菜单号(1,2):");
            choice = sc.nextInt();
            switch (choice) 
                case 1:
                    login(); // 调用登录系统的方法
                    break;
                case 2:
                    isReturn = true; // 要返回
                    break;
                default:
                    System.err.println("输入菜单号错误!");
                    break;
            
            if (isReturn)  // 判断是否要返回
                System.out.println("谢谢使用!");
                break; // 跳出循环
            
        
    

    Java学习笔记之:Java流程控制

Java学习笔记--循环总结

Java基础学习笔记(基本规范变量定义运算符分支/循环结构函数)

shell脚本编程学习笔记-分支与循环结构

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

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