文章目录
day04 switch和循环
-
switch
-
理解for语句的格式和执行流程
-
随机数公式
-
理解while语句的格式和执行流程
-
了解do…while语句的格式和执行流程
-
了解跳出语句break,continue的意义
-
理解死循环的执行流程
-
理解循环嵌套的执行流程
4.1 分支结构:switch选择结构
4.1.1基本语法
-
语法格式:
switch(表达式){ case 常量值1: 语句块1; break; case 常量值2: 语句块2; break; ... default: 语句块n+1; break; }
-
执行过程:
-
(1)入口
-
①当switch(表达式)的值与case后面的某个常量值匹配,就从这个case进入;
-
②当switch(表达式)的值与case后面的所有常量值都不匹配,寻找default分支进入;不管default在哪里
-
-
(2)一旦从“入口”进入switch,就会顺序往下执行,直到遇到“出口”,即可能发生贯穿
-
(3)出口
-
①自然出口:遇到了switch的结束}
-
②中断出口:遇到了break等
-
注意:
(1)switch(表达式)的值的类型,只能是:4种基本数据类型(byte,short,int,char),两种引用数据类型(JDK1.5之后枚举、JDK1.7之后String)
(2)case后面必须是常量值,而且不能重复
-
-
语法案例演示1:
public class SwitchDemo01 { public static void main(String[] args) { //定义指定的星期 int weekday = 5; //switch语句实现选择 switch(weekday) { 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; } } }
-
语法案例演示2:case的穿透性
在switch语句中,如果case的后面不写break,将出现穿透现象,也就是一旦匹配成功,不会在判断下一个case的值,直接向后运行,直到遇到break或者整个switch语句结束,switch语句执行终止。
练习:根据指定的月份输出对应季节(switch语句)
/*
* 需求:指定一个月份,输出该月份对应的季节。
* 一年有四季
* 3,4,5 春季
* 6,7,8 夏季
* 9,10,11 秋季
* 12,1,2 冬季
*
* 分析:
* A:指定一个月份
* B:判断该月份是几月,根据月份输出对应的季节
* if
* switch
*/
public class SwitchTest02 {
public static void main(String[] args) {
//指定一个月份
int month = 5;
/*
switch(month) {
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;
case 8:
System.out.println("夏季");
break;
case 9:
System.out.println("秋季");
break;
case 10:
System.out.println("秋季");
break;
case 11:
System.out.println("秋季");
break;
case 12:
System.out.println("冬季");
break;
default:
System.out.println("你输入的月份有误");
break;
}
*/
// 改进版
switch(month) {
case 1:
case 2:
case 12:
System.out.println("冬季");
break;
case 3:
case 4:
case 5:
System.out.println("春季");
break;
case 6:
case 7:
case 8:
System.out.println("夏季");
break;
case 9:
case 10:
case 11:
System.out.println("秋季");
break;
default:
System.out.println("你输入的月份有误");
break;
}
}
}
-
常见错误实现1:
switch(month){ case 3|4|5://3|4|5 用了位运算符,11 | 100 | 101结果是 111是7 System.out.println("春季"); break; case 6|7|8://6|7|8用了位运算符,110 | 111 | 1000结果是1111是15 System.out.println("夏季"); break; case 9|10|11://9|10|11用了位运算符,1001 | 1010 | 1011结果是1011是11 System.out.println("秋季"); break; case 12|1|2://12|1|2 用了位运算符,1100 | 1 | 10 结果是1111,是15 System.out.println("冬季"); break; default: System.out.println("输入有误"); }
4.1.2 if语句与switch语句比较
-
if语句的条件是一个布尔类型值,通常根据某个判断结果进入分支,使用范围更广。
-
switch语句的条件是一个常量值(byte,short,int,char,枚举,String),一般条件是几个固定的常量值时使用switch语句。
-
如果根据进入分支的条件是几个固定的常量值,这时使用if和switch都可以,如果条件选项比较多时,适合使用switch语句(效率高)。
if是逐行判断 switch因为case后面是不变的常量 不会逐个判断直接定位相等的值
比如:当条件是x>0时,进入某分支执行代码,这时适合使用if语句,不适合使用switch语句。
4.2. 循环语句(重点+难点)
4.2.1为什么需要循环?
顺序和分支结构的程序语句只能被执行一次。
如果想要同样的操作执行多次,比如重复输出100次HelloWorld 就需要使用循环结构。
循环:满足条件反复执行的结构
Java中有三种主要的循环结构:
- for 循环
- while 循环
- do…while 循环
4.2.2 for循环
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要通过修改循环变量使得循环判断条件为false,从而结束循环,否则循环将一直执行下去,形成死循环。
-
for循环语句格式:
for(初始化语句①; 循环条件语句②; 迭代控制语句④){ 循环体语句③ } for(;;){ 循环体语句块;//如果循环体中没有跳出循环体的语句,那么就是死循环 }
注意:
(1)for(;;)中的两个;是不能多也不能少
(2)循环条件必须是boolean类型
(3)如果循环条件语句②省略的话,就默认为循环条件成立
-
执行流程:
-
第一步:执行初始化语句①,完成循环变量的初始化;
-
第二步:执行循环条件语句②,看循环条件语句的值是true,还是false;
-
如果是true,执行第三步③;
-
如果是false,循环语句中止,循环不再执行。
-
-
第三步:执行循环体语句③
-
第四步:执行迭代控制语句④,针对循环变量重新赋值
-
第五步:根据循环变量的新值,重新从第二步②开始再执行一遍
-
-
-
语法演示案例1:
打印10次的HelloWorld
public class ForDemo01 { public static void main(String[] args) { //控制台输出10次HelloWorld,不使用循环 System.out.println("HelloWorld"); System.out.println("HelloWorld"); System.out.println("HelloWorld"); System.out.println("HelloWorld"); System.out.println("HelloWorld"); System.out.println("HelloWorld"); System.out.println("HelloWorld"); System.out.println("HelloWorld"); System.out.println("HelloWorld"); System.out.println("HelloWorld"); System.out.println("-------------------------"); //用循环改进,循环10次 //定义变量从10开始,循环条件为<=10 for(int x = 1; x <= 10; x++) { System.out.println("HelloWorld"+x); } } }
-
语法演示案例2:
打印1-5和5-1
/* * 练习:利用for语句打印1-5和5-1 */ public class ForTest01 { public static void main(String[] args) { //原始做法 System.out.println(1); System.out.println(2); System.out.println(3); System.out.println(4); System.out.println(5); System.out.println("==============="); //用循环改进 for(int x=1; x<=5; x++) { System.out.println(x); } System.out.println("==============="); //1-5的数据我们获取到了,如何获取5-1呢? for(int x=5; x>=1; x--){ System.out.println(x); } } }
-
语法演示案例3:
求出1-100之间数据之和
/* * 练习:求出1-5之间数据之和 * * 分析: * 1.定义求和变量,初始化值是0 * 2.获取1-5之间的数据,用for循环实现 * 3.把每一次获取到的数据,累加起来就可以了 * 4.输出求和变量即可 */ public class ForTest02 { public static void main(String[] args) { //定义求和变量,初始化值是0 int sum = 0; //获取1-5之间的数据,用for循环实现 for(int x=1; x<=100; x++) { //把每一次获取到的数据,累加起来就可以了 //sum = sum + x; /* * 第一次:sum = 0 + 1 = 1 * 第二次:sum = 1 + 2 = 3 * 第三次:sum = 3 + 3 = 6 * 第四次:sum = 6 + 4 = 10 * 第五次:sum = 10 + 5 = 15 .。。 */ sum += x; } //输出求和结果 System.out.println("sum:" + sum); } }
- 语法演示案例4:
求出1-100之间偶数和
/*
* 练习:求出1-100之间偶数和
*
* 分析:
* 1.定义求和变量,初始化值是0
* 2.获取1-100之间的数据,用for循环实现
* 3.把获取到的数据进行判断,看是否是偶数
* 如果是,就累加
* 4.输出求和结果
*/
public class ForTest03 {
public static void main(String[] args) {
//定义求和变量,初始化值是0
int sum = 0;
//获取1-100之间的数据,用for循环实现
for(int x=1; x<=100; x++) {
//把获取到的数据进行判断,看是否是偶数
if(x % 2 == 0) {
sum += x;
}
}
//输出求和结果
System.out.println("sum:"+sum);
}
}
注意事项
- 判断条件语句无论简单还是复杂,结果是boolean类型。
- 循环体语句如果是一条语句,大括号可以省略;
如果是多条语句,大括号不能省略。建议永远不要省略。
- 一般来说:有左大括号就没有分号,有分号就没有左大括号
4.2.3 while循环
-
while循环语句标准格式:
while (循环条件语句①) { 循环体语句②; } while(true){ 循环体语句;//如果此时循环体中没有跳出循环的语句,也是死循环 }
注意:
while(循环条件)中循环条件必须是boolean类型
执行流程:
- 第一步:执行循环条件语句①,看循环条件语句的值是true,还是false;
- 如果是true,执行第二步;
- 如果是false,循环语句中止,循环不再执行。
- 第二步:执行循环体语句②;
- 第三步:循环体语句执行完后,重新从第一步开始再执行一遍
- 第一步:执行循环条件语句①,看循环条件语句的值是true,还是false;
-
while循环语句扩展格式:
初始化语句①; while (循环条件语句②) { 循环体语句③; 迭代语句④; }
执行流程:
- 第一步:执行初始化语句①,完成循环变量的初始化;
- 第二步:执行循环条件语句②,看循环条件语句的值是true,还是false;
- 如果是true,执行第三步;
- 如果是false,循环语句中止,循环不再执行。
- 第三步:执行循环体语句③
- 第四步:执行迭代语句④,针对循环变量重新赋值
- 第五步:根据循环变量的新值,重新从第二步开始再执行一遍
-
语法演示案例1:
遍历1-100之间的偶数
int num = 2; while(num<=100){ System.out.println(num); num+=2; }
-
语法演示案例2:
趣味折纸
/* * 练习:趣味折纸 * * 题目: * 一张A4纸厚度是1毫米,珠穆朗玛峰的高度8848米, 请问:将纸对折多少次可以达到珠穆朗玛峰的高度? */ public class WhileTest01 { public static void main(String[] args) { int zH = 1;//单位是毫米 int sH = 8848 * 100 * 10; int count = 0; //循环代表的是不断的对折 while(zH < sH){ //对折 //zH = zH * 2; zH *= 2; count++; } System.out.println(count); } }
4.2.4 do…while循环
-
do…while循环语句格式:
初始化语句① do { 循环体语句②; 迭代语句③; } while (循环条件语句④);
注意:
(1)while(循环条件)中循环条件必须是boolean类型
(2)do{}while();最后有一个分号
(3)do…while结构的循环体语句是至少会执行一次,这个和for和while是不一样的
执行流程:
- 第一步:执行初始化语句①,完成循环变量的初始化;
- 第二步:执行循环体语句②;
- 第三步:执行迭代语句③,针对循环变量重新赋值;
- 第四步:执行循环条件语句④,看循环条件语句的值是true,还是false;
- 如果是true,根据循环变量的新值,重新从第二步开始再执行一遍;
- 如果是false,循环语句中止,循环不再执行。
-
练习:猜数
随机生成一个1-100的数,猜数字游戏
从键盘输入数,如果大了提示,大了,如果小了,提示小了,如果对了,就不再猜了,并统计一共猜了多少次
提示:随机数
Math.random()
double num = Math.random();// [0,1)的小数
package com.atguigu.test; import java.util.Scanner; public class Demo { public static void main(String[] args) { //随机生成一个100以内的整数 /* Math.random() ==> [0,1)的小数 Math.random()* 100 ==> [0,100)的小数 Math.random()* 100 + 1 ==> [1,101)的小数 (int)(Math.random()* 100 + 1) ==> [1,101)的整数 */ int num = (int)(Math.random()* 100 + 1); System.out.println(num); //声明一个变量,用来存储猜的次数 int count = 0; Scanner input = new Scanner(System.in); int guess;//提升作用域 do{ System.out.print("请输入1-100的整数:"); guess = input.nextInt(); //输入一次,就表示猜了一次 count++; if(guess > num){ System.out.println("大了"); }else if(guess < num){ System.out.println("小了"); } }while(num != guess); System.out.println("一共猜了:" + count+"次"); } }
4.2.5 循环语句的区别
- 从循环次数角度分析
-
do…while循环至少执行一次循环体语句
-
for和while循环先循环条件语句是否成立,然后决定是否执行循环体,至少执行零次循环体语句
- 从循环变量的生命周期角度分析
-
for循环的循环变量在for()中声明的,在循环语句结束后,不可以被访问;
-
while和do…while循环的循环变量因为在外面声明的,所以while和do…while结束后可以被继续使用的;
-
如何选择
-
遍历有明显的循环次数(范围)的需求,选择for循环
-
遍历没有明显的循环次数(范围)的需求,循环while循环
-
如果循环体语句块至少执行一次,可以考虑使用do…while循环
-
本质上:三种循环之间是可以互相转换的,都能实现循环的功能
-
-
三种循环结构都具有四要素:
-
(1)循环变量的初始化表达式
-
(2)循环条件
-
(3)循环变量的修改的迭代表达式
-
(4)循环体语句块
- 死循环比较
-
for(;😉{循环体} ,除循环体外不需要执行其他语句,性能略高
-
while(true){ 循环体},除循环体外还需要执行小括号里的表达式
4.2.6 关键字:break
退出 ,结束
-
使用场景:终止switch或者当前循环
- 在选择结构switch语句中
- 在循环语句中
- 离开使用场景的存在是没有意义的
-
案例演示1
class Demo1_Break { public static void main(String[] args) { for (int x = 1;x <= 10 ;x++ ) { if (x == 4) { break; //结束循环 } System.out.println("x = " + x); } } }
-
语法案例演示2:break同时存在switch和循环中
ATM功能演示
界面效果:
=========ATM======= 1、存款 2、取款 3、显示余额 4、退出 请选择:
代码示例:
package com.atguigu.test; import java.util.Scanner; public class Demo { public static void main(String[] args) { Scanner input = new Scanner(System.in); //声明一个变量表示余额 double balance = 0.0; while (true) { System.out.println("=========ATM======="); System.out.println("\t1、存款"); System.out.println("\t2、取款"); System.out.println("\t3、显示余额"); System.out.println("\t4、退出"); System.out.print("请选择:"); int select = input.nextInt(); switch (select) { case 1: System.out.print("存款的金额:"); double money = input.nextDouble(); balance += money; System.out.println("存款后的余额:" + balance); break; case 2: System.out.print("取款的金额:"); money = input.nextDouble(); if(balance >= money){ balance -= money; System.out.println("取款后的余额:" + balance); }else{ System.out.println("现在的余额:" + balance + ",取款金额大于余额,取款失败"); } break; case 3: System.out.println("现在的余额:" + balance); break; case 4: flag = false; break;//只能结束switch default: System.out.println("无效指令"); break; } } } }
4.2.7 关键字:continue
-
使用场景:结束本次循环,继续下一次的循环
//遍历打印1-10的整数,但不打印3的倍数 public static void main(String[] args) { for (int i = 1; i <= 10; i++) { //需求:不打印3的倍数 if(i % 3 == 0){ continue; } System.out.println(i); } }
-
练习:打印1-100之间的整数,跳过7的倍数和7结尾的数
public static void main(String[] args){ //打印1-100之间的整数,跳过7的倍数和7结尾的数 for(int i=1; i<=100; i++){ if(i%7==0 || i%10==7){ continue; //break; } System.out.println(i); } }