今日内容
- for循环
- while循环
- do...while循环
- 控制跳转语句
教学目标
- 能够运用switch语句进行编程
- 能够理解for循环格式和执行流程
- 能够在循环中加入判断条件并求和
- 能够完成水仙花数
- 能够理解while循环的基本使用和执行流程
- 能够知道do..while循环的格式和执行流程
- 能够知道break和continue的效果
分支语句-switch语句
格式
switch (表达式) {
case 1:
语句体1;
break;
case 2:
语句体2;
break;
...
default:
语句体n+1;
break;
}
格式说明:
- 表达式:(将要匹配的值) 取值为byte、short、int、char,JDK5以后可以是枚举,JDK7以后可以是String。
- case:后面跟的是要和表达式进行比较的值 (被匹配的值)。
- break:表示中断,结束的意思,用来结束switch语句。
- default:表示所有情况都不匹配的时候,就执行该处的内容,和if语句的else相似。
执行流程:
① 首先计算出表达式的值
② 其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结 束。
③ 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。
注意事项:
- case给出的值不允许重复
- case后面的值只能是常量,不能是变量
案例:根据数据输出星期
int week = 8;
switch(week){
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
case 5:
System.out.println("星期五");
break;
case 6:
System.out.println("星期六");
break;
case 7:
System.out.println("星期日");
break;
default:
System.out.println("数据有误");
break;
}
第七章 循环
概述:
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句。
Java中循环的分类:
- for循环
- while循环
- do...while循环
7.1 for循环
7.1.1 for循环语句格式
for (初始化语句;条件判断语句;条件控制语句) {
循环体语句;
}
格式解释:
- 初始化语句: 用于表示循环开启时的起始状态,简单说就是循环开始的时候什么样
- 条件判断语句:用于表示循环反复执行的条件,简单说就是判断循环是否能一直执行下去
- 循环体语句: 用于表示循环反复执行的内容,简单说就是循环反复执行的事情
- 条件控制语句:用于表示循环执行中每次变化的内容,简单说就是控制循环是否能执行下去
7.1.2 for循环执行流程
①执行初始化语句
②执行条件判断语句,看其结果是true还是false
如果是false,循环结束
如果是true,继续执行
③执行循环体语句
④执行条件控制语句
⑤回到②继续
7.1.4 练习:
- 需求: 请使用循环, 在控制台打印出 10 次 黑马程序员.
- 实例代码:
public class Test1 {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
System.out.println("黑马程序员");
}
}
}
7.1.5 输出数据 1-3 和 3-1
- 需求:在控制台输出1-3 和 3-1 的数据
- 示例代码:
public class ForTest01 {
public static void main(String[] args) {
//需求:输出数据1-3
for(int i=1; i<=3; i++) {
System.out.println(i);
}
System.out.println("--------");
//需求:输出数据3-1
for(int i=3; i>=1; i--) {
System.out.println(i);
}
}
}
7.1.4 练习:
- 需求:请使用 Java 程序,在控制台实现出如下效果
- 运行效果:
干饭倒计时:10秒
干饭倒计时:9秒
干饭倒计时:8秒
干饭倒计时:7秒
干饭倒计时:6秒
干饭倒计时:5秒
干饭倒计时:4秒
干饭倒计时:3秒
干饭倒计时:2秒
干饭倒计时:1秒
终于等到了饭点,干饭人干饭时间!
- 示例代码:
public class Test2 {
public static void main(String[] args) {
for (int i = 10; i >= 1; i--) {
System.out.println("干饭倒计时:" + i + "秒");
}
System.out.println("终于等到了饭点,干饭人干饭时间!");
}
}
7.1.5 求1-100之间的偶数和
- 需求:求1-100之间的偶数和,并把求和结果在控制台输出
- 示例代码:
public class ForTest03 {
public static void main(String[] args) {
//求和的最终结果必须保存起来,需要定义一个变量,用于保存求和的结果,初始值为0
int sum = 0;
for(int i=1; i<=100; i++) {
//对1-100的偶数求和,需要对求和操作添加限制条件,判断是否是偶数
if(i%2 == 0) {
sum += i;
}
}
//当循环执行完毕时,将最终数据打印出来
System.out.println("1-100之间的偶数和是:" + sum);
}
}
7.1.6 水仙花数
- 需求:在控制台输出所有的“水仙花数”
- 解释:什么是水仙花数?
-
- 水仙花数,指的是一个三位数,个位、十位、百位的数字立方和等于原数
-
-
- 例如
153 3*3*3 + 5*5*5 + 1*1*1 = 153
- 例如
-
- 思路:
-
- 获取所有的三位数,准备进行筛选,最小的三位数为100,最大的三位数为999,使用for循环获取
- 获取每一个三位数的个位,十位,百位,做if语句判断是否是水仙花数
- 示例代码
public class ForTest04 {
public static void main(String[] args) {
//输出所有的水仙花数必然要使用到循环,遍历所有的三位数,三位数从100开始,到999结束
for(int i=100; i<1000; i++) {
//在计算之前获取三位数中每个位上的值
int ge = i%10;
int shi = i/10%10;
int bai = i/10/10%10;
//判定条件是将三位数中的每个数值取出来,计算立方和后与原始数字比较是否相等
if(ge*ge*ge + shi*shi*shi + bai*bai*bai == i) {
//输出满足条件的数字就是水仙花数
System.out.println(i);
}
}
}
}
7.1.7 计数器思想
- 需求:在控制台输出所有的“水仙花数”,并统计个数
- 示例代码:
public class Demo6For {
/*
分析:
1. 定义变量count,用于保存“打印过”的数量,初始值为0
2. 在判定和打印水仙花数的过程中, 打印后让count变量+1,记录打印过的数量
*/
public static void main(String[] args){
// 1. 定义变量count,用于保存“打印过”的数量,初始值为0
int count = 0;
for(int i = 100; i <= 999; i++){
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 10 / 10 % 10;
if( (ge*ge*ge + shi*shi*shi + bai*bai*bai) == i){
// 2. 在判定和打印水仙花数的过程中, 打印后让count变量+1,记录打印过的数量
System.out.println(i);
count++;
}
}
}
}
- 本题要点:
-
- 今后如果需求带有统计xxx,请先想到计数器变量
7.1.8 for循环注意事项
- 循环 { } 中定义的变量,在每一轮循环结束后,都会从内存中释放
- 循环 ( ) 中定义的变量,在整个循环结束后,都会从内存中释放
- 示例代码
for (int i = 1; i <= 5; i++) {
int a = 10;
System.out.println(a);
}
//System.out.println(i); 循环外面是无法输出的
//System.out.println(a); 循环外面是无法输出的
- 循环语句 ( ) 和 { } 之间不要写分号
for (int i = 1; i <= 5; i++); {
System.out.println("HelloWorld");
}
7.1.9 循环嵌套
在循环语句中, 继续出现循环语句。
代码示例:
for(int i = 1; i <= 5; i++) {
for(int j = 1; j <= 5; j++) {
System.out.println("HelloWorld");
}
}
循环嵌套的核心:
外循环执行一次, 内循环执行一圈
练习:打印出 4 行 5 列的 *
for(int i = 0; i < 4; i++){
for(int j = 0; j < 5; j++){
// j = 0 1 2 3 4
System.out.print("*");
}
System.out.println();
}
本题核心:
内循环是表示在一行打印多少个*。表示在一行内进行的操作。
外循环是表示重复执行打印多少行。
循环过程:
外循环的第一次循环:
1,执行外循环,i = 0。
2,执行外循环的条件判断语句,结果为true。
3,进入外循环的循环体。
第一部分:在一行打印了4个*
第二部分:换行操作。
4,执行外循环的条件控制语句i++。i由0变成1
外循环的第二次循环:
1,执行外循环的条件判断语句,结果为true。
2,进入外循环的循环体。
第一部分:在第二行打印了4个*
第二部分:换行操作。
3,执行外循环的条件控制语句i++。i由1变成2
同理,外循环的第三次循环,就是在第三行打印了4个*
同理,外循环的第四次循环,就是在第四行打印了4个*
当第四次循环执行完毕后,此时循环就结束了。
7.2 while循环
7.2.1 while循环语句格式
初始化语句;
while (条件判断语句) {
循环体语句;
条件控制语句;
}
7.2.2 while循环执行流程
①执行初始化语句
②执行条件判断语句,看其结果是true还是false
如果是false,循环结束
如果是true,继续执行
③执行循环体语句
④执行条件控制语句
⑤回到②继续
示例代码:
public class WhileDemo {
public static void main(String[] args) {
//需求:在控制台输出3次 黑马程序员
//while循环实现
int j = 1;
while(j<=3) {
System.out.println("黑马程序员");
j++;
}
}
}
7.2.3 练习:
- 需求:求出1-100之间的奇数和,要求使用 while 循环
- 分析:
①定义求和变量 sum,准备记录累加的结果
②使用 while 循环,分别获取数据 1 – 100
③循环使用 if 语句,筛选出奇数数据
④将每一个奇数数据,和 sum 变量进行累加
⑤循环结束后,打印求和后的结果
- 示例代码:
public class Test4 {
public static void main(String[] args) {
// 1. 定义求和变量
int sum = 0;
// 2. 循环获取数据1-100
int i = 1;
while (i <= 100) {
// 3. 找出奇数元素
if (i % 2 == 1) {
// 4. 累加
sum += i;
}
i++;
}
// 5. 打印求和结果
System.out.println(sum);
}
}
7.3 do...while循环
7.3.1 do...while循环语句格式
初始化语句;
do {
循环体语句;
条件控制语句;
}while(条件判断语句);
7.3.2 do...while循环语句执行流程
① 执行初始化语句
② 执行循环体语句
③ 执行条件控制语句
④ 执行条件判断语句,看其结果是true还是false
如果是false,循环结束
如果是true,继续执行
⑤ 回到②继续
示例代码:
public class DoWhileDemo {
public static void main(String[] args) {
//需求:在控制台输出5次"HelloWorld"
//for循环实现
for(int i=1; i<=5; i++) {
System.out.println("HelloWorld");
}
System.out.println("--------");
//do...while循环实现
int j = 1;
do {
System.out.println("HelloWorld");
j++;
}while(j<=5);
}
}
7.3.3 三种循环的区别
- for循环 和 while循环(先判断后执行)
- do...while (先执行后判断)
- for循环和while的区别
-
- for循环中,控制循环的变量, 因为归属for循环的语法结构中,在for循环结束后,就不能再次被访问到了
-
- while循环中,控制循环的变量,对于while循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用
- 注意:手动改写 for 循环格式后,将不存在区别,for 循环能够实现的 while 都能实现,反之也一样
int i = 0;
for(; i < 4; i++;) {
}
System.out.println(i); // 正常使用
7.4 跳转控制语句
7.4.1 跳转控制语句
概述:
跳转控制语句是用于在循环的过程中,控制循环运行的。
分类:
- continue 【跳过】某次循环体内容的执行,继续下一次的执行
- break 【终止】循环体内容的执行,也就是说结束当前的整个循环
代码示例1:
需求: 在10点的时候结束学习
public class Demo1Break {
public static void main(String[] args) {
for (int i = 7; i <= 12; i++) {
if (i == 10) {
break;//用于结束循环或switch语句.
}
System.out.println(i + "点正在学习");
}
}
}
代码示例2:
需求: 遇到 3 17 19 号同学跳过.
public class Demo2Continue {
/*
需求: 遇到 2 3 号同学跳过.
*/
public static void main(String[] args) {
for(int i = 1; i <= 10; i++){
if(i == 2 || i == 3 ){
//continue: 跳过某次循环, 继续下一次循环.
continue;
}
System.out.println("老师正在给第" + i + "号同学发冰棍");
}
}
}
7.4.2 标号
break和continue都只能操作自己所在的那一层循环。如果想要操作指定的一层, 可以使用标号.
lo:for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 3; j++) {
if (j == 2) {
break lo;
}
System.out.println("黑马程序员");
}
}
7.5 Random 产生随机数
- 介绍:Random 跟 Scanner 类似,也是 Java 写好的类,其作用是产生随机数
7.5.1 Random 生成随机数的三个步骤
- 找符咒
import java.util.Random;
- 召唤精灵
Random r = new Random();
- 指挥精灵干活
int num = r.nextInt(10);
小扩号中的数字代表一个范围, 如果传入10.
生成的就是10以内的随机数, 也就是 0-9
- 生成 1 - 100 之间的随机数
int num = r.nextInt(100) + 1;
步骤1: r.nextInt(100) 产生 0~99的随机数
步骤2: 对产生的随机数做+1操作
0 + 1 ---- 1
1 + 1 ---- 2
..
98 + 1 --- 99
99 + 1 --- 100
步骤3: 使用num变量接收
7.5.2 猜数字小游戏
- 实现思路 :
-
- 使用 Random 产生 1-100之间的随机数
-
- 使用 Scanner 键盘录入用户猜的数据
-
- 使用 if 语句进行比对
-
- 将【录入数据】+ 【 if 判断】 使用循环包裹
-
- 猜中后,通过break结束循环
- 代码实现:
public class Test9 {
public static void main(String[] args) {
Random r = new Random();
Scanner sc = new Scanner(System.in);
// 1. 使用 Random 产生 1-100之间的随机数
int randomNum = r.nextInt(100) + 1;
// 2. 使用 Scanner 键盘录入用户猜的数据
System.out.println("请输入:");
// 4. 将【录入数据】+ 【if 判断】 使用循环包裹
while (true) {
int scNum = sc.nextInt();
// 3. 使用 if 语句进行比对
if (scNum > randomNum) {
System.out.println("猜大了");
} else if (scNum < randomNum) {
System.out.println("猜小了");
} else {
System.out.println("猜中了");
// 5. 猜中后,通过break结束循环
break;
}
}
}
}