第四章 流程控制
😶本章重点内容:
1.流程控制之分支结构
2.流程控制之循环结构
4.1 流程控制概述
1.流程控制:控制代码的执行顺序。
2.流程控制的分类:
顺序结构:从上到下,从左到右依次执行
分支结构:根据条件选择执行路径
代码特点:写得多,执行的少
语句实现:if条件语句三种格式,if,if……else,if……else if……else
Switch开关选择语句;
循环结构:相同相似的代码逻辑在符合条件的情况下,可以多次反复的执行。
代码特点:写得少,执行的多
语句实现:for循环,while循环,do while循环,continue继续语句,break终止语句。
😂顺序结构案例,依次打印:
class Demo01 {
public static void main(String[] args) {
int a = 1;
int b = 2;
int c = 3;
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4XAKimNH-1638091058567)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20211124003817632.png)]
4.2 分支结构
4.2.1 分支结构之if条件语句
01 if-if
1.格式:
if(布尔表达式) {
语句体;
}
2.说明
1)if:关键字,表示如果
2)if语句后面的小括号中是布尔表达式,返回true或者false。
3)语句体:可以是任意逻辑代码。
3.执行流程:
1)计算布尔表达式的值,要么是true,要么是false
2)若为true,执行语句体;
3)若为false,不执行语句体
4.注意点:小括号后面不要加分号;
如果语句体只有一句代码可省去大括号,但建议任何情况都加上{}.
😚案例:
1.题目:某公司现在要给员工进行薪资调整, 工作年龄大于等于5年, 加薪3000元工龄不够5年的, 没有加薪使用Scanner输入工作年限,使用salary表示员工基本薪资
2.梳理题目:
1)某公司现在要给员工进行薪资调整,
2)工作年龄大于等于5年, 加薪3000元,
3)工龄不够5年的, 没有加薪
4)使用Scanner输入工作年限
5)使用salary表示员工基本薪资
程序:
import java.util.Scanner;//Scanner键盘录入随机数
class Demo01 {
public static void main(String[] args) {
int salary = 5000;
Scanner sc = new Scanner (System.in);
int year = sc.nextInt();
System.out.println( "当前工龄:" + year);
if(year > 5) {
salary += 3000;
System.out.println( "加薪3000" +" " + "最终薪资" + salary);
}
if(year < 5) {
System.out.println( "没有加薪");
}
}
}
结果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gKC9FlKL-1638091058568)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20211124011856363.png)]
02 if语句-if……else
1.格式:
if(布尔表达式) {
语句体体1;
}else {
语句体2;
}
2.执行流程:
1)计算条件表达式的值,要么为true,要么为false。
2)若条件表达式值为true,执行语句体1,
3)若条件表达式为false,执行语句体2.
3.注意事项:
1)else是关键字,表示其他,是除了if条件之外的所有其他。
2)if中的语句体1和else中的语句体2,一定会执行其中一个,不可能全执行或者全不执行
案例:
案例2: 某公司现在要给员工进行薪资调整, 工作年龄大于等于5年, 加薪3000元, 工龄不够5年, 加薪1000元
import java.util.Scanner;
class Demo01 {
public static void main(String[] args) {
int salary = 5000;
Scanner sc = new Scanner (System.in);
int year = sc.nextInt();
System.out.println( "当前工龄:" + year);
if(year > 5) {
salary += 3000;
System.out.println( "加薪3000" +" " + "最终薪资" + salary);
}
else{
salary += 1000;
System.out.println( "加薪1000" +" " + "最终薪资" + salary);
}
}
}
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q6V9zZbK-1638091058568)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20211124141339953.png)]
03 if语句-if…else if …else
1.格式(多支判读):
if(条件表达式1) {
语句体1;
}else if(条件表达式2) {
语句体2;
}else if(条件表达式3) {
语句体3;
}
...
else if(条件表达式n) {
语句体n;
}else {
语句体n + 1;
}
2.执行流程:
1)计算条件表达式1,如果为true,就执行语句体1
2)如果条件表达式1为false,计算条件表达式2,如果为true,就执行语句体2
3)如果条件表达式2为false,就计算条件表达式3...
4)如果条件表达式1~条件表达式n全都为false,那么就执行语句体n+1
3.注意:最后的else语句可以有,也可以没有,如果有,语句体1~n+1,一定会执行其中一句。如果没有,可以一句都不执行。
案例:
案例3: 某公司现在要给员工进行薪资调整,根据工龄决定涨薪级别
1)[0-5): 涨薪2000元
2)[5-10): 涨薪3000元
3)[10-15): 涨薪4000元
4)[15,以上): 涨薪5000元
import java.util.Scanner;
class Demo01 {
public static void main(String[] args) {
int salary = 5000;
Scanner sc = new Scanner (System.in);
int year = sc.nextInt();
if(year >= 0 && year < 5) {
salary += 2000;
}else if (year >= 5 && year < 10) {
salary += 3000;
}else if(year >= 10 && year < 15) {
salary += 4000;
}else {
salary += 5000;
}
System.out.println("当前工龄" + year + " " + "最终工资" + salary);
}
}
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mTYf7cQa-1638091058570)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20211124143113806.png)]
4.2.2 分支结构之switch开关语句
01 基本语法
1:switch: 表示英文中的开关,每个条件都像一扇门,开着的,就进门执行,否则就到下一扇门判断.
2.格式:
switch(表达式) {
case 常量1:
语句体1;
break;
case 常量2:
语句体2;
break;
case 常量3:
语句体3;
break;
...
case 常量n:
语句体n;
break;
default:
语句体n+1;
}
3. 关键字解释:
switch: 开关;
case: 情况;
break: 破坏,退出,结束;
default: 默认;
4.执行流程:
1)计算switch小括号中表达式的值,分别和case后的各个常量值匹配
2)如果和常量1匹配,那么就执行语句体1,执行break,switch语句结束
3)如果和常量1不匹配,那么就判断是否和常量2匹配,如果匹配就执行语句体2,执行break,s
4)以此类推,如果常量1~常量n全都没有和表达式的值匹配,那么就执行default中的内容
😁案例1:
案例4: 键盘录入一个整数,用于进行星期匹配,数据范围1-7,对应匹配星期一到星期天,如果不是1-7范围,那么报出数据错误提示信息
import java.util.Scanner;
class Demo01 {
public static void main(String[] args) {
Scanner sc = new Scanner (System.in);
int day;
switch(day = sc.nextInt(7)) {
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("您输入的信息有误");
}
}
}
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TJpSz5DX-1638091058570)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20211124145612749.png)]
😂案例2:
案例4: 键盘录入一个字符串:星期?,用于进行星期匹配,数据范围常量也是字符串,对应匹配打印星期几对应做什么事情?
import java.util.Scanner;
class Demo01 {
public static void main(String[] args) {
Scanner sc = new Scanner (System.in);
String day;
switch(day = sc.next()) {
case "星期一":
System.out.println("星期一吃饭");
break;
case "星期二":
System.out.println("星期二喝水");
break;
case "星期三":
System.out.println("星期三唱歌");
break;
case "星期四":
System.out.println("星期四跳舞");
break;
case "星期五":
System.out.println("星期五画画");
break;
case "星期六":
System.out.println("星期六逛街");
break;
case "星期天":
System.out.println("星期天运动");
break;
default:
System.out.println("您输入的信息有误");
}
}
}
结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KvgJEB24-1638091058571)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20211124150230592.png)]
02 switch注意事项
1.switch小括号表达式数据类型:是byte, short, char, int,枚举类型,
String类型
2.数值型的只可以是 int 类型,但是 byte, short, char 都可以自动转换成int型。
3.case后面只能跟常量,不能跟变量
4.
1)每个case语句体后面, 要跟上一个break语句,否则就无法结束switch语句,并且发生case穿透
2)case穿透的利用: 多个case情况如果是相同的执行逻辑,可以在最后一个case语句后再使用
3)在switch语句中,如果case的后面不写break,也就不会再判断下一个case的值,直接向后寻找一切可执行语句运行,直到遇到break,或者整体switch结束.
5.default语句: 可以写也可以不写.如果不写,就有可能一个语句都执行不到,建议把default语
6.default语句可以写在任意位置,无论写在什么位置,都是最后去匹配,建议把default语句写在
7.switch语句结束的条件: 遇到break语句; 遇到switch语句右大括号
4.2.3 if 判断的使用总结
if if-else else-if switch 写代码中如何使用
2.# 如果有一个判断且不一定需要结果 选择 if
3.# 如果有一个判断必须需要结果 选择 if-else
4.# 如果判断条件不固定(范围筛选),且一定需要结果 else-if
5.# 如果判断条件固定(且单个条件-常量筛选),且一定需要结果 switch case
4.3 循环结构
4.3.1循环结构基本语法
1.循环 : 如果代码中有重复或者相似的逻辑,可以不用写多次, 使用循环结构, 实现代码在符合条件场景下 ,多次运行
2.循环结构有3种:😁for循环,😂while循环。do...while循环。
4.3.2 for循环
1.格式:
for (初始化语句 ; 循环判断条件 ; 初始化语句的变化) {
循环体语句;
}
2.说明:
1)初始化语句: 声明一个变量,用于记录循环次数或记录循环起点
2)循环判断条件: boolean类型表达式,控制循环是否继续执行的条件
3)初始化语句的变化: 将初始化语句中声明的变量,向着循环不能执行的方向变化
4)循环体语句: 要重复执行的逻辑内容
3.执行流程:
1)执行初始化语句(循环中的初始化语句只执行一次)
2)计算循环判断条件
3)如果计算为false,就结束for循环
4)如果计算为true,就执行循环体语句
5)执行初始化语句的变化
6)回到第2步
4. 注意事项:
1)循环判断条件必须是boolean类型结果
2)左大括号之前,不要有分号,否则for循环无法控制大括号中的语句.
3)循环体语句,如果只有一句,那么大括号可以省略,但是建议所有时候都加上大括号。
5.要求一定有一个固定临界值
单纯走循环条件只要不达到临界值就继续
尽量在循环条件中,更加有意义
😋案例1: 打印数字1-5
import java.util.Scanner;
class Demo01 {
public static void main(String[] args) {
for(int i = 1;i <= 5;i++) {
System.out.println(i);
}
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pd6KzhIy-1638091058572)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20211124152425449.png)]
😋案例2: 打印数字5-1
import java.util.Scanner;
class Demo01 {
public static void main(String[] args) {
for(int i = 5;i >0 ;i--) {
System.out.println(i);
}
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FX8djX6A-1638091058573)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20211124152518775.png)]
😋案例3: 计算1-100累加和
import java.util.Scanner;
class Demo01 {
public static void main(String[] args) {
int sum = 0;
for(int i = 1;i < 101 ;i++) {
sum += i;
}
System.out.println(sum);
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4wjOgdKd-1638091058574)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20211124152759526.png)]
🙄案例:倒打印九九乘法表
public class Demo03 {
public static void main(String args[]) {
int i;
int j;
int c;
for( i = 9; i >= 1 ; i -- ) {
for(j = i;j > 0;j --) {
c = i * j;
System.out.print(i + "*" + j + "=" + c+"\t");
}
System.out.println();
}
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rKdJkTuU-1638091058574)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20211124153129245.png)]
🙄案例:正打印九九乘法表
import java.util.Scanner;
class Demo01 {
public static void main(String[] args) {
int i;
int j;
int c;
for( i = 1; i < 10 ; i ++ ) {
for(j = 1 ;j <= i ;j ++) {
c = i * j;
System.out.print( j + "*" + i + "=" + c + "\t");
}
System.out.println();//换行的作用
}
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HvDfT4Nq-1638091058576)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20211124165633682.png)]
4.3.3 循环结构之while樽还
1.格式:
初始化语句;
while(条件表达式) {
循环体语句;
初始化语句的变化;
}
2.执行流程:
1)初始化语句
2)计算条件表达式,如果为false,循环直接结束
3)如果为true,执行循环体语句
4)执行初始化语句的变化
5)回到第二步
3.注意事项:
1)条件表达式必须为boolean类型
2)左大括号之前不加分号,否则while大括号无效
3)初始化语句的变化,不要忘记
4.jdbc中取数据需要使用while循环,不用for循环
5.while循环比for·循环更强大
😁案例1:使用while循环打印1-20
public class Demo07
{
public static void main(String args[]) {
int i = 1;
//大部分while看情况可以不给临界值
while ( i <=20 )
{
System.out.println(i);
i ++;
}
}
}
😁案例2:使用while打印1-100累加和
public class Demo08
{
public static void main(String args[]) {
int sum = 0;
int i = 1;
while( i <=100 )
{
sum += i;
}
System.out.println(sum);
}
}
😂案例3:使用while打印1-100中所有偶数
public class Demo09
{
public static void main(String args[]) {
int sum = 0;
int i = 1;
while( i <=100 )
{
if( i % 2 ==0) {
System.out.println(i + "偶数");
}
i ++;
}
}
}
4.3.4 do……while循环
01 语法格式:
do {
//主体部分
循环体;
初始化变量的变化;
}while(条件表达式);
//条件表达式可以传true或者false
是while循环中的一个,while中可能出现一次都不执行的情况
而do……while无论什么条件都至少执行一次!!!!!因为do……while是先执行后判断.
案例1:使用do……while循环打印5次Hello World
public class Demo10{
public static void main(String args[]) {
int i = 1;
do {
System.out.println("Hello World");
i ++;
}while(i <=5);
}
}
案例1:使用do……while循环语句计算1-100累加
public class Demo10
{
public static void main(String args[]) {
int i = 1;
int sum = 0;
do {
sum += i;
i ++;
}while(i <=100);
System.out.println(sum);
}
}
02 (面试题)
for ,while,do……while循环的区别
1.do while语句和其他两种语句的区别:
1)for循环和while循环先判断条件是否成立,然后决定是否执行循环体(先判断后执行)do...while循环先执行一次循环体,然后判断条件是否成立,是否继续执行循环体(先执行
2)dowhile语句至少可以执行一次,另外两种有可能一次都执行不了
2.while语句和for的区别:
1) 代码层面: while语句声明的初始化变量,在while结束之后,还能继续使用;for中声明的初始化变量,在for结束之后,就无法使用了.
2)设计层面: 循环次数确定的话,建议使用for;循环次数不确定建议使用while
03 死循环
1.死循环: 无限循环,循环永远都不停止.
2.格式:
1)for语句的死循环: for ( ; ; ) {
循环体语句;
}
2)while语句的死循环: 常用
while (true) {
循环体语句;
}
3.死循环的作用:
1)在格式上使用了死循环,但是在循环体中,可能出现了需要循环结束的情况,准备了一些跳
2)在服务器的设计中,希望服务器永远给我们服务下去,所以需要使用死循环.
4.注意事项:死循环之后的代码会报错, 因为代码永远不会执行到
5.千万不要使用for循环的死循环,很难停止
04循环跳转控制语句
(1)continue语句
1)continue语句: continue关键字, 表示继续,下一次概念; 使用在循环中, 结束本次循环,继续
2) continue 主要作用就是在循环中进行一些数据的筛选, 筛选出最符合条件的数据运行循环
案例:for循环continue 输出1-100偶数
class Demo11
{
public static void main(String[] args)
{
for(int i = 0;i<=100;i ++) {
//遇见奇数跳过
if(i % 2==0) {
continue;
}
System.out.println(i + "偶数");
}
}
}
while循环continue 输出1-100偶数
class Demo11
{
public static void main(String[] args)
{
int i = 0;
while(i <=100) {
if(i % 2 !=0) {
i ++;
continue;
}
System.out.println(i + "偶数");
i ++;
}
}
}
== 和 equals 的区别
//常量在堆中常量池
//通过栈创建,值存在堆中非常量池区域
//栈中有userNameInput这个引用
(2)break 终止语句
1.break语句: break是关键字, 表示结束, 破坏
1)终止switch语句
2)结束当前层次循环
案例:while死循环break终止 输出用户登录密码:
模拟用户登录界面,正确用户名为:123,正确的密码为:456,通过键盘录入登录所需的用户
名和密码,
如果输入数据正确,显示登录成功;如果输入数据有误,支持无限次输入用户名和密码,直到
输入正确数据,登录成功为止.
import java.util.Scanner;
class Demo12
{
//常量在堆中常量池
public static final String USERNAME = "zhangsan";
public static final String PWD= "123";
public static void main(String[] args) {
Scanner sc = new Scanner (System.in);
//1.输出提示
System.out.println("请按照要求输入账号和密码");
//2.死循环
String userNameInput ;
String pwdInput;
while(true) {
//3.提示输入账号信息
System.out.println("请输入账号");
userNameInput = sc.next();
//4.提示输入密码信息
System.out.println("请输入密码");
pwdInput = sc.next();
//5.判断账号和密码是否正确
if(userNameInput.equals(USERNAME) && pwdInput.equals(PWD))
{
System.out.println("登陆成功");
break;
}else {
System.out.println("登录失败,您的账号或密码输入错误");
}
}
}
}
案例:for死循环break终止 输出用户登录密码
import java.util.Scanner;
class Demo12
{
//常量在堆中常量池
public static final String USERNAME = "zhangsan";
public static final String PWD= "123";
public static void main(String[] args) {
Scanner sc = new Scanner (System.in);
//1.输出提示
System.out.println("请按照要求输入账号和密码");
//2.死循环
for( ; ;) {
//3.提示输入账号信息
System.out.println("请输入账号");
String userNameInput = sc.next();
//4.提示输入密码信息
System.out.println("请输入密码");
String pwdInput = sc.next();
//5.判断账号和密码是否正确
if(userNameInput.equals(USERNAME) && pwdInput.equals(PWD))
{
System.out.println("登陆成功");
break;
}else {
System.out.println("登录失败,您的账号或密码输入错误");
}
}
}
}
while更好用
cintinue 和 break 的区别
4.3.5 嵌套循环
外循环执行1次,内循环全部循环
class Demo13
{
public static void main(String[] args)
{
for (int i = 1;i <=4 ;i ++ ) {
for(int x = 1;x <=4 ;x ++) {
System.out.print("*" );
}
System.out.println();
}
}
}
class Demo13
{
public static void main(String[] args)
{
for (int i = 1;i <=5 ;i ++ ) {
for(int x = 1;x <=i ;x ++) {
System.out.print("*" );
}
System.out.println();
}
}
}
九九乘法表也是使用了for循环嵌套
牢记外层循环1次,内层循环全部