Java学习笔记2.5.1 循环结构 - 条件循环
Posted howard2005
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习笔记2.5.1 循环结构 - 条件循环相关的知识,希望对你有一定的参考价值。
文章目录
零、本讲学习目标
- 理解为什么要使用循环
- 掌握while循环结构语句的使用
- 掌握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流程控制