流程控制
一、if分支结构
(一) 基本if分支结构
- 作用:根据某个条件,控制某些代码执行与否
- 语法:
if(布尔表达式){
//当布尔表达式结果为true时,执行
}
布尔类型表达式:结果为boolean类型的表达式,也可以是值或者变量
- 执行流程
1. 首先获取布尔表达式的结果
2. 如果布尔表达式的值为true就执行语句体
3. 如果布尔表达式的值为false就不执行语句体
4. 继续执行后面的语句内容
- 流程图
- 例: 打印a/b 的结果,避免错误
Scanner sc = new Scanner(System.in);
System.out.println("请输入两个整数:");
int a = sc.nextInt();
int b = sc.nextInt();
if(b!=0){ // 如果b不等于0,在执行除法运算
System.out.println(a/b); //如果b==0则出现异常
}
(二) if-else 双分支结构
- 作用:根据某个条件,选择要执行的代码
- 语法:
if(布尔表达式){
//当布尔表达式为true时执行
}else{
//当布尔表达式为false时执行
}
- 执行流程:
1.首先获取布尔表达式的结果
2.如果布尔表达式的值为true就执行if代码块
3.如果布尔表达式的值为false就执行else代码块
4.继续执行后面的语句内容
- 流程图
- 例:打印a/b的结果,如果b为0则打印,除数不能为0
Scanner sc = new Scanner(System.in);
System.out.println("请输入两个整数:");
int a = sc.nextInt();
int b = sc.nextInt();
if(b!=0){ //如果b不等于0 在执行除法运算
System.out.println(a/b); //如果b==0则出现异常
}else{
System.out.println("出书不能为0");
}
(三) 多重if分支结构
- 作用:依次判断,多重判断,满足不同的条件,执行不同的代码
- 语法:
if(布尔表达式1){
//当布尔表达式1为true时执行
}else if(布尔表达式2){
//当布尔表达式1为false且 布尔表达式2为true时执行
}else if(布尔表达式3){
//当布尔表达式2为false 且布尔表达式3为true时执行
}...
else{
//以上所有布尔表达式为false时执行
}
注意:其中一个布尔表达式为true时,执行代码块中的代码,执行完毕后程序之际跳出if语句结构,向下执行其他代码
- 执行流程:
1.首先计算布尔表达式1的值
2.如果值为true就执行if代码块;如果值为false就获取布尔表达式2的值
3.如果值为true就执行else if代码块;如果职位false就获取布尔表达式3的值
4.……
5.如果没有任何关系表达式true,就执行else代码块
- 流程图
- 例 :从控制台输入一个分数,根据分数答应对应的评级
规则如下:
分数>=85 则打印 优
分数>=70 且 分数<85 打印 良
分数>=60 且 分数<70 打印 中
分数60分以下,打印 差
Scanner sc = new Scanner(System.in);
//从控制台接受数据
int score = sc.nextInt();
if(score>=85){ // 优:85分以上
System.out.println("优");
}else if(score >= 70){ //良:70~84
System.out.println("良");
}else if(score >= 60){ //中: 60~69
System.out.println("中");
}else{ //差:60分以下
System.out.println("差");
}
二、switch语句
- 作用:用于等值判断,根据变量的某个值执行不同的代码
- 语法:
switch( 变量 ){
case 值1 : 当变量的值与值1相等时执行;
case 值2 : 当变量的值与值2相等时执行;
case 值3 : 当变量的值与值3相等时执行;
…………
default: 当变量与以上值均不相等时执行;
}
- 支持的变量类型: byte/short/int/char/String(JDK7)
- 例:用户输入数值,表示比赛获得的名次,打印对应的称号
要求:
1: 打印冠军
2:打印亚军
3:打印季军
4:打印殿军
其他:打印请继续努力
Scanner sc = new Scanner(System.in);
System.out.println("请输入名次:");
int n = sc.nextInt();
switch( n ){
case 1 : System.out.println("冠军");//等效于:if n==1
case 2 : System.out.println("亚军");//等效于:else if n==2
case 3 : System.out.println("季军");//等效于:else if n==3
case 4 : System.out.println("殿军");//等效于:else if n==4
default : System.out.println("请继续努力");//等效于:else
}
注意:switch保留了c语言 的fall-through落空机制,当满足某个条件时,执行代码后,程序会无条件继续向下执行其他代码。
- break 关键字
作用: 用于switch语句的流程控制,当程序遇到break关键字时立刻跳出switch语句执行后续的代码。
例: 使用break 配合switch 语句完成等值判断操作
switch( 变量 ){
case 值1 : 当变量的值与值1相等时执行;break;
case 值2 : 当变量的值与值2相等时执行;break;
case 值3 : 当变量的值与值3相等时执行;break;
....
default : 当变量与以上值均不相等时执行
}
- 修改案例程序
Scanner sc = new Scanner(System.in);
System.out.println("请输入名次:");
int n = sc.nextInt();
switch( n ){
case 1 : System.out.println("冠军");break;//n==1
case 2 : System.out.println("亚军");break;//n==2
case 3 : System.out.println("季军");break;//n==3
case 4 : System.out.println("殿军");break;//n==4
default : System.out.println("请继续努力");
}
三、补充内容
- 当if语句结构中只有一行代码需要执行时{ }可以省略,else if与else 同理。
例:从控制台输入一个分数,根据分数答应对应的评价
if( score>=85 )System.out.println("优");
else if( score>=70 )System.out.println("良");
else if( score >=60 )System.out.println("中");
else System.out.println("差");
- JDK12 支持switch表达式,可以生成一个结果
- JDK13 持续优化switch表达式,可以在打印语句中直接使用[预览版]
- JDK14 switch表达式与其他特性确认为最终版
四、局部变量
- 概念:定义在函数(方法)内部的变量
- 特点/注意事项:
1. 先赋值,再使用
2. 作用范围在定义行开始,到所在代码块结束
3. 重合作用范围内,不允许重名
- 例:先赋值再使用
int a;
System.out.println( a );//编译错误,未初始化(未赋值)
- 例:作用范围在定义行开始,到所在代码块结束
int b = 10;
if( b>= 10){
int a = 20;
System.out.println( a );
}
System.out.println( a );//编译错误:找不到符号 a(超出a变量的使用范围)
- 例:重合作用范围内,不允许重名
int a = 10;
//int a = 10;//编译错误:已定义 a
if( a >= 10){
int b = 100;
System.out.println( b );//100
}else{
int b = 200;
System.out.println( b );//200
}
//两个变量b作用范围并没有重合,可以重复定义。
五、循环结构
- 作用:通过某个条件,重复且有规律的执行代码
- 程序执行流程:
1. 顺序执行流程:从第一行代码开始,逐行执行,直至最后一行。每行代码的执行次数:1次
2. 条件分之流程 :可能需要验证某个条件的真假选择是否执行代码。每行代码的执行次数:0~1次
3. 循环执行流程:可能需要验证某个条件的真假选择是否执行代码。每行代码的执行次数:0~n次
(一)while循环(重点)
- 语法:
while( 布尔表达式 ){//与if语句触发机制相同
//[循环体]当布尔表达式为true时执行
}
- 执行流程:
- 判断循环条件
- 执行循环体中的代码
1~2反复执行,循环条件为 false 跳出循环结构 - 定义循环变量:设置循环起点
- 在循环过程中利用循环变量的变化完成数学运算
计算1~100的和 1+2+3+4+5.....+100
例:分解过程
int sum = 0;//累计i变量的值
int i = 0;
sum+=i;//将i变量的值累加到sum变量中
i++;
sum+=i;
i++;
sum+=i;
i++;
//.......i==101结束
例:使用循环计算
int sum = 0;//累计i变量的值
int i= 1;
while( i <= 100){
sum += i;//将i变量的值累加到sum变量中
i++;
}
System.out.println( sum );//打印累和结果
例:计算1/3/5/7/9.....99的和
int sum = 0;//累计i变量的值
int i= 1;
while( i <= 100){
sum += i;//将i变量的值累加到sum变量中
i+=2;
}
System.out.println( sum );//打印累和结果
(二)do....while循环
- 语法:
do{
//[循环体]当布尔表达式为true时执行
}while( 布尔表达式 );
- 执行流程:
- 执行循环体中的代码
- 判断循环条件
1~2反复执行,循环条件为 false 跳出循环结构
- 例:使用do...while循环打印HelloWorld 1~100
//定义循环变量
int i = 1;
do{
System.out.println("HelloWorld\t"+i);
//改变循环的值
i++;
}while( i<=100 );//设置循环条件
- while循环与do...while循环的区别:
while 循环先判断,再执行; 循环体执行次数:0~N次
do..while循环先执行,再判断;循环体执行次数:1~N次
只有在第一次循环条件为 false 时才有区别
(三)for循环(重点)
- 语法:
for(定义循环变量; 设置循环条件; 改变循环变量的值){
//[循环体]当布尔表达式为true时执行
}
- 执行流程:
与whlie循环一致,只不过三要素定义在了一行
1. 定义循环变量
2. 判断循环条件
3. 执行循环体
4. 改变循环变量的值
2~4反复执行,当循环条件为 false 时跳出循环结构
- 例:使用 for循环输出HelloWorld1~100
// (1) (2) (4)
for( int i=1; i<=100; i++ ){
//(3)
System.out.println("HelloWorld\t"+i);
}
//(1):定义循环变量
//(2):判断循环条件
//(3):循环体
//(4):改变循环变量的值
执行顺序:(1)/(2)/(4)/(3)
- for循环的其他 变形写法
例:
//参照上面的for各个要素的执行顺序,我们可以对for循环进行变形后的写法
//变形一:将循环变量定义到for循环的上面
int i=0;
for(;i<10;i++){
System.out.println(i);
}
// 变形二:在变形一的基础上,将循环条件写在循环体中的最上面
int i = 0;
for(;;i++){
if(i<10){
System.out.println(i);
}else{
break;
}
}
// 变形三:在变形二的基础上,将对循环遍历的操作放在循环体中最后的位置
int i = 0;
for(;;){
if(i<10){
System.out.println(i);
}else{
break;
}
i++;
}
- 各个循环的特点:
while、do...while循环适用于无限次数循环,没有明确的循环次数只有结束条件
for循环适用于有限次数循环,拥有三要素,功能层次分明,结构清晰