摘要
通過本章的學習,讀者應該能夠使用if-then-else語句、while語句、for語句、switch語句控制Java程序的流程,能夠在最合適使用的時候,使用它們。並且知道它們與其它程序設計語言的流程控制之間的不同。
--------------------------------------------------------------------------------
本章目標:
通過本章的學習,讀者應該能夠使用if-then-else語句、while語句、for語句、switch語句控制Java程序的流程,能夠在最合適使用的時候,使用它們。並且知道它們與其它程序設計語言的流程控制之間的不同。
7.1 分支結構
實例說明
1.首先,我們使用文字編輯軟件輸入下源程序。
源程序:testBranch1.java
public class testBranch1
{
public static void main(String args[])
{
int myScore=96;
if (myScore >= 90)
System.out.println("Very Good!”);
if (myScore < 90)
System.out.println(“make great efforts!”);
}
}
注重:
假如在編譯過程中,出現了錯誤,請檢查if(myScore>=90)和if(MyScore<90)兩個表達式後面是否多加了分號,假如多加上,就將其刪掉。在此不答應加上分號。
2.使用javac編譯這個程序,假如正確完成編譯,將在當前目錄下生成一個名為testBranch1.class的文件;
3.最後輸入以下命令,運行這個程序:
c:javastudy> java testBranch1
執行這個程序,將輸出一些信息,如下圖所示:
圖7-1 程序testBranch1.java的輸出
傳授新知
我們先試著閱讀一下這個程序:這個程序可以分為三段:
1)
int myScore=96;
int myScore=96:
定義一個變量,名為myScore(應該代表“我的成績”),值為96。哦,就是說我的成績是96分;
2)
if (myScore >= 90)
System.out.println("Very Good!”);
這種格式的語句,我們在前面並沒有碰到過,在此,我們就試著讀一讀。if,就是假如的意思。也就是說if(myScore>=90)的意思“假如myScore大於或等於90”。
那麼當myScope大於或等於90就如何呢?System.out.println(“Very Good!”);做出了回答,向屏幕輸出“Very Good!”這一祝賀語。
這也就是為什麼在if(myScore>=90)的後面不能加上分號的原因?由於分號代表一個語句的結束,而說到if(myScore>=90)時,並沒有說完呀。
一些提示:
在上面的程序段中System.out.println(“Very Good!”);向內縮格,是為了大家一眼就看出,它從屬於上面的if語句。這是一種良好的編碼習慣,但在語法是卻並不是主要的。
這兩句程序最終實現了,當“我的成績”高於90分時,就誇獎我“Very Good!”。
3)
if (myScore < 90)
System.out.println(“make great efforts!”);
通過對上一條語句的分析,我想大家都應該能夠十分輕易地知道這條語句就是要表達:假如“我的成績”小於90分,就鼓勵我“make great efforts!”(加油,繼續努力!)。
好,我們現在來分析一下程序的輸出結果:只輸出了“Very Good!”,也就是說System.out.println(“make great efforts!”);並沒有執行!為什麼沒有執行呀?因為myScope比90大呀(這樣表達式myScore < 90的值就是false了)。
到此為止,我們就算摸清了if語句的脾氣了,如下圖所示:
圖7-2 基本if語句控制流示意圖
1) 首先判定if語句中的邏輯表達式(這個邏輯表達式的值是boolean型);
2) 假如是true,則執行if語句後部分的語句,完成某些操作;
3) 而假如是false,就不執行if語句後部分的語句,繼續執行if語句後面的程序。
if語句就是Java語言中提供的分支結構的流程控制語句。基本if語句的格式為:
if (邏輯表達式) 語句;
在本例中,當邏輯表達式的值為true時要執行的語句只有一條,假如有多條時,應該使用“{}”把它們圍起來:
if (邏輯表達式)
{
語句1;
語句2;
……
}
有時,在我們的程序中,會需要使用到如下圖所示的流程控制:
圖7-3 更復雜的分支結構流程控制語句
實例說明
假如使用後一種結構的if語句,會使得程序的流程更加清楚:
1.首先,我們使用文字編輯軟件輸入下源程序。
源程序:testBranch2.java
public class testBranch2
{
public static void main(String args[])
{
int myScore=96;
if (myScore >= 90)
{
System.out.println("Very Good!”);
}
else
{
System.out.println(“make great efforts!”);
}
}
}
2.使用javac編譯這個程序,並運行這個程序。我們將發現這個程序的輸出是與上一個程序testBranch1的輸出完全一樣的:
圖7-4 程序testBranch2.java的輸出
傳授新知
大家可以看到,這個程序就可讀了,假如myScore(“我的成績”)大於或等於90,那麼就打印“Very Good!”,否則(也就是說myScore不大於或等於90,即小於90)就打印“make great efforts!”。
從這個例子中,我們可以總結出if-then-else結構的if語句格式:
if (邏輯表達式)
{
語句;
}
else
{
語句;
}
在本節中,我們學習了流程控制中最基本的一種:分支結構。在Java語言中,是使用if語句來實現的。
自測練習
1) 使用if-then-else語句,_______使用縮排。
a.不能 b.建議 c.必須 d.有時必須
2) 閱讀以下程序,回答問題:
if (myScore >= 90)
System.out.println("Congratulate to you!”);
System.out.println("You score is very good!”);
if (myScore < 90)
System.out.println(“make great efforts!”);
假如myScore=96,則程序將輸出什麼?
____________________________________________________________________
____________________________________________________________________
假如mySore=50,則程序將輸出什麼?
____________________________________________________________________
____________________________________________________________________
你認為這符合邏輯嗎,假如不合邏輯該如何修改?
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
3)寫一個程序段,判定成績(myScope),若小於60,則輸出bad;若大於60,則輸出middle;若大於80,就輸出good;若大於90時,輸出better。
練習答案
1)b 采用縮排能夠使程序結構更加清楚,但這只是一個建議。
2)§ 假如myScope=96,程序將輸出:
Congratulate to you!
You score is very good!
§ 假如myScope=50,程序將輸出:
You score is very good!
make great efforts!
§ 當成績為50分時,程序還說“you score is very good!”,這說明這個程序不符合邏輯。應該改為:
if (myScore >= 90)
{
System.out.println("Congratulate to you!”);
System.out.println("You score is very good!”);
}
if (myScore < 90)
System.out.println(“make great efforts!”);
這是因為,if(myScore>=90)這個語句假如是真的話,應該執行兩個語句,而假如不使用“{}”將它們圍起來,則第2個語句就不屬於if(myScore>=90)了。這樣,程序就不管在什麼情況下都會執行這一句。
3)這個程序有多種寫法,下面列出了其中的一種:
if (myScore >= 90)
System.out.println(“better”);
if ((myScore >= 80)&&(myScore<90)
System.out.println(“good”);
if ((myScore >= 60)&&(myScore<80)
{
System.out.println(“middle”);
}
else
{
System.out.println(“bad”);
}
7.2 循環結構
7.2.1 while循環
實例說明
1.首先,我們使用文字編輯軟件輸入下源程序。
源程序:testLoop1.java
public class testLoop1
{
public static void main(String args[])
{
int counterLoop=8;
while (counterLoop > 0)
{
System.out.println(counterLoop);
CounterLoop - = 1;
}
}
}
2.使用javac編譯這個程序,並運行這個程序。我們將得到如下的輸出結果:
圖7-5 程序testLoop1.java的輸出
傳授新知
按慣例,我們先試著閱讀一下程序:
1)
int counterLoop=8;
int counterLoop=8:
定義一個變量,名為counterLoop(應該代表“循環的次數”),值為8。
2)
while (counterLoop > 0)
{
System.out.println(counterLoop);
counterLoop - = 1;
}
在這裡,我們碰到了一個前面沒有碰到過的語句:while,我們就試著分析一下:
while這個英語單詞表示的意思是“當…時候”,在這裡,應該就是表示“當counterLoop大於0的時候”。當它大於0時,怎麼樣呢?我們發現在while語句後跟著用“{}”圍起來的語句。對,就是說當counterLoop大於0時,就執行後面用“{}”圍起來的語句。
那麼我們再看一下“{}”圍起來的語句完成了什麼工作:
1) 首先將counterLoop的值輸出到屏幕上;
2) 然後將counterLoop的值減去1。
一些提示:
想想為什麼要將counterLoop的值減去1呢?其實很簡單,假如沒有在循環中修改counterLoop的值,那麼表達式“counterLoop>0”的值就將永遠為真,循環也就不會結束。
下圖形象深刻地說明了while循環的執行流程:
圖7-6 while循環控制流程示意圖
1) 首先判定while語句中的邏輯表達式(這個邏輯表達式的值是boolean型);
2) 假如是false,則不執行用“{}”圍起來的循環體,直接執行後面的程序;
3) 假如是true,則執行用“{}”圍起來的循環體語句,然後再回到第一步。
while語句是Java語言中提供的一種循環結構的流程控制語句。它的語法格式為:
while (邏輯表達式)
{
語句1;
語句2;
……
}
7.2.2 for循環
實例說明
1.與前面的例子一樣,我們首先使用文字編輯軟件輸入下源程序。
源程序:testLoop2.java
public class testLoop2
{
public static void main(String args[])
{
for (int counterLoop=8;counterLoop > 0;counterLoop--)
{
System.out.println(counterLoop);
}
}
}
2.使用javac編譯這個程序,並運行這個程序。我們將得到如下的輸出結果:
圖7-7 程序testLoop2.java的輸出
傳授新知
我們發現這個程序與上一個程序的輸出完全相同。其實,這個程序就是使用另一個循環語句來實現相同功能的程序。
現在,我們來看一下這個程序中主體部分:
for (int counterLoop=8;counterLoop > 0;counterLoop--)
{
System.out.println(counterLoop);
}
for,為了?因為?至於?我們一直現用的通過英文單詞的中文含義來理解程序的方法在這裡不那麼管用了!
一些提示:
其實還是有一個近似的解釋,那就是“適合於”,也就是說,滿足了括號裡面給出的條件。
而for後面括弧內的內容則更是令人費解。因此我們還是參閱相關手冊,再理解它吧:
for語句是Java語言中提供的另一種循環語句,它的語法結構如下:
for (循環初始值;循環結束條件表達式;修改表達式)
{
循環體語句;
……
}
也就是說,for語句中將循環變量初始的定義、循環變量的修改,以及循環結束條件都收集在一起,放在一塊了。按慣例,我們還是對它進行圖解:
圖7-8 for循環語句控制流程示意圖
結合這個控制流程,我們一起來分析一下這個程序過程:
1) 首先,定義了一個名為counterLoop的整型變量,值為0;
2) 然後檢查counterLoop的值是否大於0(循環結束條件)?
3) 假如為false,則跳出循環,接著執行後面的程序(在本程序中,後面沒有程序段,因此就退出了程序);
4) 假如為true,則執行循環體(在本程序中為打印出counterLoop的值);
5) 執行完循環體後,執行修改表達式,修改循環變量counterLoop的值,再轉到第二步,檢查counterLoop的值是否大於0。
自測練習
1) 以下不是循環語句的是_____________。
a. while b.if c.for
2) 在有循環結構的程序中,應該注重:___________。
a.循環體中的程序不應太長 b.避免條件表達式永遠為真值
c.能夠使用while循環,盡量使用while循環。
閱讀以下代碼,回答問題3)、4)、5):
int x=250;
int y=0;
while (x>0)
{
y++;
x-=5;
}
3) 完成了這個循環語句後,y的值將變成:_________。
a.0 b.250 c.50 d.51
4) 完成了這個循環語句後,x的值將變成:_________。
a.0 b.250 c.50 d.51
5) 在這個循環中,循環體內的語句共執行了________次,循環判定了_____次。
a.0 b.250 c.50 d.51
閱讀以下代碼,回答問題6)、7):
for (int x=10;x>0;x--)
{
System.out.println(i);
}
6)在這段代碼中,每一次循環時,首先執行___________語句。
a.int x=10 b. x>0 c.x-- d.System.out.println(i)
7)那麼每一次循環中最後執行的是______________語句。
a.int x=10 b. x>0 c.x-- d.System.out.println(i)
8)假如將testLoop1.java程序中的“counterLoop-=1;”這一行程序改為:
CounterLoop+=1;
那麼這個程序將產生什麼輸出呢?
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
9)現有一個如下的數組:
String weeks[ ] = {“Monday”,”Tuesday”,”Wednesday”,
”Thursday”,”Friday”,”Saturday”,”Sunday”};
請分別使用while循環和for循環,寫一個程序將它們的值打印到屏幕上。
a.使用While語句:
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
b.使用for語句:
_____________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
10)在下列程序片段中,你認為變量condition是________型的。你認為這個程序存在什麼問題?
a.int型 b.boolean型 c.float型 d.String型
while (condition)
{
y++;
x-=5;
}
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
11)判定以下命題是否正確,假如不正確,請舉例說明。
for循環都能夠改寫成while循環……………………………………………()
while循環都能夠改寫成for循環……………………………………………()
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
練習答案
1)b if語句是Java語言中的分支結構流控制語句。
2)b 假如循環語句中,控制循環結構的條件表達式永遠為真值的話,整個程序將陷入死循環。這是最重要的問題。
3)c x每減一次5,y就累加1,x從250減到0,得減50次,因此y最終值為50。
4)a 只要x大於0,循環就不會結束, 250每次減去5,當x不大於0時,值為0。
5)c d 循環體與y的值相等,50次;而要確定不執行循環體時,還要做一次判定,所以,共判定了51次。
6) b 每一次循環,都是以執行循環條件表達式開始的,因此是x>0
7) c 在for循環結束的最後一句,應該執行修改表達式,修改循環變量的值。
8) 按這樣的修改後,程序就會從8開始打印,9、10、11……,直到231-1。為什麼會這樣呢?這是因為:
§ counterLoop的初值是8,大於0,因此執行循環體;
§ 在循環體中,又將counterLoop加上了1,得到了9;
§ 這樣9顯然也是大於0,再次執行循環體。
這樣,counterLoop的值越來越大,也就再次運行循環體。
那麼,為什麼到了231-1就結束了呢?這是因為,int的最大值是231-1,超過這個數以後,就溢出,而溢出就小於0,循環結束。
這個程序就算是死循環了,循環能夠結束,只是因為數字溢出。
9) 使用while循環:
public class whileLianxi
{
String weeks[ ] = {“Monday”,”Tuesday”,”Wednsday”,
”Thursday”,”Friday”,”Saturday”,”Sunday”};
int x=0;
public static void main(String args[])
{
while(x<7)
{
System.out.println(weeks[x]);
x++;
}
}
}
而假如使用for語句來實現的話,就是:
public class forLianxi
{
String weeks[ ] = {“Monday”,”Tuesday”,”Wednsday”,
”Thursday”,”Friday”,”Saturday”,”Sunday”};
int x;
public static void main(String args[])
{
for(x=0;x<7;x++)
{
System.out.println(weeks[x]);
}
}
}
10)b 能夠做為條件表達式的變量,只能是boolean型的。
在這個程序中,循環體內並未改變condition的值。假如condition是true的話,則這個循環將永遠不會結束;而假如condition是fasle的話,還好,只是不執行這個循環體。
11)for循環都能夠改寫成while循環……………………………………………(對)
while循環都能夠改寫成for循環……………………………………………(錯)
例如,上一題中的while循環就無法改寫成為for循環。
while (condition)
{
y++;
x-=5;
}
7.3 多分支結構
實例說明
在前面的章節中,我們學習過了使用if語句的分支結構,那麼多分支結構又有什麼作用呢?下面,我們思考一下如何完成這樣一個任務:
我們要構造一個程序,讓它判定我的成績myScope,假如:
1) 假如大於90分,打印“Excellent”(優秀);
2) 假如大於80分,小於90分,打印“Good”(很好);
3) 假如大於70分,小於80分,打印“Average”(一般);
4) 假如大於60分,小於70分,打印“Pool”(差);
5) 假如小於60分,打印“Failure”(極差)。
假如要使用學習過的if語句來完成,將會十分費勁,程序也十分難懂。下面我們做一個實踐:
1.首先,我們使用文字編輯軟件輸入下源程序。
源程序:multiCass.java
public class multiCase
{
public static void main(String args[])
{
int myScope=89;
int grade=myScope/10;
switch(grade)
{
case 10:
case 9:
System.out.println(“Excellent!”);
break;
case 8:
System.out.println(“Good!”);
break;
case 7:
System.out.println(“Average!”);
break;
case 6:
System.out.println(“Pool”);
break;
default:
System.out.println(“Failure!”);
}
}
}
2.使用javac編譯這個程序,並運行這個程序。我們將得到如下的輸出結果:
圖7-9 程序multiCass.java的輸出
傳授新知
這個程序比較長,不過還是很好理解的,它可以分成兩個邏輯塊:
int myScope=89;
int grade=myScope/10;
首先,定義了變量myScope,用來存放我的成績;然後定義了一個整型變量grade,它的值是myScope的十分之一。
一些提示:
在這裡涉及了一個編程的技巧,我們將grade賦值為myScope/10,這樣,我們就可以得到myScope的十位上的數(由於是整型變量,所以不會有小數),通過這個十位上的數就可以簡單地得到它們的分數段。
接下來,就是本節的主角,多分支結構控制語句switch-case:
switch(grade)
{
case 10:
case 9:
System.out.println(“Excellent!”);
break;
case 8:
System.out.println(“Good!”);
break;
case 7:
System.out.println(“Average!”);
break;
case 6:
System.out.println(“Pool”);
break;
default:
System.out.println(“Failure!”);
}
switch,開關,我們定義了一個grade開關,然後根據它的狀態來決定執行什麼語句:
1) 當(case)開關值為10和9時,則執行語句:
System.out.println(“Excellent!”);
2) 而當開關值為8時,則執行語句:
System.out.println(“Good!”);
3) 而當開關值為7時,則執行語句:
System.out.println(“Average!”);
4) 當開關值為6時,則執行語句:
System.out.println(“Pool!”);
5) 假如開關值為其它的話,就視為default,執行語句:
System.out.println(“Failure!”);
注重,在每種case之間,都使用了break語句,break,在英文中是中斷的意思,也就是說,執行到這裡中斷多分支結構,跳出switch-case語句。
而在本程序中,由於mySope=89,由此計算出grade值為8,因此執行case 8:後面的語句:System.out.println(”Good!”);這樣就在屏幕上打印出了“Good!”。接著執行到break語句,跳出了switch語句。
Switch-case多分支結構的控制流程如下圖所示:
圖7-10 switch-case多分支結構控制流程示意圖
Switch-case的語法結構如下(在[]內的表示是可選代碼):
switch(選擇變量)
{
case c1:
[語句]
[break]
case c2:
[語句]
[break]
……
case c1:
[語句]
[break]
[default:]
[語句]
}
在Java語言的多分支結構中,選擇變量可以是int型,也可以是char型。而case後面的c1、c2…cn必須是與int型或char型的常量,而不能是變量。Default語句是可選的。
注重,switch語句應使用“{}”圍起來。
注重:
假如switch語句找不到匹配的標專而且沒有default塊,將會產生一個錯誤。
自測練習
1) switch語句的選擇變量可以_______、_________類型的。
a. int b.boolean c.char d.float
2) 用來區別每一個switch分支的保留字是__________。
a.choice b.condition c.case d.break
3) 假如switch語句的選擇變量的值與每一個case語句中都不匹配,將使用________選擇。
a.any b.default c.none d.other
4) 在switch語句中是可選的語句是___________。
a.switch b.default c.other d.case
5) 根據以下要求,使用switch語句編寫程序。
某校使用“A”、“B”、“C”、“D”、“E”來為學生打成績,請編寫一個程序,當:
成績為A時,打印出“Excellent!”;
成績為B時,打印出“Good!”;
成績為C時,打印出“Average!”;
成績為D時,打印出“Pool!”;
成績為E時,打印出“Failure!”。
假設本程序用來打印學生甲的成績情況,而學生甲的成績“B”存放在變量myScope。
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
練習答案
1)a、c 在Java語言的switch-case語句中,可以使用int或char型變量做選擇變量。
2)c 每一個分支,使用case標記出來。
3)b 不匹配時,將查找default。
4)b 在switch-case語句中,switch與case都是必選項,other並不存在於swithc-case語句中,而只有default語句是可選的。
5)程序如下:
public class switchLianxi
{
public static void main(String args[])
{
char myScope=’B’;
switch(myScope)
{
case ‘A’:
System.out.println(“Excellent!”);
break;
case ‘B’:
System.out.println(“Good!”);
break;
case ‘C’:
System.out.println(“Average!”);
break;
case ‘D’:
System.out.println(“Pool”);
break;
case ‘E’:
System.out.println(“Failure”);
}
}
}