part03——程序流程控制
part03——程序流程控制
目标
- 程序流程控制 🍐
- 顺序结构
- 分支结构
- 循环结构
- 生成随机数 ✏️
知识储备
- 使用键盘输入过数据
- 能理解 如果 满18岁 就可以去网吧,否则 不能去网吧 这句话
一、分支结构 🚩
1.1 if分支
if分支
if的作用,是用于对条件进行判断,判断的结果只可能有两个值true或者false,然后根据条件判断的结果来决定执行那段代码。
if分支的应用场景
- 比如,在火车站、地铁站等公共场所,会对过往的旅客测体温。如果体温在37度以内,就属于正常的;如果体温在37读以上,测体温的装置就会报警。
- 再比如,你在使用微信付钱时,微信内部的程序会先判断你的余额是否足够,如果足够就可以支付成功;如果余额不足,就会提示支付失败。
if分支的格式
if分支格式分为3种,如下
if 第一种形式 (特点:只有如果)
if 第一种形式的代码格式,和执行流程如下图所示

if 第一种形式执行流程如下:
如果 条件表达式 为true,就执行下面的语句体
如果 条件表达式 为false,就不执行
/**
目标:掌握if分支的使用和应用场景
*/
public class IfIOperationDemo1 {
public static void main(String[] args) {
// if 第一种形式 (特点:只有如果)
// 需求:测量用户体温,发现体温高于37度就报警。
double t = 36.9;
if(t > 37){
System.out.println("这个人的温度异常,把他赶紧带走~~");
}
}
}
if 第二种形式 (特点:如果,否则)
if 第二种形式的代码格式,和执行流程如下图所示

/**
目标:掌握if分支的使用和应用场景
*/
public class IfIOperationDemo1 {
public static void main(String[] args) {
// if 第一种形式 (特点:只有如果)
// 需求:测量用户体温,发现体温高于37度就报警。
double t = 36.9;
if(t > 37){
System.out.println("这个人的温度异常,把他赶紧带走~~");
}
// if 第二种形式 (特点:如果,否则)
// 需求2:发红包90元,假设你的钱包余额是90元
// 如果余额足够 就触发 发红包的动作,如果余额不够,则提示:余额不足。
double money = 19;
if(money >= 90){
System.out.println("发红包成功了~");
}else {
System.out.println("余额不足~~");
}
}
}
if 第三种形式的代码格式(特点:多个如果,一个否则)

/**
目标:掌握if分支的使用和应用场景
*/
public class IfIOperationDemo1 {
public static void main(String[] args) {
// if 第一种形式 (特点:只有如果)
// 需求:测量用户体温,发现体温高于37度就报警。
double t = 36.9;
if(t > 37){
System.out.println("这个人的温度异常,把他赶紧带走~~");
}
// if 第二种形式 (特点:如果,否则)
// 需求2:发红包90元,假设你的钱包余额是90元
// 如果余额足够 就触发 发红包的动作,如果余额不够,则提示:余额不足。
double money = 19;
if(money >= 90){
System.out.println("发红包成功了~");
}else {
System.out.println("余额不足~~");
}
// if 第三种形式的代码格式(特点:多个如果,一个否则)
// 需求3:某个公司有一个绩效系统,根据员工的打分输出对应的绩效级别。
// [0,60) D [60,80) C [80,90) B [90,100] A
int score = 33;
if(score >= 0 && score < 60) {
System.out.println("您的绩效级别是: D");
}else if(score >= 60 && score < 80){
System.out.println("您的绩效级别是: C");
}else if(score >= 80 && score < 90){
System.out.println("您的绩效级别是: B");
}else if(score >= 90 && score <= 100){
System.out.println("您的绩效级别是: A");
}else {
System.out.println("您录入的分数有毛病~~");
}
}
}
6. if 使用的几个常见问题
1️⃣ 问题1 ❓
- 第1个问题:if的
()
后面不能写分号;
否则if下面的语句与if无关

2️⃣ 问题2 ❓
- 第2个问题:if后面的大括号,如果只有一行代码,大括号可以省略初学者不建议省略

if 分支小结
if分支有什么作用?举几个应用场景?
- if作用:if分支可以根据条件,选择执行某段程序
- if应用场景
- 比如1:测量用户体温,发现体温高于37度就报警
- 比如2:发红包,你的钱包余额是99元,现在要发出90元
- 比如3: 根据员工的绩效打分输出对应的绩效级别
- 比如4:如果用户名和密码正确,登录成功
if分支的格式有3种:
- if 第一种形式 (特点:只有如果)
- if 第二种形式 (特点:如果,否则)
- if 第三种形式的代码格式(特点:多个如果,一个否则)
课堂练习
案例1:
案例1:键盘录入考试成绩,根据成绩所在的区间,程序打印出不同的奖励机制:
如果分数:[95-100]---自行车
如果分数:[90-94]---游乐园
如果分数:[80-89]---变形金刚
如果分数:[0-80]---棍棒伺候
提示:
- 键盘录入考试成绩
- 由于奖励种类较多,属于多种判断,采用if...else...if格式实现
- 为每种判断设置对应的条件
- 为每种判断设置对应的奖励
案例2:

案例2:键盘录入密码, 如果密码为 111111(暂时使用int接收), 程序输出密码正确,否则输出密码有误
提示:
- 使用Scanner录入用户输入的密码,并使用变量接受
- 使用 if...else 组织程序逻辑
1.2 switch分支
switch分支
分支结构的第二种形式——switch分支。
switch 分支的作用:是通过比较值来决定执行哪条分支代码。
涉及单词: switch(转换) case(例子) default(默认) break(跳出)
1. switch分支的执行流程

代码操作
下面通过案例来演示一下
相关信息
需求:做个电子备忘录,在控制台分别输出周一到周五的工作安排
- 周一:埋头苦干,解决bug
- 周二:请求大牛程序员帮忙
- 周三:今晚啤酒、龙虾、小烧烤
- 周四:主动帮助新来的女程序解决bug
- 周五:今晚吃鸡
- 周六:与王婆介绍的小芳相亲
- 周日:郁郁寡欢、准备上班。
代码如下:👇
String week = "周三";
switch (week){
case "周一":
System.out.println("埋头苦干,解决bug");
break;
case "周二":
System.out.println("请求大牛程序员帮忙");
break;
case "周三":
System.out.println("今晚啤酒、龙虾、小烧烤");
break;
case "周四":
System.out.println("主动帮助新来的女程序解决bug");
break;
case "周五":
System.out.println("今晚吃鸡");
break;
case "周六":
System.out.println("与王婆介绍的小芳相亲");
break;
case "周日":
System.out.println("郁郁寡欢、准备上班");
break;
default:
System.out.println("您输入的星期信息不存在~~~");
}
总结
如果单从功能上来讲,if 分支 的功能是更加强大的,switch分支能做的事情if 分支都能做。但是具体用哪一种分支形式,也是有一些使用原则的
- 如果是对一个范围 进行判断,建议使用if分支 结构
- 如果是与一个一个的值 比较的时候,建议使用switch 分支结构
课堂作业
场景1:通过Scanner接收键盘输入季节字符串,根据季节,输出 春天播种,夏天灌溉 秋天收获 冬天仓储 使用Switch case break 输出
场景2:双十一 满减活动:
- 满1000 减少100 ;
- 满2000 减少150 ;
- 满3000 减少320 ;
- 满10000 减少1000 ;
使用if 和else if else 输出活动情况。
应对面试 ⚠️
1.3 switch 注意事项注意事项
各位同学,接下来我们学习swtich的注意事项。同学们掌握这些注意事项之后,就可以避免入坑了,也可以应对一些面试笔试题。
注意事项
- 表达式类型只能是byte、short、int、char
- JDK5开始支持枚举,JDK7开始支持String
- 不支持double、float、long
- case给出的值不允许重复 ,且只能是字面量,不能是变量。
- 正常使用switch的时候,不要忘记写break,否则会出现穿透现象
1. 演示switch语句匹配的数据类型
如果下图所示,可以自己分别用变量a、b放在switch语句中匹配试一试,如果遇到不支持的写法,IDEA会报错的。

2. 演示case后面的值,只能是字面量不能是变量
也可以自己试试,下图箭头指向的位置只能写字面量,不能写变量

3. 演示case穿透现象
当switch语句中没有遇到break,就会直接穿透到下一个case语句执行,直到遇到break为止。
这种语法设计也是有它的用处的,当多个case语句想要执行同一段代码时,可以利用case穿透现象 ,提高代码复用性。
比如:我们下面程序中,想要让周二、周三、周四,都请大牛程序员来写代码。

二、循环结构 ❤️
2.1 for循环
for循环
1. for循环的格式和流程
为了让大家更直观的理解for循环的执行流程,我们直接来看具体的案例代码。
比如:我们想要在控制台打印输出3个HelloWorld 🎯
//需求:打印3行Hello World
for(int i = 0; i < 3; i++) {
System.out.println("Hello World");
}
如下图所示,是按照下面的① ② ③ ④, ② ③ ④... 的顺序来执行的: 👇
- 当②条件为true时,再依次执行③④代码,然后回到②继续判断
- 当②条件为false时,就结束循环

具体执行的每一步可以看下面的图解

通过上面的案例演示,最后我们再总结一下for循环的格式
//for循环格式:
for (初始化语句; 循环条件; 迭代语句) {
循环体语句(重复执行的代码);
}
初始化语句:一般是定义一个变量,并给初始值
循环条件:一般是一个关系表达式,结果必须是true或者false
迭代语句:用于对条件进行控制,一般是自增或者自减
循环语句体:需要重复执行的代码
特点:其实只要是重复做的事情,都可以用循环语句来做
比如:在京东的网页上展示100台手机信息,我们只需要把展示数据的代码写一份,重复执行就可以了。

再比如:再我们教学管理系统中,有很多班级需要展示在页面上,我们没必要每一个班级都写一份展示数据代码,只需要写一份重复执行就可以了。

代码操作
for循环案例案例
需求:求1~100中所有整数的和
通过这个案例,主要是让同学们掌握一种使用程序来求和的思想。
//1.掌握使用for循环批量产生数据。
for (int i = 1; i <= 100; i++) {
System.out.println(i);
}
// 求和的思路分析:
// 1. 首先需要定义一个求和变量,一般命名为sum
// 2. 再遍历得到所有需要求和的数据(1~100之间的所有整数)
// 3. 让需要求和的数据和sum累加,
// 结果:所有数据累加完之后最终sum就是所有数据的和
//2.需求:求1~100中所有整数的和
int sum = 0;
//定义一个循环,先产生1-100,这100个数
for (int i = 1; i <= 100; i++) {
//每产生一个数据,就把这个数和sum累加
sum += i; //sum = sum + i;
}
System.out.println("1-100的数据和:" + sum);
分析上面代码的执行过程:
i=1时:sum=0+1; sum=1;
i=2时:sum=1+2; sum=3;
i=3时:sum=3+3; sum=6;
i=4时:sum=6+4; sum=10;
...
i=100时: sum+=99; sum=5050
需求:求1~100之间奇数的和
1. 代码写法一
// 求奇数和的思路(只是求和的数据变成了奇数,思路和前面没有变化)
// 1)首先需要定义一个求和变量,这里命名为sum2
// 2)再遍历得到所有需要求和的数据(1~100之间的所有整数)
// 3)在求和之前先对数据判断,如果是奇数,才和sum1累加;否则什么也不干
// 结果:所有数据累加完之后最终sum1就是所有数据的和
//1)首先需要定义一个求和变量,这里命名为sum2
int sum2 = 0;
//2)再遍历得到所有需要求和的数据(1~100之间的所有整数)
for (int i = 1; i <= 100; i++) {
//i = 1 2 3 4 5 6 ... 99 100
//3)在求和之前先对数据判断,如果是奇数,才和sum1累加;否则什么也不干
if(i % 2 == 1){
// i = 1 3 5 7 9 ... 99
sum2 += i;
}
}
System.out.println("1-100之间的奇数和:" + sum2);
2. 代码写法二
// 求奇数和的思路(只是求和的数据变成了奇数,思路和前面没有变化)
// 1)首先需要定义一个求和变量,这里命名为sum1
// 2)再遍历得到所有需要求和的数据(1~100之间的所有奇数)
// 3)让需要求和的数据和sum1累加,
// 结果:所有数据累加完之后最终sum1就是所有数据的和
//1)定义一个变量用于求和
int sum1 = 0;
//2)定义一个循环产生1-100之间的奇数
for (int i = 1; i < 100; i+=2) {
// i = 1 3 5 7 ...
//3)让需要求和的数据和sum1累加,
sum1 += i;
}
System.out.println("1-100之间的奇数和:" + sum1);
以上代码的执行流程分析
初始化sum1=0;
当i=1时:sum1+=1; sum1=1;
当i=3时:sum1+=3; sum1=4;
当i=5时:sum1+=5; sum1=9;
...
当i=99时:sum1+=99; sum1=2500
总结
课堂作业
- 在控制台打印输出30个 我 爱 java
- 求1~100中所有整数的和
- 求1~100之间偶数的和
- 在控制台输出所有的“水仙花数”,水仙花数必须满足如下2个要求:?
- 水仙花数是一个三位数(100-999)
- 水仙花数的个位、十位、百位的数字立方和等于原数例如:1^3 + 5^3+ 3^3 = 153,说明153是个水仙花数
代码获取三位数的百位、十位、个位
i为100 到 999 的数字
int ge = i % 10;
int shi = (i % 100) / 10;
int bai = i / 100;
2.2 while循环
while循环
各位同学,接下来我们学习第二种循环结构——while循环。
我们先来认识一下while循环长什么样子,然后按照格式写一个while循环的基础案例

/**
目标:掌握while循环的格式和执行流程
*/
public class WhileTest7 {
public static void main(String[] args) {
int i=0; //初始化语句
while (i<3){//循环条件,不满足该条件,循环结束
System.out.println("hello world "+i);//循环体语句
i++;//迭代语句
}
}
}
代码的执行流程如下图所示:👇
- 按照① ②③④ ②③④ ... 的流程执行
- 如果②步骤为true,才循环执行③④步骤
- 如果②步骤为false,则循环结束


总结
for、while如何选择
学到这里,细心的同学可能会发现while循环和for循环的执行流程是一样的。那他们是不是可以通用呢?
- 从功能来说:能够用for循环做的,都能用while循环做。
- 使用规范上来说:
- 知道循环几次,建议使用for;
- 不知道循环几次 ,建议使用while
课堂作业
- while循环和for循环 有什么区别? 🎤
2.3 折纸案例 ✏️ 🍐
折纸案例

需求:世界最高山峰珠穆朗玛峰高度是:8848.86米=8848860毫米, 假如我有一张足够大的它的厚度是0.1毫米。
请问:该纸张折叠多少次,可以折成珠穆朗玛峰的高度?
分析流程
分析:首先由于不知道折叠多少次,我们可以选择用while循环
- 1)纸张的初始化厚度为0.1毫米,珠峰的高度为8848860毫米
double peakHeight = 8848860;
double paperThickness = 0.1;
- 2)每次折叠纸张的厚度为原来的两倍,这是需要循环执行的
while(纸张厚度<8848860){
纸张厚度*=2;
}
- 3)需要求折叠的次数,可以用一个变量来记录折叠的次数
int 次数 = 0;
while(纸张厚度<8848860){
纸张厚度*=2;
次数++; //每次折叠次数累加
}
结果:等循环结束之后,打印记录次数的值,就是折叠多少次了。
按照上面分析的思路把代码写出来 ✏️
// 1、定义变量记住珠穆朗玛峰的高度和纸张的高度。单位为毫米
double peakHeight = 8848860;
double paperThickness = 0.1;
// 3、定义一个变量count用于记住纸张折叠了多少次
int count = 0;
// 2、定义while循环控制纸张开始折叠
while (paperThickness < peakHeight) {
// 把纸张进行折叠,把纸张的厚度变成原来的2倍。
paperThickness = paperThickness * 2;
count++;
}
System.out.println("需要折叠多少次:" + count);
System.out.println("最终纸张的厚度是:" + paperThickness);
2.4 do-while循环 👈
do-while循环

如下图所示:do-while循环的执行流程,是按照① ②③④ ②③④... 的顺序执行的。
我们会发现,do-while循环的特点是先执行,再判断的。即使条件不成立,也会先执行一次。

三种循环对比
for循环 和 while循环(先判断后执行);
- do...while (先执行后判断)
for循环和while循环的执行流程是一模一样的,
- 功能上无区别,for能做的while也能做 ,反之亦然。
- 如果已知循环次数建议使用for循环,如果不清楚要循环多少次建议使用while循环 。
如:急诊中心的号,不知道每天有多少病人
for循环中控制循环的变量只在循环中使用
int i 外面不可以用了
- while循环中,控制循环的变量在循环后还可以继续使用
int i 后面还可以用
2.5 死循环和循环嵌套和跳转语句
死循环
同学们在写代码时,可能一不小心把代码写成了死循环,所谓死循环就是停不下来的循环。
接下来,带着同学们认识几种死循环的写法。然后再说一下死循环有什么用。
//for死循环
for ( ; ; ){
System.out.println("Hello World1");
}
//while死循环
while (true) {
System.out.println("Hello World2");
}
//do-while死循环
do {
System.out.println("Hello World3");
}while (true);
死循环有什么应用场景呢?
最典型的是可以用死循环来做服务器程序, 比如百度的服务器程序就是一直在执行的,你随时都可以通过浏览器去访问百度。如果哪一天百度的服务器停止了运行,有就意味着所有的人都永不了百度提供的服务了。
对于这样的应用我们目前了解一下就可以了。对于目前来说我们只要知道代码格式该怎么写,能达到什么效果就行。
循环嵌套
各位同学,接下来我们学习一种在实际工作中很常用的循环形式——循环嵌套。
所谓循环嵌套,就是一个循环中又包含另一个循环(就是同学们常说的,套娃_),下面我们通过案例代码演示一下。

循环嵌套执行流程:外部循环每循环一次,内部循环会全部执行完一轮。
i=0时; i<3为true; 进入循环
//j的取值从0到5,执行一轮,打印5次"我爱你"
for(int j = 1; j <= 5; j++) {
System.out.println("我爱你:" + i);
}
内层循环执行完之后,执行外层的i++; i的值1
i=1时:i<3为true; 进入循环
//j的取值从0到5,又执行一轮,打印5次"我爱你"
for(int j = 1; j <= 5; j++) {
System.out.println("我爱你:" + i);
}
内层循环执行完之后,执行外层的i++; i的值2
i=2时:i<3为true; 进入循环
//j的取值从0到5,再执行一轮,打印5次"我爱你"
for(int j = 1; j <= 5; j++) {
System.out.println("我爱你:" + i);
}
内层循环执行完之后,执行外层的i++; i的值3
i=3时:i<3为false; 外层循环结束
理解问循环嵌套的执行流程之后,我们再写一个案例来巩固一下 🎯
需求:在控制台使用 * 打印出4行5列的矩形
****
****
****
****
//1)先写一个循环用来在一行中打印5个"*"
for (int j = 1; j <= 5; j++) {
System.out.print("*"); // 不换行
}
System.out.println(); //换行
System.out.println("-----------------");
//2)再将第一步的代码套一层循环,执行4次,就可以打印4行
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= 5; j++) {
System.out.print("*"); // 不换行
}
System.out.println(); //换行
}
总结一下,对于嵌套循环重点理解这句话:外部循环每循环一次,内部循环会全部执行完一轮。
跳转语句 break 、continue
前面我们学习了循环结构,在中间我们还接触了死循环的一些形式,那么我想要在循环过程中提前跳出循环怎么做呢?
这里就需要用到跳转语句,需要用到break和continue两个关键字。我们先来认识一下这两个关键字的作用
- break作用:跳出并结束当前所在循环的执行
- continue作用:结束本次循环,进入下一次循环
案例1:演示break的使用,提前终止循环的执行
// 1、break:跳出并结束当前所在循环的执行。
// 场景:假如你有老婆了,你犯错了,你老婆罚你说:5句我爱你
// 说到第三句的时候心软了,让你别再说了。
for (int i = 1; i <= 5; i++) {
System.out.println("我爱你:" + i);
if(i == 3){
// 说明已经说完了第三句了,心软了。
break; // 跳出并结束当前所在循环的执行。
}
}
案例2:演示continue的使用,结束循环中的一次,继续下一次循环
// 2、continue:跳出当前循环的当次执行,直接进入循环的下一次执行。
// 场景: 假如你有老婆,你犯错了,你老婆罚你洗碗5天。
// 第三天的时候,你表现很好,第三天不用洗碗,但是不解恨,第四天还是要继续的。
for (int i = 1; i <= 5; i++) {
if(i == 3) {
// 已经到了第三天,第三天不用洗的。
continue;
}
System.out.println("洗碗:" + i);
}
需要注意的是break和continue不是任何地方都可以使用的


总结
课堂作业
- 死循环有什么特点🎤
- 下列循环会打印多少次 i love java 🎤
- 需求:在控制台使用 * 打印出3行5列的矩形
*****
*****
*****
- break 、continue什么含义,有什么注意事项?
2.10 循环结构总结
问题
什么是流程控制?
流程控制是用来控制程序的执行顺序的
分支结构if和switch,如何选择?
- if分支:一般用于对一个范围进行判断
3<a<8
- switch分支:对一个一个值进行匹配
a=4或者a=5或者a=6或者a=7
for循环和while循环、do-while如何循环?
- 知道循环次数用for、
- 不知道循环次数用while
- 想要先执行,再判断,用do-while
三、生成随机数 🚩
1.1 如何产生一个随机数
随机数
各位同学,接下来我们再学习一个新的知识——生成随机数。
生成随机数其实在很多场景下都很实用,比如:
- 在课堂上可以写一个随机点名器点同学起来回答问题
- 公司年会可以随机抽奖等
生成随机数的功能,其实 Java已经给我们提供了,在JDK中提供了一个类叫做Random,我们只需要调用Random这个类提供的功能就可以了。

// 目标:掌握使用Random生成随机数的步骤。
// 1、导包。import java.util.Random; (idea会自动完成)
import java.util.Random;
public class RandomDemo1 {
public static void main(String[] args) {
// 2、创建一个Random对象,用于生成随机数。
Random r = new Random();
// 3、调用Random提供的功能:nextInt得到随机数。
for (int i = 1; i <= 20; i++) {
int data = r.nextInt(10); //获取0-9的随机数
System.out.println(data);
}
}
}
1.2 猜数字小游戏
各位同学,接下来我们通过一个案例把前面的流程控制、跳转语句、随机数综合运用一下;
如果能把这个案例写出来,说明你对今天的知识点掌握得挺好了。

需求:
随机生成一个1-100之间的数据,提示用户猜测,猜大提示过大,猜小提示过小,直到猜中 结束游戏
分析:
1.先随机生成一个1-100之间的数据。
谁可以帮你生成随机数啊? 是不是要用到Random?
2.定义一个死循环让用户可以一直猜测。
用户猜的数据从哪里来啊? 是不是要用到Scanner?
3.在死循环里,每次让用户录入的数据和随机数进行比较
如果比随机数大:提示猜大了
如果比随机数小:提示猜小了
如果和随机数相同:提示恭喜你猜中了
import java.util.Random;
import java.util.Scanner;
public class RandomTest2 {
public static void main(String[] args) {
// 1. 随机产生一个1-100之间的数据,做为中奖号码。
Random r = new Random();
int luckNumber = r.nextInt(100) + 1; //产生1-100数字
// 1.1 获取键盘数据数据,模拟用户猜的数字
Scanner sc = new Scanner(System.in);
// 2. 定义一个死循环,让用户不断的猜测数据
while (true) {
// 提示用户猜测
System.out.println("请您输入您猜测的数据:");
// 获取键盘输入数据
int guessNumber = sc.nextInt();
// 3. 判断用户猜测的数字与幸运号码的大小情况
if(guessNumber > luckNumber){
System.out.println("您猜测的数字过大~~");
}else if(guessNumber < luckNumber){
System.out.println("您猜测的数字过小~~");zhe
}else {
System.out.println("恭喜您,猜测成功了,可以买单了~~");
break; // 结束死循环
}
}
}
}
总结
课堂作业
- 练习一下猜字小游戏案例,巩固下随机数+while循环+if分支+break跳出?🎤
到此,恭喜小伙伴们,今天所有的内容就学习完了,加油奥利给!!!🎉
来做点作业巩固一下吧!!!✏️ 💪