> 文章列表 > Java03 流程控制

Java03 流程控制

Java03 流程控制

Java03 流程控制

  • 流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块
  • 流程控制主要分为三种
    • 顺序结构
    • 条件分支结构
    • 循环结构

3.1 顺序结构

程序从上至下依次逐行的执行,中间没有任何的判断和跳转的情况(比如咱们前面基础语法)
Java03 流程控制

案例:

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 条件分支结构

  1. if 条件条件结构
    • 单分支(if)
    • 双分支(if…else)
    • 多分支(if…else if…else)
    • if嵌套(if 或者 else 语句中 又包含了另一个 条件分支判断)
  2. switch 选择结构

3.2.1 if 条件条件结构

3.2.1.1 单分支(if语句)

格式:

if(条件表达式){条件成立执行的代码;

注意:条件表达式结果 必须是 布尔类型

执行流程:
Java03 流程控制

案例:定义年龄,判断是否是合法的工龄

//定义一个年龄,来判断这个是否能去打螺丝
int age = 19;
if (age >= 18) {System.out.println("年龄:" + age + "!合法了,可以去打螺丝了!");
}

3.2.1.2 双分支(if…else)

格式:

if(条件表达式){条件成立执行的代码
}else{条件不成立执行的代码
}

执行流程:
Java03 流程控制

案例:

//定义一个年龄,来判断这个是否能去打螺丝
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{以上条件都不满足
}

执行流程图:
Java03 流程控制

案例:

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 不满足 执行的代码
}

执行流程:
Java03 流程控制

案例:
定义一个数字,判断 数字是否 小于 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(表达式){case1:代码块1;//表达式的结果 == 值1 所执行的语句break;//停止 (可写 也可 不写)case2:代码块2break......default:代码块;//表达式的值 和 以上 所有的 case 语句的值 没有相等的 时候 执行break//在最后了,有没有 break 没有区别
}

执行流程:
Java03 流程控制

  1. switch(表达式)中表达式的值必须是以下几种类型之一:
    byte,short,char,int,枚举 (jdk 5.0),String (jdk 7.0)
  2. case子句中的值必须是常量,不能是变量名或不确定的表达式值或范围;
  3. 同一个switch语句,所有case子句中的常量值互不相同;
  4. break语句用来在执行完一个case分支后使程序跳出switch语句块;
  5. 如果没有break,程序会顺序执行到switch结尾;
  6. 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。( 01234567891011羊)

3.3 循环结构

  • 概念:在 特定条件 之下,重复的 执行特定功能

  • 分类:

    • while 循环
    • do … while 循环
    • for 循环
    • 补充:JDK5.0 提供了foreach循环,方便的遍历集合、数组元素。(集合中讲解)
  • 结构要素:

    • 初始条件

    • 结束条件

    • 循环内容(重复的功能)

    • 迭代部分

3.3.1 while 循环

while循环是一个条件循环语句,当条件满足时重复执行代码块,直到条件不满足为止。

格式:

while(条件表达式){//条件成立重复执行的部分循环体内容
}

结构分解:

①初始化部分
while(②循环条件部分){③循环体部分;④迭代部分;
}

执行流程:
Java03 流程控制

案例:计算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(②循环条件部分); 

执行流程:
Java03 流程控制

案例:

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 (①初始化部分; ②循环条件部分; ④迭代部分){③循环体部分;

执行流程:
Java03 流程控制

案例:

  1. 遍历 0-9的是所有数字
for (int i = 0; i <= 9; i++) {  System.out.println(i);  
}
  1. 计算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 循环嵌套

  1. 指 一个循环结构A 的循环体是另一个 循环结构B。比如,for循环里面还有一个for循环,就是嵌套循环。其中,for ,while 均可以作为外层循环或内层循环。
  2. 嵌套循环就是把内层循环当成外层循环的循环体

以 for 嵌套 for 为例 (while或者其他情况同理)

结构:

for(初始化; 布尔表达式; 迭代) { for(初始化; 布尔表达式; 迭代) { 循环体内容}
}

结构分解:

for(初始化语句①; 循环条件语句②; 迭代语句⑦) {for(初始化语句③; 循环条件语句④; 迭代语句⑥) {循环体语句⑤;}
}

执行流程:
Java03 流程控制

案例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();
}

*技巧:

  1. 外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n
  2. 外层循环控制行数,内层循环控制列数
  3. 外层循环执行一次,内层循环执行一轮。
  4. 实际开发中,嵌套循环一般是两层。一般不会出现超过三层的嵌套循环(如果出现,请好好反思一下自己的逻辑)*

3.4 循环控制(跳转语句,break和continue)

  1. 跳转语句主要用于实现循环语句时执行过程中程序流程的跳转。
  2. 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类使用步骤

  1. 导包:import java.util.Scanner;
  2. 创建Scanner类对象:Scanner sc = new Scanner(System.in);
  3. 调用Scanner类的相关方法(sc.next() / sc.nextXxx()
  4. 释放资源: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));  }  
}

Java03 流程控制

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

指定产生某一范围的随机数:

  1. Math.random() * 100 —> [0,1)*100= [0,100)
  2. (int)(Math.random() * 100) —> [0,100) / [0,99]
  3. (int)(Math.random() * 100) + 5 ----> [5,105) / [5.104]
  4. (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. 某一年的某一个月的某一天,(比如:2023224日)你决定要改变了。
你立志于1天比你的小伙伴多学习 1 小时 ==> 请计算 两年之后的那个年底 你比你小伙伴总共多学习了 多少 小时?
但是假如你每天和小伙伴一起打一个小时王者荣耀排位赛,一小时打两把,**输赢随机**,但是会没每一个月都会被重置 。请计算 两年之后你和你小伙伴王者多少星
重置规则:
1. 0 < * < 35 重置到 钻石(王者 -15 颗星)
2. 35 <= * <50 重置到 星耀 (王者 -5 课星 )
3. 50 <= * <=100 重置到 王者 0 星比如:输入-案例:
你觉醒的日子:2023224日
你的王者段位(王者多少*):25
========>
两年之后:
你多学习了 xx 小时
你的王者段位:xxx