2.5 程序流程控制
流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。
其流程控制方式采用结构化程序设计中规定的三种基本流程结构,即:顺序结构、分支结构和循环结构
- 顺序结构
程序从上到下逐行地执行,中间没有任何判断和跳转。
- 分支结构
根据条件,选择性地执行某段代码。
有if…else和switch-case两种分支语句。
- 循环结构
根据循环条件,重复性的执行某段代码。
有while、do…while、for三种循环语句。
注⭐️:JDK1.5提供了foreach循环,方便的遍历集合、数组元素。
2.5.1 顺序结构
Java中定义成员变量时采用合法的前向引用。如:
public class Test{
int num1 = 12;
int num2 = num1 + 2;
}
2.5.2 分支结构
- if-else
//1
if(条件表达式){
执行代码块;
}
//2
if(条件表达式){
执行代码块1;
}
else{
执行代码块2;
}
//3
if(条件表达式1){
执行代码块1;
}
else if (条件表达式2){
执行代码块2;
}
……
else{
执行代码块n;
}
import java.util.Scanner;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world");
Scanner scan = new Scanner(System.in);
System.out.println("身高:(cm)");
// 判断是否还有输入
if (scan.hasNext()) {
int height = scan.nextInt();
System.out.println(height);
}
// 判断是否有浮点数
System.out.println("财富:(千万)");
if (scan.hasNextFloat()) {
float money = scan.nextFloat();
System.out.println(money);
}
// 判断是否有布尔值
System.out.println("帅不:true or false");
if (scan.hasNextBoolean()) {
boolean shuai = scan.nextBoolean();
System.out.println(shuai);
}
scan.close();
}
}
/* 输出结果
Hello world
身高:(cm)
1
1
财富:(千万)
2
2.0
帅不:true or false
false
false
*/
- switch
- switch(表达式) 中的表达式的值必须是:byte short int 枚举 String
- case子句 中的值必须是常量,且互不相同;
- default子句 是可任选的。在没有匹配的case时,执行default子句;
-
break 用来在执行完一个case分支后,使程序跳出switch
语句的块;若没有break,程序则会顺序执行到switch结尾。
何时可以选择if或switch语句呢?
如果判断的具体数值不多,而且符合byte、 short 、int、 char这四种类型。虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高。
其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围更广
2.5.3 循环结构
在某些条件满足的情况下,反复执行特定代码的功能。
循环语句的四个组成部分
- 初始化部分(init_statement)
- 循环条件部分(test_exp)
- 循环体部分(body_statement)
- 迭代部分(alter_statement)
循环语句分类
- for 循环
for (初始化表达式; 布尔值测试表达式; 更改表达式){
语句或语句块;
}
- while 循环
是先判断循环条件,条件为真的时候,去执行循环体。直到false,退出循环。
[初始化语句]
while (布尔值测试表达式){
语句或语句块;
[更改语句];
}
- do/while 循环
先执行循环体,然后在判断循环条件。
/*
[初始化语句]
do{
语句或语句块;
[更改语句;]
}while(布尔值测试表达式); */
public class WhileLoop {
public static void main(String args[]){
int result = 0, i=1;
do{
result += i;
i++;
}while(i<=100);
System.out.println("result=" + result);
}
}
最简单无限循环格式:while(true) , for(;;),无限循环存在的原因是并不知道循环多少次,需要根据某些条件,来控制循环。
/*编写程序二:从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入为0时结束程序*/
Scanner scan = new Scanner(System.in);//创建屏幕录入的接收对象
int a = 0;//正数个数
int b = 0;//负数个数
for(;;) {
// while (true) {
if (scan.hasNextInt()) {
int receiverInt = scan.nextInt();
System.out.println(receiverInt);
if (receiverInt > 0) {
//+ 正数
a++;
}else if (receiverInt < 0) {
//- 负数
b++;
}else {
// == 0
break;
}
}
}
scan.close();
System.out.println("scan end.正数:"+ a + "个;负数:"+ b + "个");
/*编写程序一:求1到100之间所有偶数的和。用for和while语句分别完成*/
int sum1 = 0;
for (int i = 1; i <= 100; i++) {
if (i%2 == 0) {
sum1 += i;
}
}
System.out.println("for" + sum1);
int sum2 = 0;
int x = 1;
while (x <= 100) {
if (x%2 == 0) {
sum2 += x;
}
x++;
}
System.out.println("while" + sum2);
int sum3 = 0;
int y = 1;
do {
if (y % 2 == 0) {
sum3 += y;
}
y++;
} while (y <= 100);
System.out.println("do-while"+sum3);
2.5.4 嵌套循环(多重循环)
将一个循环放在另一个循环体内,就形成了嵌套循环
实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环。
设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n=mn次。
2.5.5 特殊的流程控制语句
break
- 用于终止某个语句块的执行
- break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
label1: { ……
label2: { ……
label3: { ……
break label2;
……
}
}
}
continue
- continue语句用于跳过某个循环语句块的一次执行
- continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环
return
并非专门用于结束循环的,它的功能是结束一个方法。当一个方法执行到一个return语句时,这个方法将被结束。
与break和continue不同的是,return直接结束整个方法,不管这个return处于多少层循环之内
- break只能用于switch语句和循环语句中。
- continue 只能用于循环语句中。
- 二者功能类似,但continue是终止本次循环,break是终止本层循环。
- break、continue之后不能有其他的语句,因为程序永远不会执行其后的语句。
- 标号语句必须紧接在循环的头部。标号语句不能用在非循环语句的前面。
- 很多语言都有goto语句,goto语句可以随意将控制转移到程序中的任意一条语句上,然后执行它。但使程序容易出错。Java中的break和continue是不同于goto的