Java 流程控制

我不是女神ヾ 2024-03-03 04:23 28阅读 0赞

一、程序流程控制概述

程序的流程控制一般分为3种:顺序结构、分支结构、循环结构。

  • 顺序结构:就是不加任何控制,代码从main开始自上而下的执行。
  • 分支结构:就是根据条件判断是true还是false,有选择性的执行哪些代码。在Java语言中提供了两个格式if 、 switch。
  • 循环结构:就是控制某一段代码重复执行。在Java语言中提供了三种格式,for、while、do-while。

a3d18930d91649b1891d90bb6a9cb806.png

二、分支结构

1、if分支

if它的作用,是用于对条件进行判断,判断的结果只可能有两个值true或者false,然后根据条件判断的结果来决定执行哪段代码。

1.1 if分支的格式

在Java中,if分支有三种格式:

fa7d995010424f28b2a53c238e86987c.png

1.2.1 if 第一种形式

488fa88135ef41e3b7c713a01b0b68bf.png

if 第一种形式执行流程如下:
如果 条件表达式 为true,就执行下面的语句体
如果 条件表达式 为false,就不执行

  1. // 需求:测量用户体温,发现体温高于37度就报警。
  2. double t = 36.9;
  3. if(t > 37){
  4. System.out.println("这个人的温度异常,把他赶紧带走~~");
  5. }
1.2.2 if 第二种形式

8ae376ee657f489780d90b9014e001ad.png

if 第二种形式执行流程如下:
如果 条件表达式 为true,就执行下面的语句体1
如果 条件表达式 为false,就执行else下面的语句体2

  1. // 需求2:发红包,你的钱包余额是99元,现在要发出90元
  2. // 如果钱够触发发红包的动作,如果钱不够,则提示:余额不足。
  3. double money = 19;
  4. if(money >= 90){
  5. System.out.println("发红包成功了~");
  6. }else {
  7. System.out.println("余额不足~~");
  8. }
1.2.3 if 第三种形式

f25cc799321844ecac405e54b4f007f5.png

if 第三种形式执行流程如下:
如果 条件表达式1 为true,就执行下面的代码1;
如果 条件表达式1 为false,就继续判断条件表达式2;

如果 条件表达式2 为true,就执行下面的语句体;
如果 条件表达式2 为false,就继续判断条件语句体3;

如果 条件表达式3 为true,就执行下面的语句体3
如果 条件表达式3 为false,就继续判断后面的表达式;

….
如果前面所有条件表达式判断都为false,就执行最后的else语句中的代码

  1. // 需求3:某个公司有一个绩效系统,根据员工的打分输出对应的绩效级别。[0,60) D [60,80) C [80,90) B [90,100] A
  2. int score = 298;
  3. if(score >= 0 && score < 60) {
  4. System.out.println("您的绩效级别是: D");
  5. }else if(score >= 60 && score < 80){
  6. System.out.println("您的绩效级别是: C");
  7. }else if(score >= 80 && score < 90){
  8. System.out.println("您的绩效级别是: B");
  9. }else if(score >= 90 && score <= 100){
  10. System.out.println("您的绩效级别是: A");
  11. }else {
  12. System.out.println("您录入的分数有毛病~~");
  13. }

注意事项:

  • if的()后面不能写分号;,否则if下面的语句与if无关

fc1fd09f554046ce9f71e5f8db0cd5fb.png

  • if后面的大括号,如果只有一行代码,大括号可以省略

ea88adc02b934c778f9d6e97d82470ec.png

1.2.4 总结

8da7d81d34f543bcaedd7896d9bda98b.png

2、switch分支

switch分支的作用,是通过比较值来决定执行哪条分支代码

2.1 switch分支的执行流程

718c9d77a6bc4fd8bf029a0cbb5aaa6b.png

需求:做个电子备忘录,在控制台分别输出周一到周五的工作安排
周一:埋头苦干,解决bug
周二: 请求大牛程序员帮忙
周三:今晚啤酒、龙虾、小烧烤
周四:主动帮助新来的女程序解决bug
周五:今晚吃鸡
周六:与王婆介绍的小芳相亲
周日:郁郁寡欢、准备上班。

  1. public class SwitchDemo1 {
  2. public static void main(String[] args) {
  3. String weekday = "周二";
  4. switch (weekday){
  5. case "周一":
  6. System.out.println("埋头苦干,解决bug ");
  7. break;
  8. case "周二":
  9. System.out.println("请求大牛程序员帮忙");
  10. break;
  11. case "周三":
  12. System.out.println("今晚啤酒、龙虾、小烧烤");
  13. break;
  14. case "周四":
  15. System.out.println("主动帮助新来的女程序解决bug");
  16. break;
  17. case "周五":
  18. System.out.println("今晚吃鸡");
  19. break;
  20. case "周六":
  21. System.out.println("与王婆介绍的小芳相亲");
  22. break;
  23. case "周日":
  24. System.out.println("郁郁寡欢、准备上班");
  25. break;
  26. default:
  27. System.out.println("数据有误!");
  28. }
  29. }
  30. }
2.2 switch的注意事项
  1. 表达式类型只能是byte、short、int、char。JDK5开始支持枚举,JDK7开始支持String,不支持double、float、double。
  2. case给出的值不允许重复,且只能是字面量,不能是变量。
  3. 正常使用switch的时候,不要忘记写break,否则会出现穿透现象。

1. 演示switch语句匹配的数据类型

9568345348614d38afa184f6af7be107.png

2. 演示case后面的值,只能是字面量不能是变量

e7224403e0eb4ba38d23a8c854cb17ea.png

3. 演示case穿透现象

当switch语句中没有遇到break,就会直接穿透到下一个case语句执行,直到遇到break为止。

这种语法设计也是有它的用处的,当多个case语句想要执行同一段代码时,可以利用case穿透现象,提高代码复用性。

  1. public class SwitchDemo2 {
  2. public static void main(String[] args) {
  3. // 需求:用户输入月份可以展示该月份的天数。
  4. // 1、3 、5、 7 、 8、 10、 12月份是 31天
  5. // 2月份是闰年为29天、非闰年为28天。
  6. // 4 、6 、9、 11月份 是30天
  7. int month = 7;
  8. switch (month){
  9. case 1:
  10. case 3:
  11. case 5:
  12. case 7:
  13. case 8:
  14. case 10:
  15. case 12:
  16. System.out.println(month +"是31天!");
  17. break;
  18. case 2:
  19. System.out.println(month +"月闰年为29天、非闰年为28天!");
  20. break;
  21. case 4:
  22. case 6:
  23. case 9:
  24. case 11:
  25. System.out.println(month +"是30天!");
  26. break;
  27. default:
  28. System.out.println("数据有误!");
  29. }
  30. }
  31. }
2.3 if、switch如何选择

如果单从功能上来讲,if 分支 的功能是更加强大的,switch分支能做的事情if 分支都能做。但是具体用哪一种分支形式,也是有一些使用原则的。

- 如果是对一个范围进行判断,建议使用if分支结构
- 如果是与一个一个的值比较的时候,建议使用switch分支结构

三、循环结构

循环结构可以控制一段代码重复执行。循环结构有for循环、while循环、do-while循环。

1、for循环

为了让大家更直观的理解for循环的执行流程,我们直接来看具体的案例代码。

比如:我们想要在控制台打印输出3个HelloWorld

  1. public class ForDemo1 {
  2. public static void main(String[] args) {
  3. for (int i = 0; i < 3; i++) {
  4. System.out.println("Hello World");
  5. }
  6. }
  7. }

如下图所示,是按照下面的① ② ③ ④, ② ③ ④… 的顺序来执行的;

当②条件为true时,再依次执行③④代码,然后回到②继续判断

当②条件为false时,就结束循环

0e395aab888d498dbf6bb851ef11df9d.png

66cdb715474648d3bb41dae1a442212e.png

for循环格式

for (初始化语句; 循环条件; 迭代语句) {
循环体语句(重复执行的代码);
}

初始化语句:一般是定义一个变量,并给初始值
循环条件:一般是一个关系表达式,结果必须是true或者false
迭代语句:用于对条件进行控制,一般是自增或者自减
循环语句体:需要重复执行的代码

1.1 for循环案例

案例1:求和

  1. public class ForTest1 {
  2. public static void main(String[] args) {
  3. // 需求:计算1-5的和
  4. // 2、定义一个整数变量用于累加数据求和
  5. int sum = 0;
  6. // 1、定义一个for循环找到 1 2 3 4 5
  7. for (int i = 1; i <= 5 ; i++) {
  8. // i = 1 2 3 4 5
  9. // 3、把循环的数据累加给sum变量
  10. /**
  11. 等价于: sum = sum + i
  12. i == 1 sum = 0 + 1
  13. i == 2 sum = 1 + 2
  14. i == 3 sum = 3 + 3
  15. i == 4 sum = 6 + 4
  16. i == 5 sum = 10 + 5
  17. */
  18. sum += i;
  19. }
  20. System.out.println("1-5的和是:" + sum);
  21. }
  22. }

案例2:求奇数和

  1. public class ForTest2 {
  2. public static void main(String[] args) {
  3. // 需求:求1-0的奇数和
  4. // 3、定义一个求和的变量 累加奇数和
  5. int sum = 0;
  6. // 1、定义一个循环找到 1 2 3...10
  7. for (int i = 1; i <= 10; i++) {
  8. // i 1 2 3 4 5 6 7 8 9 10
  9. // 2、筛选出奇数
  10. if(i % 2 == 1){
  11. // i = 1 3 5 7 9
  12. sum += i;
  13. }
  14. }
  15. // 4、输出求和变量即可
  16. System.out.println("1-10的奇数和是:" + sum);
  17. System.out.println("-------------------");
  18. // 2、定义一个求和的变量 累加奇数和
  19. int sum1 = 0;
  20. // 1、定义循环找到 1 3 5 7 9
  21. for (int i = 1; i <= 10; i+=2) {
  22. // i = 1 3 5 7 9
  23. sum1 += i;
  24. }
  25. // 3、输出求和变量即可
  26. System.out.println("1-10的奇数和是:" + sum1);
  27. }
  28. }

案例3:找水仙花数

  1. public class ForTest3 {
  2. public static void main(String[] args) {
  3. // 需求:找出水仙花数并输出
  4. // 在循环外定义一个变量用于记录水仙花的个数
  5. int count = 0;
  6. // 1、定义一个for循环找出全部三位数
  7. for (int i = 100; i <= 999; i++) {
  8. // 2、判断这个三位数是否满足要求
  9. // i = 157
  10. // 个位
  11. int ge = i % 10;
  12. // 十位
  13. int shi = i / 10 % 10;
  14. // 百位
  15. int bai = i / 100;
  16. if( (ge*ge*ge + shi * shi * shi + bai * bai * bai) == i){
  17. System.out.print(i+"\t");
  18. count++;
  19. }
  20. }
  21. System.out.println(); // 换行!
  22. System.out.println("水仙花个数是:" + count);
  23. }
  24. }

2、while循环

格式:

361fbf844b964a56b9819103eff844a3.png

需求:打印5行HelloWorld

  1. public class WhileDemo1 {
  2. public static void main(String[] args) {
  3. int i = 0;
  4. while (i < 5) {
  5. // i = 0 1 2 3 4
  6. System.out.println("Hello World");
  7. i++;
  8. }
  9. }
  10. }

e16773c46a2040599bb1589b7adf4ede.png

2.1 while循环案例
  1. /**
  2. * 需求:
  3. * 珠穆朗峰高度是8848860 纸张厚度 0.1 折叠纸张直到不低于珠穆朗峰位置,求折叠几次
  4. */
  5. public class WhileTest7 {
  6. public static void main(String[] args) {
  7. // 1、定义变量记录山峰的高度和纸张的厚度
  8. double peakHeight = 8848860;
  9. double paperThickness = 0.1;
  10. // 3、定义一个变量用于记录纸张折叠的次数
  11. int count = 0;
  12. // 2、定义while循环控制纸张进行折叠
  13. while (paperThickness < peakHeight) {
  14. // 把纸张进行折叠,把纸张的厚度变成原来的2倍
  15. paperThickness *= 2;
  16. count++;
  17. }
  18. System.out.println("折叠的次数:" + count);
  19. System.out.println("纸张的最终厚度:" + paperThickness);
  20. }
  21. }

3、do-while循环

格式和流程:

2ab866cdfd6e492897e6244482b87f84.png

如下图所示:do-while循环的执行流程,是按照① ②③④ ②③④… 的顺序执行的。

我们会发现,do-while循环的特点是先执行,再判断的。即使条件不成立,也会先执行一次。

8aa53d38de9c4ebab4c006af4a74e2e9.png

  1. public class DoWhileDemo1 {
  2. public static void main(String[] args) {
  3. // 需求:打印多行Hello World
  4. int i = 0;
  5. do {
  6. System.out.println("Hello World");
  7. i++;
  8. }while (i < 3);
  9. }
  10. }

4、三种循环的总结

  1. for循环 和 while循环(先判断后执行);
    do…while (先执行后判断)

2.for循环和while循环的执行流程是一模一样的,
功能上无区别,for能做的while也能做,反之亦然。
如果已知循环次数建议使用for循环,如果不清楚要循环多少次建议使用while循环。

3 for循环中控制循环的变量只在循环中使用
while循环中,控制循环的变量在循环后还可以继续使用

  1. public class DoWhileDemo2 {
  2. public static void main(String[] args) {
  3. /**
  4. * 三种循环的区别小结:
  5. * for循环和while循环是先判断后执行,do while循环是先执行后判断
  6. * for循环和while循环的执行流程是一模一样的,功能上无区别,for能做的,while也能做,反之亦然。
  7. */
  8. for (int j = 0; j < 3; j++) {
  9. System.out.println("Hello World");
  10. }
  11. for (int j = 0; j < 3; j++) {
  12. System.out.println("Hello World");
  13. }
  14. int n = 0;
  15. while (n < 3){
  16. System.out.println("Hello World");
  17. n++;
  18. }
  19. System.out.println(n);
  20. }
  21. }

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);

  1. public class EndLessLoopDemo {
  2. public static void main(String[] args) {
  3. // for ( ; ; ) {
  4. // System.out.println("Hello World~~~~");
  5. // }
  6. // 经典写法
  7. // while (true) {
  8. // System.out.println("我是快乐的死循环~~~~");
  9. // }
  10. // do{
  11. // System.out.println("我是快乐的死循环~~~~");
  12. // }while (true);
  13. System.out.println("-----------------------------");
  14. // 1、定义正确的密码
  15. int okPassword = 520;
  16. // 2、定义一个死循环让用户不断的输入密码认证
  17. Scanner sc = new Scanner(System.in);
  18. while (true) {
  19. System.out.println("请您输入正确的密码:");
  20. int password = sc.nextInt();
  21. // 3、使用if判断密码是否正确
  22. if(password == okPassword){
  23. System.out.println("登录成功了~~~");
  24. break; // 可以理解结束当前所在循环的执行的
  25. }else {
  26. System.out.println("密码错误!");
  27. }
  28. }
  29. }
  30. }

6、嵌套循环

所谓循环嵌套,就是一个循环中又包含另一个循环(就是常说的,套娃^_^),下面我们通过案例代码演示一下。

f4425c3551d841d191244f5d23d98a37.png

循环嵌套执行流程:外部循环每循环一次,内部循环会全部执行完一轮

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. public class LoopNestedDemo {
  2. public static void main(String[] args) {
  3. /**
  4. *****
  5. *****
  6. *****
  7. *****
  8. */
  9. for (int i = 0; i < 4; i++) {
  10. for (int j = 0; j < 5; j++) {
  11. System.out.print("*");
  12. }
  13. System.out.println(); // 换行
  14. }
  15. }
  16. }

7、跳转语句break、continue

如果我们想要在循环过程中提前跳出循环,就需要用到跳转语句break、continue两个关键字。

  • break作用:跳出并结束当前所在循环的执行。
  • continue作用:结束本次循环,进入下一次循环。

    public class BreakAndContinueDemo11 {

    1. public static void main(String[] args) {
    2. // 1、break:跳出并结束当前循环。
    3. // 场景:假如你又有老婆了,然后你犯错了,你老婆罚你做5天家务,每天都是洗碗。
    4. // 但是洗碗到第三天后心软了 原谅你了不用洗了
    5. for (int i = 0; i < 5; i++) {
    6. System.out.println("快乐的洗碗~~~~");
    7. if(i == 2) {
    8. break; // 跳出并结束当前循环的执行~~
    9. }
    10. }
    11. // 2、continue:跳出当前循环的当次执行,进入循环的下一次
    12. // 场景:假如你又有老婆了,然后你犯错了,你老婆罚你做5天家务,
    13. // 每天都是洗碗。但是洗碗到第三天后心软了 原谅你了不用洗了 但是依然不解恨 继续洗第4天 5天
    14. for (int i = 1; i <= 5 ; i++) {
    15. if(i == 3){
    16. continue; // 立即跳出当次执行,进入循环的下一次!
    17. }
    18. System.out.println("洗碗:" + i);
    19. }
    20. }

    }

注意:break和continue不是任何地方都可以使用的。

cdf42699aa5d4fa3992f2e3a71105f8d.png

3076f4c5d5674712832b8a52b8e8026c.png

四、生成随机数

1、如何产生一个随机数

生成随机数的功能,其实Java已经给我们提供了,在JDK中提供了一个类叫做Random,我们只需要调用Random这个类提供的功能就可以了。

eb9d5b9df0d44250907a09453f9c6e4e.png

  1. // 目标:掌握使用Random生成随机数的步骤。
  2. // 1、导包。import java.util.Random; (idea会自动完成)
  3. import java.util.Random;
  4. public class RandomDemo1 {
  5. public static void main(String[] args) {
  6. // 2、创建一个Random对象,用于生成随机数。
  7. Random r = new Random();
  8. // 3、调用Random提供的功能:nextInt得到随机数。
  9. for (int i = 1; i <= 20; i++) {
  10. int data = r.nextInt(10); // 0 - 9
  11. System.out.println(data);
  12. }
  13. }
  14. }

2、案例:猜数字小游戏

需求:
随机生成一个1-100之间的数据,提示用户猜测,猜大提示过大,猜小提示过小,直到猜中 结束游戏

分析:
1.先随机生成一个1-100之间的数据。
谁可以帮你生成随机数啊? 是不是要用到Random?

2.定义一个死循环让用户可以一直猜测。
用户猜的数据从哪里来啊? 是不是要用到Scanner?

3.在死循环里,每次让用户录入的数据和随机数进行比较
如果比随机数大:提示猜大了
如果比随机数小:提示猜小了
如果和随机数相同:提示恭喜你猜中了

  1. import java.util.Random;
  2. import java.util.Scanner;
  3. public class RandomTest2 {
  4. public static void main(String[] args) {
  5. // 1、随机产生一个1-100之间的数据,做为中奖号码。
  6. Random r = new Random();
  7. int luckNumber = r.nextInt(100) + 1;
  8. // 2、定义一个死循环,让用户不断的猜测数据
  9. Scanner sc = new Scanner(System.in);
  10. while (true) {
  11. // 提示用户猜测
  12. System.out.println("请您输入您猜测的数据:");
  13. int guessNumber = sc.nextInt();
  14. // 3、判断用户猜测的数字与幸运号码的大小情况
  15. if(guessNumber > luckNumber){
  16. System.out.println("您猜测的数字过大~~");
  17. }else if(guessNumber < luckNumber){
  18. System.out.println("您猜测的数字过小~~");
  19. }else {
  20. System.out.println("恭喜您,猜测成功了,可以买单了~~");
  21. break; // 结束死循环
  22. }
  23. }
  24. }
  25. }

发表评论

表情:
评论列表 (有 0 条评论,28人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java流程控制

    Java流程控制 程序的本质是指令集和。 程序设计的三种基本结构是顺序结构、选择结构和循环结构。这三种结构通过组合、嵌套可以实现所有复杂的程序流程控制。 1.顺序...

    相关 Java 流程控制

    一、程序流程控制概述 程序的流程控制一般分为3种:顺序结构、分支结构、循环结构。 顺序结构:就是不加任何控制,代码从main开始自上而下的执行。 分支结构:

    相关 Java流程控制

    做任何事情都有个步骤,第一步做什么,第二步又做什么......直至完成事情。流程控制就是对这种做事情的步骤性给予安排与管理。而Java流程控制,顾名思义,就是对Java语言做事

    相关 Java流程控制

    Java流程控制的语法与 C/C++ 类似,也有 if...else、while、do...while、for、switch...case等,这里不再讲述具体语法,仅举例说明。

    相关 java--流程控制

    Java流程控制包括顺序控制、条件控制和循环控制。 顺序控制,就是从头到尾依次执行每条语句操作。条件控制,基于条件选择执行语句,比方说,如果条件成立,则执行操作A,或者如果条