條件語句
在Java中,條件語句的格式為
if(condition)statement
這裡的條件必須用括号括起來。與絕大多數程式設計語言一樣,Java常常希望在某個條件為真時執行多條語句。在這樣的情況下,應該使用塊語句,例如:
if(a>=b){
System.out.println(a);
}
另外,我們需要介紹一下代碼塊。什麼是代碼塊?
塊,是指由一對大括号括起來的若幹條簡單的java語句。塊确定了變量的作用域。一個塊可以嵌套到另一個塊中。需要注意的是,不能在嵌套的兩個塊中聲明同名的變量。
在Java中,if經常和else搭配。例如:
if(a>=b){
System.out.println(a);
}else{
System.out.println(b);
}
其中else部分是可選的。else子句與最鄰近的if構成一組。
重複出現if…else…是一個很正常的情況。需要注意的是,else是與哪一個if配對。
多重選擇
在處理多個選項時,使用if/else結構顯得有些笨重。Java中用一個與C語言完全一樣的switch語句。
例如,我們建立一個包含4個選項的菜單系統。
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("select an option on (1,2,3,4)");
int i = in.nextInt();
switch (i){
case 1:
System.out.println(i);
break;
case 2:
System.out.println(i);
break;
case 3:
System.out.println(i);
break;
case 4:
System.out.println(i);
break;
default:
System.out.println("無");
break;
}
}
switc語句将從與選項值相比對的case标簽處開始執行直到遇到break語句,或者執行到switch語句的結束處為止。如果沒有比對的case标簽,那麼,執行default子句。
需要我們注意的是,我們在程式設計式的時候,可能會觸發多個case分支。如果在case分支語句的末尾沒有break語句,那就會接着執行下一個case分支語句。這種情況相當危險,常常引發錯誤。是以,我們在程式中盡量少用switch語句。
case的标簽可以是:
- 類型為char、byte、short或int的常量表達式。
- 枚舉常量(當在switch語句中使用枚舉常量時,不必再每個标簽中指明枚舉名,可以有switch的表達式值确定)
- 從Java se 7開始,case标簽還可以是字元串字面量
循環
1. while循環
當條件為真(true)時,while循環執行一條語句(也可以是一個語句塊)。格式為:
while(condition)statement
如果開始條件為flase,那麼一次也不執行。
我們以一個例子來說明,該程式是計算需要多長時間才能存夠一定的終身俸。
public class RetirementTest {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("how much money do you need to retire?");
double v = in.nextDouble();
System.out.println("how much money will you contribute every year?");
double v1 = in.nextDouble();
System.out.println("interest rate in %:");
double v2 = in.nextDouble();
double balance=0;
int years=0;
while (balance<v){
balance+=v1;
double interest= balance*(v2/100);
balance+=interest;
System.out.println(balance);
years++;
}
System.out.println("you can retire in"+years+" years.");
}
}
在這個例子中,我們的循環是一個計數器,在循環體中更新目前累積的數量,直到條件為false為止。
while (balance<v){
balance+=v1;
double interest= balance*(v2/100);
balance+=interest;
System.out.println(balance);
years++;
}
while循環語句首先檢測循環條件。是以,循環體中的代碼有可能不被執行。如果希望循環體至少執行一次,那麼,應該将檢測條件放到最後。使用do while循環。
2. do while循環
文法格式為:
do statement while (condition)
這種循環先執行語句(通常是一個語句塊),再檢測循環條件;然後重複語句,依次類推。例如:
do {
balance+=v1;
double interest= balance*(v2/100);
balance+=interest;
System.out.println(balance);
years++;
}
while (balance < v);
3. for 循環
for循環是支援疊代的一種通用結構,利用每次疊代之後更新的計數器或類似的變量來控制疊代次數。
下面的程式将0~9輸出到螢幕上:
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
for循環的第一部分通常用于對計數器進行初始化;第二部分給出新一輪循環執行前要檢測的循環條件;第三部分訓示如何更新計數器。我們需要知道的是Java允許在for循環的各個部分放置任何表達式,但有一條不成文的規則:for語句的3個部分應該對同一個變量進行初始化、檢測和更新。
我們要注意的是,在循環中檢測兩個浮點數是否相等需要格外小心。如下面的for循環
for (double x = 0; x !=10 ; x+=0.1) {
System.out.println(x);
}
永遠不會結束。由于舍入的誤差,最終可能得不到精确值。例如,在上面的循環中,因為0.1無法精确用二進制表示,是以x将從9.99999999998跳到10.0999999998.
我們在for語句的第一部分中聲明了一個變量之後,這個變量的作用域就為for循環的這個循環體。
特别需要指出的是,如果在for語句内部定義一個變量,這個變量就不能在循環體之外使用。是以,如果希望在for循環體之外使用循環計數器的最終值,就要確定這個變量在for循環外聲明。
int x;
for (x = 0; x !=10 ; x+=0.1) {
System.out.println(x);
}
另一方面,我們可以在各自獨立的不同for循環中定義同名的變量。即,不同的for循環計數器的命名可以相同。
除此之外,for循環語句隻不過是while循環的一種簡化形式。
我們以下面的程式作為應用for循環的一個例子。
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("how many number do you need to draw?");
int i = in.nextInt();
System.out.println("what is the highest number you can draw?");
int i1 = in.nextInt();
int c=1;
for (int j = 1; j <= i; j++) {
c=c*(i1-j+1)/j;
System.out.println("your odds are 1 in "+c+" . good luck!");
}
}
這個程式是用來計算抽獎機率。
在Java中有一種功能很強的循環結構,可以用來依次處理數組中的每一個元素而不必為指定下标值而分心。這種增強的for循環的語句格式為:
for(vatiable :collection)statement
定義一個變量用于暫存集合中的每一個元素,并執行相應的語句。
例如:
for(int element:a)
sout(element);
列印數組a中的每一個元素,一個元素占一行。當然,傳統的for循環也可以實作。但是,for each循環語句顯得更加簡潔、不易出錯。
4. 中斷控制流程
break分為兩種,一種帶标簽,一種不帶标簽。
我們首先來看一下不帶标簽的break語句。與用于退出的switch語句的break語句一樣,它也可以用于退出循環語句。例如:
while (years<=100){
balance+=payment;
double interest=balance*interestRate/100;
balance+=interest;
if(balance>=goal){
break;
}
years++;
}
在循環開始時,如果years>100,或者在循環體中balance>=goal,則退出循環語句。
下面,我們來看一下帶标簽的break語句,用于跳出多重嵌套的循環語句。這裡用個示例說明了break的工作狀态。需要注意的是,标簽必須放在希望跳出的最外層循環之前,并且必須跟緊一個冒号。
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n;
read_data:
while (...){
...
for(...){
System.out.println("enter a number >=0:");
n = in.nextInt();
if(n>0){
break read_data;
....
}
}
}
}
如果輸入有誤,通過執行帶标簽的break跳轉到帶标簽的語句塊末尾。對于任何使用break語句 代碼都需要檢測循環是否正常結束,還是由break跳出。
事實上,可以将标簽應用到任何語句中,甚至可以應用于if語句或者塊語句中,如下所示:
label:{
...
if(condition)
break label;
...
}
另外,需要注意的是,隻能跳出語句塊,不能跳入語句塊。
除break語句之外,還有一個continue語句。與break語句一樣,它将中斷正常的控制流程。continue語句将控制轉移到最内層循環的首部。例如:
Scanner in = new Scanner(System.in);
while (sum<goal) {
System.out.println("enter a number: ");
int i = in.nextInt();
if (i < 0) {
continue;
}
sum+=n;
}
如果n<0,則continue語句越過了目前循環體的剩餘部分,立即跳到循環首部。
如果将continue用于for循環,就可以跳到for循環的“更新”部分。
還有一種帶标簽的continue語句,将跳到與标簽比對的循環首部。這裡,不做示範。