Java流程控制语句(篇尾附笔记和思维导图)

Java流程控制与循环结构详解
本文详细介绍了Java中的流程控制语句,包括if分支、switch分支、循环结构(for、while、do-while)及其区别。通过案例展示了如何使用这些结构实现条件判断和循环操作,如求和、判断奇数和水仙花数。此外,还讲解了break和continue的使用,以及Random类在生成随机数中的应用。内容深入浅出,适合初学者掌握Java控制流程的基础知识。

目录

流程控制语句

分支结构

if 分支

switch分支

循环结构

for循环

案例

求和

求奇数和

水仙花数

while循环

do-while循环

三种循环区别

for和while 区别

死循环

循环嵌套

跳转关键字:break , continue

随机数Random类

总结

思维导图


流程控制语句

  • Java提供了一些流程控制语句,来控制程序和执行流程

分支结构

if 分支

  • 根据判断的结果(真或假)决定执行某个分支的代码

if 分支的三种格式

格式1
​
if(条件表达式){
    语句体;
}

int a = 5;
int b = 3;
if(a > b){
    a = 10;
    b = a;
}

流程图

 

格式2
​
if(条件表达式){
    语句体1;
} else {
    语句体2
}

int a = 5;
int b = 3;
if(a > b){
    a = 10;
}else {
    b = 10;
}

流程图

 

格式3
​
if (条件表达式1){
    语句体1;
} else if (条件表达式2){
    语句体2;
} else if (条件表达式3){
    语句体3;
}
.....
else {
    语句体n+1;
}

格式1应用:

// 判断心跳数据, 心跳小于60 或者大于100 表示有问题
int x = 130;  // 定义心跳数据
if (x < 60 || x > 100) {  // if 进行流程控制,如果x < 60 或者 大于100, 执行{}内的语句
    System.out.println("心跳数据是:" + x + ",您的心跳有问题,建议做进一步检查!");
}
System.out.println("检查结束!");
  • 如果if 语句中只有一条语句时,则可以省略{ }, 建议不要省略.

// 判断心跳数据, 心跳小于60 或者大于100 表示有问题
int x = 130;  // 定义心跳数据
if (x < 60 || x > 100)   // 可以省略括号,运行结果与上方一样
    System.out.println("心跳数据是:" + x + "您的心跳有问题,建议做进一步检查!");
​
System.out.println("检查结束!");

上面两条语句输出结果为:

心跳数据是:130,您的心跳有问题,建议做进一步检查!
检查结束!

格式2应用:

// 发红包,给你的女朋友发送1314的大红包
double money = 1313;  // 定义钱数
// 发送1314
if (money >= 1314) { // 判断钱是否大于等于1314
    System.out.println("发送成功~~~~~");
} else {  // 如果不等于,则输出下面{}内的内容
    System.out.println("莫得钱了.....好凄惨~");
}

输出结果为:

莫得钱了.....好凄惨!

格式3应用:

// 判断分数级别
// 0 - 60 不及格 60 - 80 及格 80 - 90 良好 90-100 优秀
int score = 99;  // 定义分数
if (score >= 0 && score < 60) {  // 大于等于0 并且 小于 60 
    System.out.println("不及格");
} else if (score >= 60 && score < 80) {  // 大于等于 60 并且 小于 80 
    System.out.println("及格");
} else if (score >= 80 && score < 90) {  // 大于等于 80 并且 小于 90
    System.out.println("良好");
} else if (score >= 90 && score <= 100) { // 大于等于90 并且 小于等于100
    System.out.println("优秀");
} else {    				// 如果以上条件都不满足,则执行这条语句
    System.out.println("请输入正确的分数!");
}

输出结果为:

优秀

switch分支

  • 也是匹配条件去执行分支,适合做值匹配的分支选择,结构清晰,格式良好

  • 格式:

switch ( 表达式 ) {
	case 值1:
		执行代码..;
		break;
	case 值2:
		执行代码..;
		break;
    case 值3:
		执行代码..;
		break;
	.....
    case 值n-1:
    	执行代码..;
    	break;
  	default:
    	执行代码n;
    	// break;  可写可不写
}
  • 执行流程

1.先执行表达式的值,拿着这个值去与case后的值进行匹配
2.匹配哪个值为true 就执行哪个case,遇到break就跳出switch分支
3.如果case后的值都不匹配则执行default代码

案例:

// 判断今天是星期几
int xq = 5;  // 定义今天为星期五
switch (xq) {   // 将值传给switch
    case 1:   // 判断是否为1
        System.out.println("星期一");
        break;  // 如果为1 ,则跳出switch语句
    case 2:   // 判断是否为2
        System.out.println("星期二");
        break;
    case 3:   // 判断是否为3
        System.out.println("星期三");
        break;
    case 4:   // 判断是否为4
        System.out.println("星期四");
        break;
    case 5:   // 判断是否为5
        System.out.println("星期五");
        break;
    case 6:   // 判断是否为6
        System.out.println("星期六");
        break;
    case 7:   // 判断是否为7
        System.out.println("星期日");
        break;
    default:  // 如果上面没有匹配的值,则输出以下语句
        System.out.println("输入信息有误!");
}
  • 注意:如果不写break 则会出现穿透现象,从匹配的值位置一直执行到最后

写break执行的结果:
	星期五
	
不写break执行的结果:
	星期五
	星期六
	星期日
	输入信息有误!
// String 格式
String xq = "星期一";
switch (xq){
    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("输入信息有误!");
}

switch分支注意事项:

  1. 表达式类型只能是byte , short , int , char, JDK5开始支持枚举,JDK7开始支持String , 不支持double,float , long.

  2. case给出的值不允许重复,且只能是字面量,不能是变量

  3. 不要忘记写break,否则会出现穿透现象

switch 穿透性

  • 如果代码执行到没有写break的case块,执行完后直接进入下一个case块执行代码(而且不会进行任何匹配),直到遇到break才能跳出分支,这就是switch穿透性

switch ( 表达式 ) {
	case 值1:
		执行代码1..;
	case 值2:
		执行代码2..;
    case 值3:
		执行代码3..;
	.....
    case 值n-1:
    	执行代码n-1..;
        break;
  	default:
    	执行代码n;
}

案例

// 需求输入月份可以展示该月份的天数
// 1 3  5 7 8 10 12月份为31天
// 2月份闰年29天平年28天
// 4 6 9 11 月份是30天
int month = 7;
switch (month) {
    case 1:   // 根据穿透性,因为结果都一样,所以一直往下走直到碰到break才停止
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        System.out.println(month + "月是31天!");
        break;
    case 2:
        System.out.println(month + "月为闰年29天,平年28天!");
        break;
    case 4:
    case 6:
    case 9:
    case 11:
        System.out.println(month + "月是30天!");
        break;
    default:
        System.out.println("数据有误!");
}

循环结构

for循环

  • 控制一段代码返回执行多次

格式

for (初始化语句; 循环条件;迭代语句){
	循环体语句(重复执行的代码);
}
  • for语句的第一部分通常是对数据的初始化,第二部分给出每次新一轮循环执行前要检测的循环条件,第三部分指定如何更新数据

  • for语句的三个部分应该对同一个数据变量进行初始化,检测和更新,若不遵守这个规则,编写的循环会很难懂

  • 如果在for循环内部定义一个变量,这个变量就不能在循环体外使用

示例

// 输出123
for ( int i = 1 ; i <= 3 ; i++){
	System.out.println(i);
}

执行流程

 

案例

求和

需求

  • 求1-5之间的数据和,并把结果在控制台输出

分析

  1. 首先定义一个变量用来累加数据

  2. 其次定义一个可以访问1-5的for循环

  3. 最后打印数据

int sum = 0;  // 累加数据变量
for (int i = 1 ; i <= 5 ; i++){  // 定义 可以访问1 - 5的for 循环
    sum += i;   // 将i的值赋给sum,依次累加
    /*
    等价于 sum = sum + i;
    i == 1  sum = 0 + 1
    i++
    i == 2  sum = 1 + 2
    i++
    i == 3  sum = 3 + 3
    i++
    i == 4  sum = 6 + 4
    i++
    i == 5  sum = 10 + 5

	*/	
    System.out.println("1 - 5的和为:" + sum);  // 打印结果
}
 

求奇数和

需求

  • 求1- 10 之间的奇数和,并把求和结果在控制台输出

分析

方式一:

  1. 定义for循环使其能够访问到: 1 - 10之间的奇数

  2. 在for循环中,通过if筛选除奇数

  3. 在循环外定义一个整数变量sum用来累加这些数据

int sum = 0;
for (int i = 1 ; i <= 10 ; i++){
    if (i % 2 == 1){  // 通过if语句筛选,求余数,因为如果余数为1,一定是奇数
        sum += i;
    }

}
System.out.println(sum);

方式二:

  1. 定义for 循环使其能访问到1-10 之间的奇数,通过i+=2的方式来排除偶数

  2. 在循环外定义一个整数变量sum用来累加这些数据

int sum = 0;
for (int i = 1 ; i <= 10 ; i+=2){  // i += 2, 因为最开始i = 1,所以i += 2 只能为奇数
    sum += i;

}
System.out.println(sum);

水仙花数

需求

  • 在控制台输出所有的“水仙花数”,水仙花数必须满秩两个要求:

    • 水仙花数是一个三位数

    • 水仙花数个位,十位,百位的数字立方和等于原数(原来的数字)

分析

  1. 定义一个for循环,从100 -- 999.

  2. 每次访问数据后,提取该数据的 个位, 十位,百位数字

  3. 使用if判断:个位,十位,百位的数字立方和是否等于原数,等于则输出该数据

for (int i = 100; i <= 999; i++) {
    // 判断是否满足要求
    // 个位
    int ge = i % 10;
    // 十位
    int shi = i / 10 % 10;
    // 百位
    int bai = i / 100;
    if (ge*ge*ge + shi*shi*shi + bai*bai*bai == i){ // 判断个位十位百位的立方加一起是否等于他本身
        System.out.print(i + " ");
    }
}

while循环

  • 当条件为true时,while循环执行一条语句(也可以是一个块语句),如果开始时循环条件的值为false,那么while循环一次也不执行

while循环格式

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

示例

// 输出 0 - 2
int i = 0;
while ( i < 3 ){
	System.out.println(i);
	i++;
}

执行流程

 

案例

需求

  • 珠穆朗玛峰为(8848.86米 = 8848860毫米),假如有一张足够大的纸,他的厚度是0.1毫米,请问,折叠多少次,可以折成珠穆朗玛峰高度?

思路

  • 不清楚要循环多少次的情况,可以使用while循环实现

分析

  1. 定义一个变量存储珠穆朗玛峰的高度,和纸张的高度

  2. 使用while循环, 循环条件是(纸张厚度<山峰高度),内部控制纸张折叠,每折叠依次,纸张厚度为原来的两倍,循环定义计数变量,每折叠一次,变量+1

double zm = 8848860;  // 山峰高度(毫米数)
double zz = 0.1;   // 纸张厚度
int count = 0;
while (zz < zm) {   // 如果纸张厚度大于山峰高度,则循环结束
    zz *= 2;  // 纸张厚度每次*2
    count++;   // 计数
}
System.out.println("折叠的次数:" + count);   // 27

do-while循环

  • 先执行在判断循环条件,如果为true,就重复执行语句,然后再次检测循环条件

格式

初始化语句;
do {
	循环体语句;
	迭代语句;
}while(循环条件);

示例

// 输出 0 - 2
int i = 0;
do {
	System.out.println(i);
	i++;
}while(i<3);
  • do - while循环的特点:一定会先执行一次循环体

 

三种循环区别

  • for循环 和while循环(先判断后执行)

  • do... while(第一次先执行后判断)

for和while 区别

  • for循环和while循环的执行流程是一模一样的

  • 如果已知循环次数建议使用for 循环,如果不清楚循环多少次建议使用while循环

  • for循环中,控制循环的变量只能在循环中可以使用,while循环中,控制循环的变量在循环后还可以使用

死循环

  • 一直循环执行下去,如果没有干预不会停止下来

写法

for(;;){
	System.out.println("Hello World");
}

// 经典做法
while (true){  // 因为一直为真所以会一直循环
	System.out.println("Hello World");
}

do{
	System.out.println("Hello World");
} while(true);

案例

密码验证

需求:系统密码是520,请用户不断输入密码验证,验证不对输出密码错误,验证成功输出欢迎进入系统,并停止程序

分析

  1. 使用while死循环,让用户不停的输入数据

  2. 与密码比对,验证不成功输出密码错误

  3. 验证成功输出欢迎进入系统,并使用break结束当前循环的执行

Scanner in = new Scanner(System.in);
// 定义密码
int password = 520;
// 定义死循环,让用户不断输入
while (true){
    System.out.println("请输入正确的密码:");
    int passwords = in.nextInt();
    if(passwords == password){  // 判断是否输入成功
        System.out.println("登录成功!");
        break;  // 跳出循环
    }else{
        System.out.println("密码错误请重新输入!");
    }
}

循环嵌套

  • 循环中又包含循环

for (int i = 0; i <3; i++) {
    for (int j = 0; j < 5; j++) {
        System.out.println("123");
    }
}
  • 外部循环每循环一次,内部循环全部执行完一次

案例

需求

  • 在控制台使用*打印出4行5列的矩形

 

for (int i = 0; i <4; i++) {
    for (int j = 0; j < 5; j++) {
        System.out.print("*");
    }
    System.out.println();
}

跳转关键字:break , continue

跳转控制语句介绍

  • break : 跳出并结束当前所在循环的执行

  • continue : 用于跳出当前循环的当次执行,进入下一次循环

注意:

  • break: 只能用于结束所在循环,或者结束所咋switch分支的执行

  • continue : 只能在循环中进行使用

跳转关键字的使用

// 每周七天,前五天快乐的学习,周六周天放假,不用学习
for (int i = 1; i <= 7; i++) {
    System.out.println("快乐的学习!");
    if (i == 5){
        break;  // 跳出本次循环
    }
}
System.out.println("-----------");

// 学校决定周三放一天假,然后整个星期都要上课
for (int i = 1; i <= 7; i++) {
    if (i == 3){
        continue;   // 跳出当前循环,继续执行下一次循环
    }
    System.out.println("快乐的学习!" + i);

}

输出结果:

快乐的学习!
快乐的学习!
快乐的学习!
快乐的学习!
快乐的学习!
-----------
快乐的学习!1
快乐的学习!2
快乐的学习!4
快乐的学习!5
快乐的学习!6
快乐的学习!7

随机数Random类

Random的使用

  • 作用:用于在程序中获取随机数的技术

使用步骤:

  1. 导包

  2. 写一行代码代表得到随机数的对象

  3. 调用随机数的功能获取0-9的随机数

import java.util.Random;   // 导包

public class Main {
    public static void main(String[] args) {
        Random r = new Random();   // 获取随机数对象
        int number = r.nextInt(10);   // 调用获取0-9的随机数

        System.out.println("随机生成数字为:" + number);


    }
}

注意

  • nextInt(n)功能只能生成:0 至 n-1之间的随机数,不包含n

Random生成随机数的特点

  • nextInt(n)功能只能生成:0 至 n-1之间的随机数

Random生成区间随机数的技巧:减加法

  • 如果要生成1-10之间的随机数,程序怎么实现?

1 - 10   -->   -1  -->   (0-9)+1
Random r = new Random();   // 获取随机数对象
int number = r.nextInt(10)+1;   // 调用获取1-10的随机数
  • Random随机数如何生成 65 - 91 之间的随机数?

65 - 91  => (0 - 26) + 65    // 先用91减去65得到26,然后再加65
int number = r.nextInt(27)+65;   // 通过(0-26)+65 得到65-91之间的随机数

猜数字游戏

  • 需求

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

  • 分析

    • 随机生成一个1-100之间的数据

    • 使用死循环让用户不断提示用户猜测,,猜大提示猜大了,猜小提示猜小了,直到猜中结束游戏

import java.util.Random;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        Random r = new Random();   // 获取随机数对象
        int cs = r.nextInt(100)+1;  // 千万不要把随机生成的数字写在循环中,否则你输入一次,随机数变一次
        while (true){  // 定义死循环
            System.out.println("请输入你要猜的数字(1-100):");
            int cai = in.nextInt();  // 用户输入数字
            if (cai == cs){   // 判断是否相等
                System.out.println("恭喜你猜中了!");
                break;   // 猜中退出循环
            }else if (cai > cs){  // 判断用户输入的数是否大于随机数
                System.out.println("猜大了!");
            }else {   // 因为三种情况两种已经出现了,所以最后一个必定是小于,直接else就可以
                System.out.println("猜小了!");
            }
        }
    }
}

总结

1,if , switch 分支各自适合做什么业务场景?

  • if在功能上远远强大与switch

  • if 适合做区间匹配

  • switch 适合做:值匹配的分支选择,代码优雅

3.什么情况下会出现switch穿透现象?

  • case 中没有写break;

3.switch穿透性能解决什么问题?

  • 存在多个case分支的功能代码是一样时,可以使用穿透性把流程集中到同一处处理,处理可以简化代码

4.什么时候用for循环,什么时候用while循环?

  • 功能上是完全一样的,for能解决的while也能解决

  • 使用规范是:知道循环几次:使用for; 不知道循环几次建议使用:while

思维导图

 笔记文件链接

链接:https://pan.baidu.com/s/1CW7In2WiKHN28faQCvh0aw?pwd=cyzz
提取码:cyzz

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小陈努力学JAVA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值