文章目錄
- Day 3
- 程式的執行流程
- Scanner
- if(選擇結構)
- switch case(選擇結構)
- for(循環結構)
- for循環的經典算法(水仙花數,星星三角形,九九乘法表)
- while(循環結構)
- do while(循環結構)
- 三種循環結構的差別
- break
- continue
Day 3
2019年3月30日。
這是我學習Java的第三天。
這一天,我學到了以下的知識。
程式的執行流程
在一個程式執行的過程中,各條語句的執行順序對程式的結果是有直接影響的。
也就是說程式的流程對運作結果有直接的影響。是以,我們必須清楚每條語句的執行流程。
而且,很多時候我們要通過控制語句的執行順序來實作我們要完成的功能。
程式的執行流程分為三類:
- 順序結構:代碼從上往下一行一行去執行。
-
選擇結構:也被稱為分支結構。
選擇結構有特定的文法規則,代碼要執行具體的邏輯運算進行判斷,邏輯運算的結果有兩個,是以産生選擇,按照不同的選擇執行不同的代碼。
- 循環結構:循環語句可以在滿足循環條件的情況下,反複執行某一段代碼,這段被重複執行的代碼被稱為循環體語句,當反複執行這個循環體時,需要在合适的時候把循環判斷條件修改為false,進而結束循環,否則循環将一直執行下去,形成死循環。
Scanner
Java提供的類,可以同來擷取從鍵盤中輸入的資料。
使用步驟分為以下三步:
- 導入程式包:
import java.util.Scanner;
- 建立鍵盤錄入對象:
Scanner a = new Scanner(System.in);
- 錄入輸入的資料:
int b = a.nextInt();
if(選擇結構)
if語句是條件選擇語句,具有以下三種格式。
格式一:if
if(比較表達式或者是boolean類型的值) {
語句體;
}
/*執行流程
先計算比較表達式的值,看其傳回值是true還是false。
如果是true,就執行語句體;
如果是false,就不執行語句體;*/
格式二:if-else
if(比較表達式) {
語句體1;
}else {
語句體2;
}
//注意事項:else後面是沒有比較表達式的,隻有if後面有。
/*執行流程
首先計算比較表達式的值,看其傳回值是true還是false。
如果是true,就執行語句體1;
如果是false,就執行語句體2;*/
格式三:if-else if-else
if(比較表達式1) {
語句體1;
}else if(比較表達式2) {
語句體2;
}else if(比較表達式3) {
語句體3;
}
...
else {
語句體n+1;
}
//注意事項: 當隻要有一個條件滿足時,if語句結束。else是可以省略,但是不建議省略。
/*執行流程
首先計算比較表達式1看其傳回值是true還是false,
如果是true,就執行語句體1,if語句結束。
如果是false,接着計算比較表達式2看其傳回值是true還是false,
如果是true,就執行語句體2,if語句結束。
如果是false,接着計算比較表達式3看其傳回值是true還是false,
...
如果都是false,就執行語句體n+1。*/
if和三元表達式的差別:
- 三元表達式寫出來的,if-else一定寫的出來。
- if-else寫出來的,三元表達式不一定寫出來。
switch case(選擇結構)
switch case 語句判斷一個變量與一系列值中某個值是否相等,每個值稱為一個分支。
格式如下:
switch語句的格式
switch(表達式){
case 值1:
語句體1;
break;
case 值2:
語句體2;
break;
case 值3:
語句體3;
break;
....
default:
語句體n+1;
break;
}
/* switch語句的格式解釋
(1):switch表示這是switch語句
表達式的取值:byte,short,int,char
JDK5以後可以是枚舉(什麼是枚舉,以後再講)
JDK7以後可以是String
(2):case後面跟的是要和表達式進行比較的值
(3):語句體部分可以是一條或多條語句
(4):break表示中斷,結束的意思,可以結束switch語句
(5):default語句表示所有情況都不比對的時候,就執行該處的内容,和if語句的else相似*/
/*執行流程
先計算表達式的值
然後和case後面的比對,如果比對成功就執行對應的語句,遇到break就會結束,否則執行default控制的語句*/
面試題:byte可以作為switch的表達式嗎?
long可以作為switch的表達式嗎?
String可以作為switch的表達式嗎?
switch 語句中的變量類型可以是: byte、short、int 或者 char。從 Java SE 7 開始,switch 支援字元串 String 類型了,同時 case 标簽必須為字元串常量或字面量。
是以,byte、String均可以作為switch的表達式,而long不可以作為switch的表達式。
for(循環結構)
for循環執行的次數是在執行前就确定的。
格式如下:
for(初始化表達式語句;判斷條件語句;控制條件語句) {
循環體語句;
}
//注意事項:初始化表達式語句隻執行一次
/*執行流程:
a:執行初始化表達式語句
b:執行判斷條件語句,看其傳回值是true還是false
如果是true,就繼續執行
如果是false,就結束循環
c:執行循環體語句;
d:執行控制條件語句
e:回到B繼續。*/
//循環嵌套之後,外層循環控制行數,裡層循環控制列數
for循環的經典算法(水仙花數,星星三角形,九九乘法表)
-
水仙花數
所謂的水仙花數是指一個三位數,其各位數字的立方和等于該數本身。
舉例:153就是一個水仙花數。
153 = 111 + 555 + 333 = 1 + 125 + 27 = 153
代碼如下:
public class FlowerNumber {
public static void main(String args[]){
int a;
int b;
int c;
for (int i = 100 ; i <= 999 ; i++){
/*for (a = 1 ; a <= 9 ; a ++){
for (b = 0 ; b <= 9 ; b++){
for (c = 0 ; c <= 9 ; c++){
if ((a * a * a) + (b * b * b) + (c * c * c) == a * 100 + b * 10 + c && i == a * 100 + b * 10 + c){
System.out.println(a * 100 + b * 10 + c);
}
}
}
}*//* 方法一 循環嵌套法*/
/*a = (i / 100);
b = (i % 100) / 10;
c = (i % 10);
if ((a * a * a) + (b * b * b) + (c * c * c) == a * 100 + b * 10 + c){
System.out.println(i);
}*//*方法二 取位數法*/
}
}
}
運作效果:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yN5UjN2kTMlRzY0gjNhZTMzYzX0QjN0kDM2AzLclDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
-
星星三角形
用*繪制一個直角三角形(5x5)。
代碼如下:
public class PaintStar {
public static void main(String args[]){
for (int i = 0 ; i < 5 ; i++){
for (int j = 0 ; j <= i ; j++){
System.out.print("*");
}
System.out.println();
}
} }
運作效果:
-
九九乘法表
繪制一個九九乘法表。
代碼如下:
public class chengfabiao {
public static void main(String args[]){
for (int i = 1 ; i < 10 ; i++){
for (int j = 1 ; j <= i ; j++){
System.out.print(j + "*" + i + "=" + (j * i) + "\t");
}
System.out.println();
}
}
}
運作效果:
while(循環結構)
while是最基本的循環。
格式為:
;
while(判斷條件語句) {
循環體語句;
控制條件語句;
}
/*執行流程:
a:執行初始化條件語句;
b:執行判斷條件語句,看其傳回值是true還是false
如果是true,就繼續執行
如果是false,就結束循環
c:執行循環體語句;
d:執行控制條件語句
e:回到b繼續。*/
do while(循環結構)
對于 while 語句而言,如果不滿足條件,則不能進入循環。但有時候我們需要即使不滿足條件,也至少執行一次。
do…while 循環和 while 循環相似,不同的是,do…while 循環至少會執行一次。
;
do {
循環體語句;
控制條件語句;
}while(判斷條件語句);
/*執行流程:
a:執行初始化條件語句;
b:執行循環體語句;
c:執行控制條件語句;
d:執行判斷條件語句,看其傳回值是true還是false
如果是true,就繼續執行
如果是false,就結束循環
e:回到b繼續。*/
三種循環結構的差別
-
do…while循環至少執行一次循環體。
而for,while循環必須先判斷條件是否成立,然後決定是否執行循環體語句。
-
A: 如果你想在循環結束後,繼續使用控制條件的那個變量,用while循環,否則用for循環。不知道用for循環。
因為變量及早的從記憶體中消失,可以提高記憶體的使用效率。
B:建議優先考慮for循環,然後是while循環 ,最後是do…while循環。
break
中斷循環。可以用在Switch語句,也可以用在for,while循環中,用來結束循環。若離開了使用場景(switch,for,while)則沒有意義。如果有循環嵌套,break影響的是最近的循環。
例題:試判斷輸出結果
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++) {
if (i == j) {
break;
}
System.out.println("i=" + i + ", j=" + j);
}
}
解:①結果:i=1, j=0
i=2, j=0
i=2, j=1
②(1)第一次外層for循環:i=0,因為0<3,是以執行内層的for循環。
第一次内層for循環:i=0,j=0,因為0 == 0,是以結束循環。
(2)第二次外層for循環:i=1,因為1<3,是以執行内層的for循環。
第一次内層for循環:i=1,j=0,因為1!=0,是以輸出i=1,j=0。
第二次内層for循環:i=1,j=1,因為1 == 0,是以結束循環。
(3)第三次外層for循環:i=2,因為2<3,是以執行内層的for循環。
第一次内層for循環:i=2,j=0,因為2!=0,是以輸出i=2,j=0。
第二次内層for循環:i=2,j=1,因為2!=1,是以輸出i=2,j=1。
第三次内層for循環:i=2,j=2,因為2==2,是以結束循環。
(4)第四次外層for循環:i=3,因為3=3,是以結束循環。
continue
用在循環場景當中,可以跳過部分循環而不終端,離開循環場景後無意義。
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++) {
if (i == j) {
continue;
}
System.out.println("i=" + i + ", j=" + j);
}
}