# 【循环跳转、循环嵌套、随机数】
##### 今日复习指南
~~~
1.break和continue(0.5个小时内完成,20%的内容搞定)
(1)Demo02Break.java 测试break的使用
(2)Demo04Continue.java 测试continue的使用
2.循环嵌套(半个小时内完成,20%的内容搞定):
Demo01ForFor.java 测试循环嵌套的执行流程 教练安排运动员跑圈
3.随机数(半个小时内完成,20%的内容搞定):
Demo02Random.java 随机数字的练习
4.猜数字游戏案例(1个小时内完成,40%的内容搞定):
Demo03GuessNum.java
~~~
##### 今日内容
~~~
跳出语句break,continue【重点】
循环嵌套【理解】
随机数字【重点:死格式】
猜数字案例【重点中的重点】
~~~
### 第一章 循环跳转【理解】
##### 1.1 break的介绍
~~~
break作用:
1.可以使用在switch语句中,结束switch语句
2.可以使用在循环中,结束循环
(1)本次循环不再执行
(2)无论剩余多少次循环,也不再执行,相当于从循环中跳出来,执行循环后面的其它代码
3.break不能使用在除了switch和循环之外的其它位置
~~~
##### 1.2 break的使用
~~~
public class Demo01Break {
public static void main(String[] args) {
//break;//错误的: 只能写在循环或者switch内部
for(int i = 1;i<=4;i++) {
/*
当i的值等于2时: if后面()中是true,执行if后面{}中的代码
首先: 执行输出语句
其次: 执行break,一旦执行break,本次循环的循环体中break后面的代码将不再执行,
剩余次数的循环也不再执行,直接从循环内部跳出到循环后面的其它语句执行(找老板投诉)
*/
if(i==2) {
System.out.println("发现2号包子有个大家伙," +
"非常气愤直接找老板投诉~~~~");
break;
}
System.out.println("顾客吃完第"+i+"个包子");
}
System.out.println("老板: 非常抱歉,给您赔偿2万元");
}
}
~~~
##### 图解分析:
![](https://img.kancloud.cn/f3/a5/f3a5c3dd10d1c0c703715cc95ba87573_1049x438.png)
##### 1.3 break的练习
~~~
/*
break的练习
*/
public class Demo02Break {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
/*
当i的值等于5时: if后面()中是true,执行if后面{}中的代码
就执行break,一旦执行break,本次循环的循环体中break后面的代码将不再执行,
剩余次数的循环也不再执行,直接从循环内部跳出到循环后面的其它语句执行(找老板投诉)
*/
if (i % 5 == 0) {
break;
}
System.out.println("HelloWorld...." + i);
}
System.out.println("main...end...");
}
}
~~~
##### 图解分析:
![](https://img.kancloud.cn/44/13/4413b2d4a13226a8273086ac86b7dcd4_713x432.png)
##### 1.4 continue的介绍
~~~
continue的作用:
1.只能使用在循环中,用来提前结束本次循环,继续进行下一次循环
2.不能使用在除了循环以外的其它位置
~~~
##### 1.5 continue的使用
~~~
public class Demo03Continue {
public static void main(String[] args) {
//continue;//错误的: 只能写在循环内部
for(int i = 1;i<=4;i++) {
/*
当i的值等于2时: if后面()中是true,执行if后面{}中的代码
首先: 执行输出语句
其次: 执行continue,一旦执行continue,本次循环的循环体中continue后面的代码将不再执行,
继续进行执行下一次循环的操作(步进表达式)
*/
if(i==2) {
System.out.println("把2号包弄脏了," +
"2号包子不能吃了,继续吃其它包子");
continue;
}
System.out.println("顾客吃完第"+i+"个包子");
}
System.out.println("找老板结账....");
}
}
~~~
##### 图解分析:
![](https://img.kancloud.cn/81/22/8122b57d1198984295b36aeaeb1801fe_937x521.png)
##### 1.6 continue的练习
~~~
public class Demo04Continue {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
/*
当i的值等于5或者10时: if后面()中是true,执行if后面{}中的代码
就执行continue,一旦执行continue,本次循环的循环体中continue后面的代码将不再执行(被跳过),
继续进行执行下一次循环的操作(步进表达式)
*/
if (i % 5 == 0) {
continue;
}
System.out.println("HelloWorld..." + i);
}
System.out.println("main...end...");
}
}
~~~
##### 图解分析:
![](https://img.kancloud.cn/0d/de/0dde8887f8bc0eb7836b8d31f2ac13be_955x367.png)
### 第二章 循环扩展知识点【理解】
##### 2.1 循环嵌套的概念和格式
~~~
1.概念: 使用一个循环作为另外一个循环的循环体,外面的循环称为外层循环,内部的循环称为内层循环
2.格式(for嵌套):
for(外初始化表达式1;外布尔表达式2;外步进表达式7) {
for(内初始化表达式3;内布尔表达式4;内步进表达式6){
内循环体5;
}
}
其它语句;
3.执行流程:
1,2(外层循环条件:true)
3,4(内层循环条件:true),5,6 --> 4(内层循环条件:true),5,6 --> ... --> 直到4(内层循环条件:false),说明内层循环结束, 执行7(外层循环的步进表达式)
2(外层循环条件:true)
3,4(内层循环条件:true),5,6 --> 4(内层循环条件:true),5,6 --> ... --> 直到4(内层循环条件:false),说明内层循环结束, 执行7(外层循环的步进表达式)
...
2(外层循环条件:false),结束外层for循环,执行外层for循环后面的其它语句
~~~
##### 执行流程图解:
![](https://img.kancloud.cn/a9/94/a99465af39798b9a9efebd323b083076_960x513.png)
~~~
/*
练习: 教练安排运动员跑圈,总共跑3次,每次跑3圈
1.问题:
(1)外层循环的初始化表达式 int i = 1 执行了几次? 1次
(2)内层循环的初始化表达式 int j = 1 执行了几次? 3次
(3)内层循环的循环体(运动员跑圈) 执行了几次? 9次
外层循环次数*内层循环每遍执行的次数
= 3 * 3 = 9
2.总结: 外层循环每执行一次,内层循环要执行完整的一遍(从内层循环的初始化表达式开始)
*/
public class Demo01ForFor {
public static void main(String[] args) {
/*
外层循环第一次: i的值1, i<=3 --> 1<=3 --> true,执行外层循环的循环体(内层循环)
内层循环:
j: 1,2,3 --> j<=3 --> true,执行内层循环的循环体
j: 4 --> j<=3 --> false, 结束内层循环,执行外层循环的步进表达式i++,i变成2
外层循环第二次: i的值2, i<=3 --> 2<=3 --> true,执行外层循环的循环体(内层循环)
内层循环:
j: 1,2,3 --> j<=3 --> true,执行内层循环的循环体
j: 4 --> j<=3 --> false, 结束内层循环,执行外层循环的步进表达式i++,i变成3
外层循环第三次: i的值3, i<=3 --> 3<=3 --> true,执行外层循环的循环体(内层循环)
内层循环:
j: 1,2,3 --> j<=3 --> true,执行内层循环的循环体
j: 4 --> j<=3 --> false, 结束内层循环,执行外层循环的步进表达式i++,i变成4
外层循环第四次: i的值4, i<=3 --> 4<=3 --> false,结束外层循环,不会再执行内层循环
*/
for(int i = 1;i<=3;i++) {//外层循环: 教练控制运动员跑圈的次数
System.out.println("教练安排运动员跑第"+i+"次,跑3圈");
for(int j = 1;j<=3;j++){//内层循环: 控制运动员每次跑的圈数
System.out.println((" 运动员跑第"+i+"次第" + j + "圈"));
}
}
}
}
~~~
##### 循环嵌套概念图解:
![](https://img.kancloud.cn/f8/cf/f8cf2b6b6cfa8ff542de63ef3afc333f_1336x516.png)
##### 2.2 循环嵌套打印月份
~~~
需求:
使用嵌套循环,打印2021年至2023年月份,格式:xxxx年x月
/*
需求:
使用嵌套循环,打印2021年至2023年月份,格式:xxxx年x月
问题:
1.外层循环的初始化表达式 int year = 1 执行了几次? 1次
2.内层循环的初始化表达式 int month = 1 执行了几次? 3次
3.内层循环的循环体(运动员跑圈) 执行了几次?
外层循环次数*内层循环每遍执行的次数
= 3 * 12 = 36
总结: 外层循环每执行一次,内层循环要执行完整的一遍(从内层循环的初始化表达式开始)
*/
public class Demo02ForForMonth {
public static void main(String[] args) {
for (int year = 2021; year <= 2023; year++) {//外层循环: 控制年份 2021到2023年
for (int month = 1; month <= 12; month++) {//内层循环: 控制月份,每年都有12个月 从1月到12月
System.out.println(year+"年"+month+"月");
}
}
System.out.println("main...end...");
}
}
~~~
##### 图解分析:
![](https://img.kancloud.cn/be/8f/be8f7e437fe95130dea120684cb7fd08_1326x517.png)
##### 2.3 循环嵌套模拟钟表
~~~
需求:
模拟钟表的时针和分针
时针(外层循环)走一个格,分钟(内层循环)走一圈
对应:
外层循环执行一次,内层循环执行完整的一遍
/*
需求:
模拟钟表的时针和分针
时针(外层循环)走一个格,分钟(内层循环)走一圈
对应:
外层循环执行一次,内层循环执行完整的一遍
问题:
1.外层循环的初始化表达式 int hour = 0 执行了几次? 1次
2.内层循环的初始化表达式 int minute = 0 执行了几次? 24次
3.内层循环的循环体(打印几点几分) 执行了几次?
外层循环次数*内层循环每遍执行的次数
= 24 * 60 = 1440
总结: 外层循环每执行一次,内层循环要执行完整的一遍(从内层循环的初始化表达式开始)
最后打印的最大时间是什么?
23点59分
*/
public class Demo03ForForClock {
public static void main(String[] args) {
for (int hour = 0; hour < 24; hour++) {//外层循环: 控制每天的24小时
for (int minute = 0; minute < 60; minute++) {//内层循环: 控制每小时的60分钟
System.out.println(hour+"点"+minute+"分");
}
}
System.out.println("main....end....");
}
}
~~~
##### 图解分析:
![](https://img.kancloud.cn/22/64/2264f5d440eea19950de11e9703cf55a_1242x487.png)
### 第三章 随机数【重点】
##### 3.1 随机数Random的介绍
~~~
1.概念: java.util包中有个类Random,就是专门用来产生随机数字的
2.随机数Random类的使用步骤:
java.util.Random类和java.util.Scanner类都属于引用类型,使用步骤相同,都是3个步骤
(1)导包(找到我们要使用的类):
格式: import 包名.类名;
注意:
a.java.lang包中的类,不用导包,可以直接使用
b.当前类和要使用的类,处于同一个包中,不用导包
c.快捷键: alt + 回车
Random类的导包: import java.util.Random;
(2)创建对象
格式: 类名 对象名 = new 类名(...);
类名: class关键字后面的名字叫做类名
创建键盘录入Scanner类的对象: Scanner sc = new Scanner(System.in);
注意: System.in目前是固定写法,先记住
创建产生随机数的Random类的对象: Random r = new Random();
注意: 右侧()中什么都不用写,目前是固定写法,先记住
(3)使用:
r.nextInt(): 产生一个int范围(正负21亿)内的随机数字 使用不多
r.nextInt(int类型整数数字n): 产生一个0(包含)到n(不包含n)之间的随机整数数字
举例:
r.nextInt(10): 产生一个0(包含)到10(不包含10)之间的随机数字
[0,10): 从0(包含)开始到10(不包含)
等价于
[0,9]: 从0(包含)开始到9(包含)
3.练习:
(1)产生10个int范围内的整数数字
(2)产生10个0到100之间(包含0,但是不包含100)的整数数字
(3)产生10个1到100之间(包含1,包含100)的整数数字
~~~
##### 3.2 Random类的使用
~~~
public class Demo01Random {
public static void main(String[] args) {
//创建产生随机数字的Random类的对象
Random r = new Random();
//(1)产生10个int范围内的整数数字
for (int i = 0; i < 10; i++) {
//产生1个int范围内的整数数字
int num = r.nextInt();
System.out.println(num);
}
System.out.println("-----------");
//(2)产生10个0到100之间(包含0,但是不包含100)的整数数字
for (int i = 0; i < 10; i++) {
//while(true) {
//产生1个0到100之间(包含0,但是不包含100)的整数数字
int num = r.nextInt(100);//()中写100,产生随机数字的范围0(包含0)到100(不包含)
System.out.println(num);
/*if (num == 100) {
break;
}*/
}
System.out.println("-----------");
//(3)产生5个1到5之间(包含1,包含5)的整数数字
/*
如果可以产生这些数字: 0,1,2,3,4 --->[0,4] --> [0,5) --> r.nextInt(5)
对这些数字执行加1: +1
加1后的结果: 1,2,3,4,5 --->[0,4] + 1 --> [0,5) + 1 --> r.nextInt(5) + 1
*/
for (int i = 0; i < 5; i++) {
//产生一个[0,5)之间的随机数字
/*int num = r.nextInt(5);//可能性: 0,1,2,3,4
//再把num中的数字额外增加1
int num2 = num + 1;//可能性: 1,2,3,4,5
System.out.println(num2);*/
int num3 = r.nextInt(5) + 1;
System.out.println(num3);
}
System.out.println("----------------");
//(4)产生10个1到100之间(包含1,包含100)的整数数字
/*
[1,100] --> [0,99] + 1 --> [0,100) + 1 --> r.nextInt(100) + 1
*/
for (int i = 0; i < 10; i++) {
//产生1个1到100之间(包含1,包含100)的整数数字
int num = r.nextInt(100) + 1;
System.out.println(num);
}
}
}
~~~
~~~
/*
Random类的练习
1.产生10个0到100之间(包含0,但是不包含100)的整数数字
2.产生10个1到100之间(包含1,包含100)的整数数字
3.产生10个88到188之间(包含88,包含188)的整数数字
*/
public class Demo02Random {
public static void main(String[] args) {
//创建产生随机数字的Random类的对象
Random r = new Random();
//1.产生10个0到100之间(包含0,但是不包含100)的整数数字
for (int i = 0; i < 10; i++) {
//产生1个0到100之间(包含0,但是不包含100)的整数数字
int num = r.nextInt(100);//()中写100,产生的范围: 0(包含)到100(不含100)
System.out.println(num);
}
System.out.println("-----------------");
//2.产生10个1到100之间(包含1,包含100)的整数数字
/*
如果可以产生: 0,1,2,3,... 99
额外增加1: +1
结果: 1,2,3,4,... 100
总结:
[1,100] --> [0,99] +1 --> [0,100) + 1 --> r.nextInt(100) + 1
*/
for (int i = 0; i < 10; i++) {
//产生1个1到100之间(包含1,包含100)的整数数字
int num = r.nextInt(100) + 1;
System.out.println(num);
}
System.out.println("-----------------");
//3.产生10个88到188之间(包含88,包含188)的整数数字
//[88,188] --> [0,100] + 88 --> [0,101) + 88
for (int i = 0; i < 10; i++) {
//产生1个88到188之间(包含88,包含188)的整数数字
int num = r.nextInt(101) + 88;
System.out.println(num);
}
System.out.println("-----------------");
//证明上面的公式,确实可以产生88和188的数字
while(true) {
int num = r.nextInt(101) + 88;
System.out.println(num);
if (num == 88 || num == 188) {
break;
}
}
}
}
~~~
##### 3.3 Random练习-猜数字
~~~
1.需求:程序自动生成一个1-100之间(包含1,包含100)的数字,使用程序实现猜出这个数字是多少?
2.效果:
如果猜的数字比真实数字大,提示你猜的数据大了
如果猜的数字比真实数字小,提示你猜的数据小了
如果猜的数字与真实数字相等,提示恭喜你猜中了
3.使用的知识点:
(1)使用Random类产生一个随机数字(1.导包 2.创建对象 3.调用nextInt(...))
(2)使用Random类获取键盘录入的用户猜测的数字(1.导包 2.创建对象 3.调用nextInt())
(3)用户多少次可以猜对,不确定,循环次数不确定,使用while(true)
(4)使用if语句的第三种格式,比较两个变量中数据值的大小关系
(5)如果猜对了,需要停止循环 break
4.实现步骤:
(1)创建产生随机数字的Random类的对象
(2)使用Random类的对象产生一个1-100之间(包含1,包含100)的数字,保存到int变量guessNum中,以供用户猜测
(3)创建键盘录入Scanner类的对象
(4)用户多少次可以猜对,次数是不确定的,循环次数不确定,使用while(true)或者for(;;) 推荐使用while(true)
//步骤(5)到(6)是一个循环过程,循环次数不确定,放入到while(true)中
(5)获取键盘录入的用户猜测的整数数字,保存到int变量inputNum中
(6)使用if语句的第三种格式,比较用户猜测的数字和产生的随机数字的大小关系
a.如果 用户猜测的数字 inputNum 大于 产生的随机数字 guessNum : 提示 "你猜的数据大了"
b.如果 用户猜测的数字 inputNum 小于 产生的随机数字 guessNum : 提示 "你猜的数据小了"
c.如果 用户猜测的数字 inputNum 等于 产生的随机数字 guessNum : 提示 "恭喜你猜中了",并且结束循环
~~~
##### 图解分析:
![](https://img.kancloud.cn/9f/28/9f280fa6835ae365b3a9abe124458d42_1285x526.png)
##### 实现代码:
~~~
public class Demo03GuessNum {
public static void main(String[] args) {
//(1)创建产生随机数字的Random类的对象
Random r = new Random();
//(2)使用Random类的对象产生一个1-100之间(包含1,包含100)的数字,保存到int变量guessNum中,以供用户猜测
//[1,100] --> [0,99] + 1 --> [0,100) + 1 --> r.nextInt(100) + 1
int guessNum = r.nextInt(100) + 1;
//(3)创建键盘录入Scanner类的对象
Scanner sc = new Scanner(System.in);
//(4)用户多少次可以猜对,次数是不确定的,循环次数不确定,使用while(true)或者for(;;) 推荐使用while(true)
//步骤(5)到(6)是一个循环过程,循环次数不确定,放入到while(true)中
while (true) {
//(5)获取键盘录入的用户猜测的整数数字,保存到int变量inputNum中
System.out.println("请输入您猜测的数字(1-100之间的整数):");
int inputNum = sc.nextInt();
//(6)使用if语句的第三种格式,比较用户猜测的数字和产生的随机数字的大小关系
if(inputNum > guessNum) {
//a.如果 用户猜测的数字 inputNum 大于 产生的随机数字 guessNum
//提示 "你猜的数据大了"
System.out.println("你猜的数据大了");
} else if(inputNum < guessNum) {//b.如果 用户猜测的数字 inputNum 小于 产生的随机数字 guessNum
//提示 "你猜的数据小了"
System.out.println("你猜的数据小了");
} else {
//c.如果 用户猜测的数字 inputNum 等于 产生的随机数字 guessNum : 提示 "恭喜你猜中了"
System.out.println("恭喜你猜中了");
//并且结束循环
break;
}
}
}
}
~~~
##### 总结
~~~
能够知道循环嵌套的执行流程
外层循环第一次: i的值是1 i<=2 --> 1<=2 --> true --> 执行外层循环的循环体(内层for循环)
内层循环:
j:1,2,3 --> j<=3 --> true 执行内层循环的循环体
j:4 --> j<=3 --> 4<=3 false 结束内层循环,执行外层循环的步进表达式i++,导致i的值是2
外层循环第二次: i的值是2 i<=2 --> 2<=2 --> true --> 执行外层循环的循环体(内层for循环)
内层循环:
j:1,2,3 --> j<=3 --> true 执行内层循环的循环体
j:4 --> j<=3 --> 4<=3 false 结束内层循环,执行外层循环的步进表达式i++,导致i的值是3
外层循环第三次: i的值是3 i<=2 --> 3<=2 --> false --> 结束外层for循环
执行外层for循环后面的其它语句
for(int i = 1;i<=2;i++) {//外层循环
for(int j = 1;j<=3;j++) {//内层循环
sout("Hello");
}
}
其它语句;
能够知道break和continue的作用
1.break: 结束所在的循环(本次循环不再执行,而且剩余的所有次数的循环都不再执行)
2.continue: 只结束本次循环,提前进行下一次循环
能够完成猜数字小游戏程序
//1.创建Random类的对象
Random r = new Random();
//2.产生一个[1,100]之间的随机数字
int guessNum = r.nextInt(100) + 1;
//3.创建键盘录入Scanner类的对象
Scanner sc = new Scanner(System.in);
//4.循环次数不确定,使用while(true)
while(true){
//5.获取用户键盘录入的整数数字
sout("...");
int inputNum = sc.nextInt();
//6.进行比较
if(inputNum > guessNum) {
sout("...");
} else if(inputNum < guessNum) {
sout("...");
} else {
sout("恭喜您猜对了");
//结束while死循环
break;
}
}
~~~