3.5 选择与循环语句
3.5.1 程序的结构
一般来说程序的结构有顺序结构、选择结构和循环结构三种,这三种结构有一个共同点,就是它们都只有一个入口,也只有一个出口。单一入出口可以让程序易读、好维护,也可以减少调试时间。
1. 顺序结构
程序由上至下逐行执行,一条语句执行完之后继续执行下一句,一直到程序末尾。
2. 选择结构
根据条件的成立与否决定要执行哪些语句。流程图如图所示:
3. 循环结构
根据判断条件的成立与否决定程序段落的执行次数,程序段落称为循环主体。
3.5.2 选择结构
1. if语句
if语句格式:
if(判断条件){
主体;
}
若是主体中的语句只有一个,则可省略大括号。
流程图如下:
2. if···else语
适合于程序中存在大量分支的判断语句。
if···else语句格式:
if(判断条件){
主体1;
} else{
主体2;
}
若在if语句或else语句主体中的语句只有一个,可以将大括号省去。
流程图如下:
3. 三目运算符
等价于if···else
三目运算符 三目运算符 意义 ?: 根据条件的成立与否来决定结果为:前面还是后面的表达式 ?:语句格式:
变量=条件判断?表达式1:表达式2
三目运算符比if···else更简洁,执行速度更快。
4. if···else if···else语句
在if···else中判断多个条件时用到
if···else if···else语句格式:
if(条件判断1){
主体1;
}else if{
主体2;
}
······ //多个else if语句
else{
主体3;
}
5. switch语句
switch语句将多选一的情况简化,使程序简洁易懂。if···else容易配对混淆,造成阅读上及运行上的错误,switch可以避免。
switch语句格式:
switch(表达式){
case 选择值 1:语句主体1
break;
case 选择值 2:语句主体2
break;
·······
case 选择值 n:语句主体n
break;
default: 语句主体;
}
switch中选择值只能是字符或常量。JDK1.5之后,也支持枚举的判断。
执行流程:
1.先计算括号中表达式的结果,结果是数字、字符或枚举
2.根据结果检测是否符合case后面的选择值,若所有case的选择值都不符合,则执行default,执行完毕即结束switch
3.如果结果符合某个case,则执行该case包含的语句,一直遇到break才结束switch
4.若是没有在case语句结尾处加上break,则会一直执行到switch结尾才结束 break是跳出语句
5.若是没有定义default,则什么也不执行,直接退出switch
流程图如下所示:
break语句的作用:
如果不加break,则switch语句会从第一个满足条件的case开始依次执行操作,直到最后一个条件执行完毕才会退出switch
3.5.3 循环结构
1. while循环
while是循环语句,也是条件判断语句。当事先不知道循环多少次时,就用到while
while语句格式:
while(循环条件判断){
语句1;
语句2;
······
语句n;
循环条件更改;
}
当主体只有一个语句时,可以省略大括号。在while循环语句中只有一个判断条件,它可以是任何表达式。为真循环执行,再重复测试判断条件,执行主体,直到条件为假,才跳离循环
执行流程:
1.第一次进入while循环前,必须先为循环控制变量(或表达式)赋起始值
2.根据判断条件的内容决定是否要继续执行循环
3.执行完主体后,重新为循环控制变量(或表达式)赋值(增加或减少),由设计者实现,完成后回到步骤2重新判断是否继续执行循环
如果程序中没有修改循环条件,那么程序就会出现“死循环”。出现死循环要直接结束程序(在命令行方式下,CTRL+C结束程序)
2. do···while循环
该循环也是用于未知循环执行次数的情况,与while循环最大的区别是在测试前都会执行一次循环体。
do···while语句格式:
do{
语句1;
·······
语句n;
循环条件改变;
}while(循环条件判断);
当主体只有一个语句时,可以省略大括号
执行流程:
1.进入循环前,要先为循环控制变量(或表达式)赋起始值
2.直接执行循环主体,执行完毕才根据条件判断是否继续执行
3.执行完循环主体后,重新为循环控制变量(或表达式)赋值(增加或减少),需要编程人员自己实现,然后再回到2重新判断是否继续执行循环
3.for循环
如果已经明确知道了循环次数,使用for循环
for语句格式:
for(赋初始值;判断条件;赋值增减量){
语句1;
········
语句n;
}
若是循环主体只含一条语句,可省略大括号
执行流程:
1.第一次进入for循环时,要为循环控制变量赋起始值
2.根据判断条件检查是否要继续执行循环
3.执行完循环后,控制变量会根据增减量的要求更改循环控制变量的值,然后回到2重新判断是否继续执行循环
4. 循环的嵌套
多个循环是可以嵌套的。
打印九九乘法表:
package com; public class ForNestedDemo { public static void main(String[] args) { for (int i = 1; i <=9; i++) { for (int j = 1; j <= i; j++) { System.out.print(i+"*"+j+"="+i*j+"\t"); } System.out.print("\n"); } } }
1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 Process finished with exit code 0
说明:
1.i为外层循环的循环控制变量,j为内层循环的循环控制变量
2.当i为1时,符合外层for循环的判断条件(i<=9),进入内层for循环主体。此时j的初值为1,符合内层for循环的判断条件(j<=i),输出i*j的值(1*1=1)。如果j的值加一后仍符合判断条件,则再次执行内层主体,直到j的值大于i时,离开内层循环,回到外层循环。此时,i的值加一为2,符合外层for循环的判断条件,继续执行内层for循环,直到i的值大于9时离开嵌套循环
3.5.4 循环的中断
Java中,可以使用如beak、continue等中断语句。站在结构化程序设计的角度上,并不鼓励用户使用中断语句,因为中断语句会增加调试及阅读的难度。
1. break语句
break语句强迫程序中断循环。当程序执行到break时,会离开循环,继续执行循环外层的下一个语句。如果break语句出现在嵌套循环的内层循环,则break只会跳出当前层的循环。
break格式:
for(初值赋值;判断条件;设增减量){
语句1;
·······
break;
······· //若执行break语句,则此块的语句不会被执行
语句n;
}
········ //跳出循环后,继续执行此块语句
package com; public class BreakDemo { public static void main(String[] args) { for (int i = 0; i < 10; i++) { //使用for循环 if(i==3){ //如果i的值为3,则退出整个循环 break; //退出整个循环 } System.out.println("i="+i); //打印信息 } } }
i=0 i=1 i=2 Process finished with exit code 0
2. continue语句
continue语句强迫程序跳到循环的起始处。当程序运行到continue时,会停止运行剩余的循环主体,而是回到循环的开始处继续执行。
continue格式:
for(初值赋值;判断条件;设增减量){
语句1;
·······
continue;
······· //若执行continue语句,则此处将不会被执行
语句n;
}
package com; public class BreakDemo { public static void main(String[] args) { for (int i = 0; i < 10; i++) { //使用for循环 if(i==3){ //如果i的值为3,则退出整个循环 continue; //退出整个循环 } System.out.println("i="+i); //打印信息 } } }
i=0 i=1 i=2 i=4 i=5 i=6 i=7 i=8 i=9 Process finished with exit code 0
i=3时,遇到continue没有继续向下执行,因此没有输出
局部变量:循环语句中定义的变量属于局部变量,指此变量只能在循环语句中使用,而在循环外的语句无法使用
eg:for中的i