2.5 程序流程控制
流程控制語句是用來控制程序中各語句執(zhí)行順序的語句,可以把語句組合成能完成一定功能的小邏輯模塊。
其流程控制方式采用結(jié)構(gòu)化程序設計中規(guī)定的三種基本流程結(jié)構(gòu),即:順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)
- 順序結(jié)構(gòu)
程序從上到下逐行地執(zhí)行,中間沒有任何判斷和跳轉(zhuǎn)。
- 分支結(jié)構(gòu)
根據(jù)條件,選擇性地執(zhí)行某段代碼。
有if…else和switch-case兩種分支語句。
- 循環(huán)結(jié)構(gòu)
根據(jù)循環(huán)條件,重復性的執(zhí)行某段代碼。
有while、do…while、for三種循環(huán)語句。
注??:JDK1.5提供了foreach循環(huán),方便的遍歷集合、數(shù)組元素。
2.5.1 順序結(jié)構(gòu)
Java中定義成員變量時采用合法的前向引用。如:
public class Test{
int num1 = 12;
int num2 = num1 + 2;
}
2.5.2 分支結(jié)構(gòu)
- if-else
//1
if(條件表達式){
執(zhí)行代碼塊;
}
//2
if(條件表達式){
執(zhí)行代碼塊1;
}
else{
執(zhí)行代碼塊2;
}
//3
if(條件表達式1){
執(zhí)行代碼塊1;
}
else if (條件表達式2){
執(zhí)行代碼塊2;
}
……
else{
執(zhí)行代碼塊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);
}
// 判斷是否有浮點數(shù)
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();
}
}
/* 輸出結(jié)果
Hello world
身高:(cm)
1
1
財富:(千萬)
2
2.0
帥不:true or false
false
false
*/
- switch
- switch(表達式) 中的表達式的值必須是:byte short int 枚舉 String
- case子句 中的值必須是常量,且互不相同;
- default子句 是可任選的。在沒有匹配的case時,執(zhí)行default子句;
-
break 用來在執(zhí)行完一個case分支后,使程序跳出switch
語句的塊;若沒有break,程序則會順序執(zhí)行到switch結(jié)尾。
何時可以選擇if或switch語句呢?
如果判斷的具體數(shù)值不多,而且符合byte、 short 、int、 char這四種類型。雖然兩個語句都可以使用,建議使用swtich語句。因為效率稍高。
其他情況:對區(qū)間判斷,對結(jié)果為boolean類型判斷,使用if,if的使用范圍更廣
2.5.3 循環(huán)結(jié)構(gòu)
在某些條件滿足的情況下,反復執(zhí)行特定代碼的功能。
循環(huán)語句的四個組成部分
- 初始化部分(init_statement)
- 循環(huán)條件部分(test_exp)
- 循環(huán)體部分(body_statement)
- 迭代部分(alter_statement)
循環(huán)語句分類
- for 循環(huán)
for (初始化表達式; 布爾值測試表達式; 更改表達式){
語句或語句塊;
}
- while 循環(huán)
是先判斷循環(huán)條件,條件為真的時候,去執(zhí)行循環(huán)體。直到false,退出循環(huán)。
[初始化語句]
while (布爾值測試表達式){
語句或語句塊;
[更改語句];
}
- do/while 循環(huán)
先執(zhí)行循環(huán)體,然后在判斷循環(huán)條件。
/*
[初始化語句]
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);
}
}
最簡單無限循環(huán)格式:while(true) , for(;;),無限循環(huán)存在的原因是并不知道循環(huán)多少次,需要根據(jù)某些條件,來控制循環(huán)。
/*編寫程序二:從鍵盤讀入個數(shù)不確定的整數(shù),并判斷讀入的正數(shù)和負數(shù)的個數(shù),輸入為0時結(jié)束程序*/
Scanner scan = new Scanner(System.in);//創(chuàng)建屏幕錄入的接收對象
int a = 0;//正數(shù)個數(shù)
int b = 0;//負數(shù)個數(shù)
for(;;) {
// while (true) {
if (scan.hasNextInt()) {
int receiverInt = scan.nextInt();
System.out.println(receiverInt);
if (receiverInt > 0) {
//+ 正數(shù)
a++;
}else if (receiverInt < 0) {
//- 負數(shù)
b++;
}else {
// == 0
break;
}
}
}
scan.close();
System.out.println("scan end.正數(shù):"+ a + "個;負數(shù):"+ b + "個");
/*編寫程序一:求1到100之間所有偶數(shù)的和。用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 嵌套循環(huán)(多重循環(huán))
將一個循環(huán)放在另一個循環(huán)體內(nèi),就形成了嵌套循環(huán)
實質(zhì)上,嵌套循環(huán)就是把內(nèi)層循環(huán)當成外層循環(huán)的循環(huán)體。當只有內(nèi)層循環(huán)的循環(huán)條件為false時,才會完全跳出內(nèi)層循環(huán),才可結(jié)束外層的當次循環(huán),開始下一次的循環(huán)。
設外層循環(huán)次數(shù)為m次,內(nèi)層為n次,則內(nèi)層循環(huán)體實際上需要執(zhí)行m*n=mn次。
2.5.5 特殊的流程控制語句
break
- 用于終止某個語句塊的執(zhí)行
- break語句出現(xiàn)在多層嵌套的語句塊中時,可以通過標簽指明要終止的是哪一層語句塊
label1: { ……
label2: { ……
label3: { ……
break label2;
……
}
}
}
continue
- continue語句用于跳過某個循環(huán)語句塊的一次執(zhí)行
- continue語句出現(xiàn)在多層嵌套的循環(huán)語句體中時,可以通過標簽指明要跳過的是哪一層循環(huán)
return
并非專門用于結(jié)束循環(huán)的,它的功能是結(jié)束一個方法。當一個方法執(zhí)行到一個return語句時,這個方法將被結(jié)束。
與break和continue不同的是,return直接結(jié)束整個方法,不管這個return處于多少層循環(huán)之內(nèi)
- break只能用于switch語句和循環(huán)語句中。
- continue 只能用于循環(huán)語句中。
- 二者功能類似,但continue是終止本次循環(huán),break是終止本層循環(huán)。
- break、continue之后不能有其他的語句,因為程序永遠不會執(zhí)行其后的語句。
- 標號語句必須緊接在循環(huán)的頭部。標號語句不能用在非循環(huán)語句的前面。
- 很多語言都有g(shù)oto語句,goto語句可以隨意將控制轉(zhuǎn)移到程序中的任意一條語句上,然后執(zhí)行它。但使程序容易出錯。Java中的break和continue是不同于goto的