Java03 流程控制
Java03 流程控制
3.1 顺序结构
程序从上至下依次逐行的执行,中间没有任何的判断和跳转的情况(比如咱们前面基础语法)
案例:
int age = 10;
System.out.println("年龄:"+age);// byte (-2的7次方 - 2的七次方 -1)
byte b=127;
System.out.println("byte:"+b);//short
short sh=10000;
System.out.println("short:"+sh);//int
int i=10000;
System.out.println("int:"+i);//float ==> 末尾+ f / F
float f=10000.121212234f;
System.out.println("float:"+f);
3.2 条件分支结构
- if 条件条件结构
- 单分支(if)
- 双分支(if…else)
- 多分支(if…else if…else)
- if嵌套(if 或者 else 语句中 又包含了另一个 条件分支判断)
- switch 选择结构
3.2.1 if 条件条件结构
3.2.1.1 单分支(if语句)
格式:
if(条件表达式){条件成立执行的代码;
}
注意:条件表达式结果 必须是 布尔类型
执行流程:
案例:定义年龄,判断是否是合法的工龄
//定义一个年龄,来判断这个是否能去打螺丝
int age = 19;
if (age >= 18) {System.out.println("年龄:" + age + "!合法了,可以去打螺丝了!");
}
3.2.1.2 双分支(if…else)
格式:
if(条件表达式){条件成立执行的代码
}else{条件不成立执行的代码
}
执行流程:
案例:
//定义一个年龄,来判断这个是否能去打螺丝
int age = 19;
if (age >= 18) {System.out.println("年龄:" + age + "!合法了,可以去打螺丝了!");
} else {System.out.println("年龄:" + age + "!不合法,回家多读书!");
}
3.2.1.3 多分支(if…elif…else)
格式:
if(条件1){条件1成立执行的代码
}
else if(条件2){条件2成立执行的代码
}
else if(...){...
}
else{以上条件都不满足
}
执行流程图:
案例:
if (age > 60) {System.out.println("年龄:" + age + "应该退休了!");
} else if (age >= 18 && age < 60) {System.out.println("年龄:" + age + "!合法了,可以去打螺丝了!");
} else if (age > 0 && age < 18) {System.out.println("年龄:" + age + "!不合法,回家多读书!");
} else {System.out.println("年龄定义有误!请重新定义!");
}
3.2.1.4 if 嵌套
- if嵌套(if 或者 else 语句中 又包含了另一个 条件分支判断)
以 判断 数字 小于 10, 再判断 是否是 偶数 为例
格式:
if(外层条件1){if(内层判断2){外层和内存条件都成立执行的代码}else{内层判断2 不成立执行的 代码}
}esle{外层条件1 不满足 执行的代码
}
执行流程:
案例:
定义一个数字,判断 数字是否 小于 10, 再判断 是否是 偶数
int a=20; if(a<10){ if(a%2==0){ System.out.println("数字:"+a+"是偶数!"); }else{ System.out.println("数字:"+a+"不是偶数!"); } }else{ System.out.println("数字:"+a+">=10! ,不满足要求!"); }
}
3.2.1.5 练习
1. 定义3个数,分别为 a 、b、c ,比较大小,分别按照从小到大的顺序进行输出
2. 简单的登录操作,假设:用户名="root" , 密码="123456" ,输入用户名和密码进行登录
3. 数字猜谜(指定一个数据,用户输入所猜的数字),比如 指定数据 a="某一个数据 x" ,用户去猜测指定的数是多少
3.2 switch 选择结构
switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支
格式:
switch(表达式){case 值1:代码块1;//表达式的结果 == 值1 所执行的语句break;//停止 (可写 也可 不写)case 值2:代码块2;break;......default:代码块;//表达式的值 和 以上 所有的 case 语句的值 没有相等的 时候 执行break;//在最后了,有没有 break 没有区别
}
执行流程:
- switch(表达式)中表达式的值必须是以下几种类型之一:
byte,short,char,int,枚举 (jdk 5.0),String (jdk 7.0)- case子句中的值必须是常量,不能是变量名或不确定的表达式值或范围;
- 同一个switch语句,所有case子句中的常量值互不相同;
- break语句用来在执行完一个case分支后使程序跳出switch语句块;
- 如果没有break,程序会顺序执行到switch结尾;
- default子句是可选的。同时,位置也是灵活的。当没有匹配的case时,执行default语句
案例:
int num = 1;
switch(num){case 0:System.out.println(0);break;case 1:System.out.println(1);break;case 2:System.out.println(2);break;case 3:System.out.println(3);break;default:System.out.println("以上case无满足要求");//break;
}
3.2.1 练习
1. 根据指定的月份输出对应季节(指定一个月份,输出该月份对应的季节)
2. 给定一个 年份 找出年份 对应的中国生肖。中国的生肖基于12年一个周期,每年用一个动物代表:rat、ox、tiger、rabbit、dragon、snake、horse、sheep、monkey、rooster、dog、pig。( 0猴 1鸡 2狗 3猪 4鼠 5牛 6虎 7兔 8龙 9蛇 10马 11羊)
3.3 循环结构
-
概念:在
特定条件
之下,重复的
执行特定功能 -
分类:
- while 循环
- do … while 循环
- for 循环
- 补充:JDK5.0 提供了
foreach
循环,方便的遍历集合、数组元素。(集合中讲解)
-
结构要素:
-
初始条件
-
结束条件
-
循环内容(重复的功能)
-
迭代部分
-
3.3.1 while 循环
while循环是一个条件循环语句,当条件满足时重复执行代码块,直到条件不满足为止。
格式:
while(条件表达式){//条件成立重复执行的部分循环体内容
}
结构分解:
①初始化部分
while(②循环条件部分){③循环体部分;④迭代部分;
}
执行流程:
案例:计算10!(10的阶乘)
// 1.定义初始条件 从1开始计算阶乘
int i = 1;
// 2.定义变量 res 用于接收 每一次阶乘的结果
int res = 1;
// 3.条件:当 i>10时停止循环计算
while (i <= 10) { // 4.将每次阶乘结果赋值 res *= i; // ==> res=res*i // 5.每次 计算了阶乘 就让 i+1 i += 1;
}
System.out.println(res);
3.3.2 do…while 循环
对于 while 语句而言,如果不满足条件,则不能进入循环。
do…while 循环和 while 循环相似,不同的是,do…while 循环至少会执行一次。
格式:
do{循环体内容
}while(条件表达式);
布尔表达式在循环体的后面,所以语句块在检测布尔表达式之前已经执行了。
结构分解:
①初始化部分;
do{③循环体部分④迭代部分
}while(②循环条件部分);
执行流程:
案例:
int x = 30;
do{ System.out.print("value of x : " + x );x++; System.out.print("value of x : " + x );
}while( x < 20 );
3.3.3 for 循环
所有循环结构都可以用 while 或者 do…while表示,
但 Java 还提供了另一种语句 —— for 循环,使一些循环结构变得更加简单。
for循环执行的次数是在执行前就确定的
格式:
for(初始化; 布尔表达式; 迭代) { //代码语句 循环体内容
}
结构分解:
for (①初始化部分; ②循环条件部分; ④迭代部分){③循环体部分;
}
执行流程:
案例:
- 遍历 0-9的是所有数字
for (int i = 0; i <= 9; i++) { System.out.println(i);
}
- 计算10!(10的阶乘)
// 定义变量 res 用于接收 每一次阶乘的结果
int res1 = 1;
// 条件:当 i>10时停止循环计算
for (int j = 1; j <= 10; j++) { // 将每次阶乘结果赋值 res1 *= j; // ==> res=res*i
}
System.out.println(res1);
遍历有明显的循环次数(范围)的需求,选择for循环
遍历没有明显的循环次数(范围)的需求,选择while循环
3.3.4 循环嵌套
- 指 一个循环结构A 的循环体是另一个 循环结构B。比如,for循环里面还有一个for循环,就是嵌套循环。其中,for ,while 均可以作为外层循环或内层循环。
- 嵌套循环就是把内层循环当成外层循环的循环体
以 for 嵌套 for 为例 (while或者其他情况同理)
结构:
for(初始化; 布尔表达式; 迭代) { for(初始化; 布尔表达式; 迭代) { 循环体内容}
}
结构分解:
for(初始化语句①; 循环条件语句②; 迭代语句⑦) {for(初始化语句③; 循环条件语句④; 迭代语句⑥) {循环体语句⑤;}
}
执行流程:
案例1:打印5行6个
******
******
******
******
******
//外层循环 i 控制 行
for(int j = 1;j <= 5;j++){//内层循环 j 作为 列数控制for(int i = 1;i <= 6;i++){//打印* System.out.print("*");}// 每行结束之后打印换行 System.out.println();
}
案例2:打印5行直角三角形
*
**
***
****
*****
for (int i = 1; i <= 5; i++) {for (int j = 1; j <= i; j++) {System.out.print("*");}System.out.println();
}
*技巧:
- 外层循环次数为
m
次,内层为n
次,则内层循环体实际上需要执行m*n
次- 外层循环控制
行数
,内层循环控制列数
- 外层循环执行一次,内层循环执行一轮。
- 实际开发中,嵌套循环一般是两层。一般不会出现超过三层的嵌套循环(如果出现,请好好反思一下自己的逻辑)*
3.4 循环控制(跳转语句,break和continue)
- 跳转语句主要用于实现循环语句时执行过程中程序流程的跳转。
- break 和 continue 主要用于控制循环是否继续执行
- break:停止整个循环,不再继续执行
- continue:跳过(只停止)当前循环,继续执行下一次循环
3.4.1 break
break 主要用在循环语句或者 switch 语句中,用来跳出当前整个语句块。
格式:
break;
案例:遍历字符“abcdefg” ,当遍历到字符“e”时停止遍历
//案例:遍历字符“abcdefg” ,当遍历到字符“e”时停止遍历
String str = "abcdefg";
for (int j = 0; j < str.length(); j++) { //判断是否遇到字符e if (str.charAt(j) == 'e') { break;//停止整个循环 } //打印每一个字符 System.out.println(str.charAt(j));
}
如果时嵌套循环中使用 break 时,结束的是包裹break关键字的最近的一层循环
3.4.2 continue
continue 适用于任何循环控制结构中。作用是让程序立刻跳转到下一次循环。
格式:
continue;
案例:遍历字符“abcdefg” ,当遍历到字符“e”时 不打印 “e” ,而继续打印之后的字符
//案例:遍历字符“abcdefg” ,当遍历到字符“e”时 不打印 “e” ,而继续打印之后的字符
String str = "abcdefg";
for (int j = 0; j < str.length(); j++) { //判断是否遇到字符e if (str.charAt(j) == 'e') { continue;//停止当前循环而继续下一次循环 } //打印每一个字符 System.out.println(str.charAt(j));
}
continue 主要是停止当前循环而继续下一次循环
3.5 拓展(键盘输入 和 随机数产生)
3.5.1 键盘输入(Scanner)
Java要实现从键盘输入的功能,主要使用的是 Scanner 这个类
3.5.1.1Scanner类使用步骤
- 导包:
import java.util.Scanner;
- 创建Scanner类对象:
Scanner sc = new Scanner(System.in);
- 调用Scanner类的相关方法(
sc.next() / sc.nextXxx()
) - 释放资源:
scan.close();
案例:模仿登录时,从键盘输入 用户名 和 密码
//1.导包
import java.util.Scanner; public class Demo_Scanner { public static void main(String[] args) { //2.创建 Scanner 类 的对象 Scanner sc = new Scanner(System.in); //模仿登录时,从键盘输入 用户名 和 密码 System.out.println("请输入用户名:"); //3.调用对象sc 的 方法,用于输入数据 String user = sc.next();//接收文本字符串 System.out.println("请输入密码:"); int pwd = sc.nextInt();//接收 int 类型数据 //打印接收到的数据 System.out.println(String.format("输入的用户名:%s ,输入的密码:%d ", user, pwd)); }
}
3.5.2 随机数(Math类)
Java 产生随机数 主要使用的是 Math类的random()方法
Math类的random()方法 会默认产生一个 [0,1)范围的数据(double类型数据)
System.out.println(Math.random());//0.05786483424413913
System.out.println(Math.random());//0.9647369623342374
指定产生某一范围的随机数:
- Math.random() * 100 —> [0,1)*100= [0,100)
- (int)(Math.random() * 100) —> [0,100) / [0,99]
- (int)(Math.random() * 100) + 5 ----> [5,105) / [5.104]
- (int)(Math.random() * (b - a + 1)) + a ---->[a,b) / [a,b]
3.6 练习
1. 遍历1-100的偶数,并计算所有偶数的和、偶数的个数
2. 从键盘输入整数,输入0结束,统计输入的正数、负数的个数
3. 输出水仙花数,所谓水仙花数是指一个3位数,其各个位上数字立方和等于其本身。例如: `153 = 1*1*1 + 3*3*3 + 5*5*5`
4. 输出任意位数的水仙花数据
5. 随机生成一个100以内的数,猜这个随机数是多少?从键盘输入数,如果大了提示,大了;如果小了,提示小了;如果对了,就不再猜了,并统计一共猜了多少次。6. 打印"菱形"* * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * *
7. 打印 99 乘法表
8. 将一天中的(偶数)的时间打印到控制台(x 时 xx 分 的形式)
9. 生成 1-100 之间的随机数,直到生成了 97 这个数,看看一共用了几次?
10. 某一年的某一个月的某一天,(比如:2023年2月24日)你决定要改变了。
你立志于1天比你的小伙伴多学习 1 小时 ==> 请计算 两年之后的那个年底 你比你小伙伴总共多学习了 多少 小时?
但是假如你每天和小伙伴一起打一个小时王者荣耀排位赛,一小时打两把,**输赢随机**,但是会没每一个月都会被重置 。请计算 两年之后你和你小伙伴王者多少星
重置规则:
1. 0 < * < 35 重置到 钻石(王者 -15 颗星)
2. 35 <= * <50 重置到 星耀 (王者 -5 课星 )
3. 50 <= * <=100 重置到 王者 0 星比如:输入-案例:
你觉醒的日子:2023年2月24日
你的王者段位(王者多少*):25
========>
两年之后:
你多学习了 xx 小时
你的王者段位:xxx