Java基礎:第二章、流程控制
第二章、Java流程控制
1、使用者互動Scanner物件
-
之前我們學的基本語法中我們並沒有實現程式與人的互動,但是Java給我們提供了這樣一個工具類,我們可以獲取使用者的輸入。java.util.Scanner是Java5的新特性,我們可以通過Scanner類來獲取使用者的輸入
-
基本語法
Scanner s = new Scanner(System.in);
-
通過Scanner類的next()與nextLine()方法獲取輸入的字元,在讀取前我們一般需要使用hasNext()與hasNextLine()判斷是否還有輸入的資料
next與nextLine的區別
-
next():
- 1、一定要讀取到有效字元後才可以結束輸入
- 2、對輸入有效字元之前遇到的空白,next()方法會自動將其去掉
- 3、只有輸入有效字元後才將其後面輸入的空白作為分隔符或者結束符
- 4、next()不能得到帶有空格的字串
package whysff.com.cnblogs.scanner; import java.util.Scanner; /** * 掃描器01 * * @author xLiu * @version 1.0 * @create 2020.07.23 下午 3:58 */ public class Demo01 { public static void main(String[] args){ //建立一個掃描器,用於接收鍵盤資料 Scanner scanner = new Scanner(System.in); System.out.println("使用next方法接收"); //判斷使用者有沒有輸入字串 if(scanner.hasNext()){ //使用next方法接收 String str = scanner.next();//程式會等待使用者輸入 System.out.println("輸入的內容為:" + str); } //凡是屬於IO流的類使用完畢,及時關閉,否則會佔用記憶體資源 scanner.close(); } }
-
nextLine():
- 1、以Enter為結束符,也就是說nextLine()方法返回的是輸入回車之前的所有字元
- 2、可以獲得空白
package whysff.com.cnblogs.scanner; import java.util.Scanner; /** * nextLine * * @author xLiu * @version 1.0 * @create 2020.07.23 下午 4:07 */ public class Demo02 { public static void main(String[] args){ //新建一個掃描器,用來接收建安輸入 Scanner scanner = new Scanner(System.in); System.out.println("=====測試使用nextLine方法接收====="); if(scanner.hasNextLine()){ //使用nextLine方法接收 String str = scanner.nextLine(); System.out.println("輸入的內容為:" + str); } scanner.close(); } }
Scanner進階:使用這個類對一串陣列求和、求平均值
package whysff.com.cnblogs.scanner;
import java.util.Scanner;
/**
* 小案例:求和求平均值
*
* @author xLiu
* @version 1.0
* @create 2020.07.23 下午 5:02
*/
public class Demo05 {
public static void main(String[] args){
// 輸入多個數字,並求和、平均數,每輸入一個數字用回車確認,通過輸入非數字來結束輸入並輸出最後結果
// 先建立一個掃描器,接收鍵盤輸入
Scanner scanner = new Scanner(System.in);
// 視窗提示請連續的輸入幾個數字,每個數字使用回車確認
System.out.println("=====求和、求平均值=====");
System.out.println("請連續的輸入幾個數字,並使用回車確認:");
// 定義和
double sum = 0.0;
// 定義輸入數字的個數
int m = 0;
// while迴圈
while(scanner.hasNextDouble()){
//接收鍵盤的輸入
double x = scanner.nextDouble();
//個數+1
m = m + 1;
//求和
sum = sum + x;
//輸出第幾個數,目前的和是多少
System.out.println("接收到的第" + m + "個數是" + x + ",目前的sum是:" + sum);
}
//輸出結果
System.out.println("一共接收到" + m + "個數字");
System.out.println("這些數字的和為:" + sum);
System.out.println("這些數字的平均值為:" + sum/m);
//關閉掃描器
scanner.close();
}
}
2、順序結構
-
JAVA的基本結構就是順序結構,除非特別指明,否則就按照順序一句一句執行
-
順序結構是最簡單的演算法結構
-
語句與語句之間,框與框之間都是按從上到下的順序進行的,它是由若干個依次執行的處理步驟組成的,它是任何一個演算法都離不開的一種基本演算法結構
3、選擇結構
if單選擇結構
-
很多時候需要去判斷一個東西是否可行,然後我們才去執行,這樣一個過程用if語句表示
-
語法
if(布林表示式){ //如果布林表示式為true將執行的語句 }
package whysff.com.cnblogs.struct; import java.util.Scanner; /** * if單選擇 * * @author xLiu * @version 1.0 * @create 2020.07.23 下午 10:21 */ public class IfDemo01 { public static void main(String[] args){ Scanner scanner = new Scanner(System.in); System.out.println("請輸入內容:"); String s = scanner.nextLine(); // equals:判斷字串是否相等 if(s.equals("Hello")){ System.out.println(s); } System.out.println("End"); scanner.close(); } }
if雙選擇結構
-
現在有一個需求,公司要收購一個軟體,成功了就給人支付100W,失敗了就自己找人開發。這樣的需求用一個if就搞不定了,我們需要有兩個判斷,需要一個雙選擇結構,所以就有了if-else結構
-
語法:
if(布林表示式){ //如果布林表示式的值為true執行的語句 }else{ //如果布林表示式的值為false執行的語句 }
package whysff.com.cnblogs.struct; import java.util.Scanner; /** * if雙選擇 * * @author xLiu * @version 1.0 * @create 2020.07.23 下午 10:31 */ public class IfDemo02 { public static void main(String[] args){ Scanner scanner = new Scanner(System.in); System.out.println("請輸入你選擇的方式:0=收購,1=開發"); String i = scanner.nextLine(); if(i == "0"){ System.out.println("我們選擇收購公司!"); }else{ System.out.println("我們選擇自主研發!"); } scanner.close(); } }
if多選擇結構
-
現實情況中,還可能存在ABCD多級判斷,比如成績的優良中差,所以我們也要引入一種多選擇機構處理這類問題
-
語法:
if(布林表示式1){ //如果布林表示式1的值為true執行的語句 }else if(布林表示式2){ //如果布林表示式2的值為true執行的語句 }else if(布林表示式3){ //如果布林表示式3的值為true執行的語句 }else{ //如果以上布林表示式的值都不為true執行的語句 }
package whysff.com.cnblogs.struct; import java.util.Scanner; /** * if多級判斷 * * @author xLiu * @version 1.0 * @create 2020.07.23 下午 11:39 */ public class IfDemo03 { public static void main(String[] args){ Scanner scanner = new Scanner(System.in); System.out.println("請輸入你的成績(0-100):"); double score = scanner.nextDouble(); /* if 語句中至多隻有一個else語句,else 語句在所有的 else if 語句之後 if 語句可以有若干個 else if 語句,它必須在 else 語句前 一旦其中一個 else if 語句檢測為true ,其他的 else if 語句 else 都會跳過 */ if(score >= 0 && score <= 100){ if(score >= 90 && score <= 100){ System.out.println("你的成績" + score + "是優秀!"); }else if(score >= 70 && score < 90){ System.out.println("你的成績" + score + "是良好!"); }else if(score >= 60 && score < 70){ System.out.println("你的成績" + score + "是中等!"); }else{ System.out.println("你的成績" + score + "是差!"); } }else{ System.out.println("你的輸入不合法,請重新輸入"); } scanner.close(); } }
switch多選擇結構
-
多選擇機構還有一個實現方法就是switch case語句。
-
switch case 語句判斷一個變數與一些列值中某個值是否相等,每個值稱為一個分支。
-
switch語句中的變數型別可以是:
- byte、short、int、char
- 從Java SE 7 開始,switch支援字串String了
- 同時case標籤必須為字串常量或者字面量
-
語法:
switch(expression){ case value : //語句 break; case value : //語句 break; //中間可以有任意數量的case語句 default : //語句 }
檢視class檔案!!!
眾所周知,java程式是需要編譯器編譯為class檔案,然後虛擬機器執行class檔案。有編譯那麼也一定有反編譯。一個合格的程式設計師一定要有看原始碼的思想,為什麼JDK7前Switch不支援string型別,但是JDK7就支援了嗎?這不奇怪嗎?它是如何實現的?再結合前面提到的,字元的本質其實還是數字能不能有點思路?我們帶著這樣一個疑惑去嘗試開啟class檔案看一看。
但是class直接通過記事本開啟是一堆亂碼,這裡我就藉助IDEA進行反編譯:
開啟Project Structure——>開啟專案的輸出目錄——>找到某個檔案的class檔案——>在Project選中某個java檔案——>Show in Explorer——>將class檔案拖動至對應的java檔案所在位置。
重新整理一下IDEA中的專案,就會發現多出來一個.class檔案,這就是反編譯之後的檔案。
4、迴圈結構
while迴圈
-
while是最基本的迴圈,它的機構是:
while(布林表示式){ // 迴圈內容 }
-
只要布林表示式為true,迴圈就會一直執行下去
-
大多數情況是會讓迴圈停止,所以我們需要一個讓表示式失效的方式來結束迴圈
-
少部分情況需要迴圈一直執行,比如伺服器的請求響應監聽等
-
迴圈條件一直為true就會造成無線迴圈【死迴圈】,這點要避免
package whysff.com.cnblogs.struct; /** * 求和1-100 * * @author xLiu * @version 1.0 * @create 2020.07.24 下午 3:42 */ public class WhileDemo03 { public static void main(String[] args){ // 數學王子高斯在九歲的時候解答的問題 // 定義一個和 int sum = 0; //記錄迴圈的次數 int m = 1; //迴圈條件是 while(m <=100 ){ sum = sum + m; m++; } System.out.println("從1加到100的結果為:" + sum); } }
do...while迴圈
-
對於while語句而言,如果不滿足條件,則不能進入迴圈。但現實中也有這樣一種情況:即使不滿足情況也需要執行一次。
-
do...while迴圈和while迴圈相似,不同的是,do...while迴圈至少會執行一次
do{ //code }while(布林表示式);
-
While和do-While的區別:
- while先判斷後執行;do-while先執行後判斷
- while至少執行0次;do-while至少執行1次
package whysff.com.cnblogs.struct; /** * @author xLiu * @version 1.0 * @create 2020.07.24 下午 3:58 */ public class DoWhileDemo02 { public static void main(String[] args){ int a = 0; while(a<0){ System.out.println(a); } System.out.println("====================="); do{ System.out.println(a); }while(a<0); } }
for迴圈(重點!!!)
-
雖然所有迴圈結構都可以用while或者do-while表示,但Java提供了另一種語句——for迴圈,使迴圈結構變的更加簡單
-
for迴圈語句是支援迭代的一種通用結構,是最有效、最靈活的迴圈結構
-
for迴圈執行的次數是在執行前就確定的。語法格式如下:
for(初始化; 布林表示式; 更新){ //code }
package whysff.com.cnblogs.struct.for_demo; /** * @author xLiu * @version 1.0 * @create 2020.07.24 下午 5:12 */ public class Demo01 { public static void main(String[] args){ int a = 1;// 初始化條件 while(a <= 100){// 條件判斷 System.out.println(a);// 迴圈體 a += 2;//迭代 // a = a + 2; } System.out.println("While迴圈結束!"); // 初始化 條件判斷 迭代 for(int i=1; i<=100; i++){ System.out.println(i); } System.out.println("For迴圈結束"); /* 關於for迴圈的注意點! 最先執行初始化步驟,可以宣告一種型別,但可初始化一個或多個迴圈控制變數,也可以是空語句 然後,判斷布林表示式的值:如果為true,迴圈體被執行,如果為false,迴圈終止,開始執行迴圈體後面的語句 執行一次迴圈後,更新迴圈控制變數(迭代) 再次檢測布林表示式。迴圈執行上述過程 */ for( ; ; ){ break; } } }
-
練習1:計算0到100之間的奇數和偶數的和
package whysff.com.cnblogs.struct.for_demo; /** * 練習1:計算0到100之間的奇數和偶數的和 * * @author xLiu * @version 1.0 * @create 2020.07.24 下午 5:24 */ public class Demo02 { public static void main(String[] args){ int oddsum = 0; int evensum = 0; for(int i = 0; i <= 100 ; i++){ if(i %2 == 0){ evensum += i; }else{ oddsum += i; } } System.out.println("奇數的和為:" + oddsum); System.out.println("偶數的和為:" + evensum); } }
-
練習2:用while或for迴圈輸出1-1000之間能被5整除的數,並且每行輸出3個
package whysff.com.cnblogs.struct.for_demo; /** * 練習2:用while或for迴圈輸出1-1000之間能被5整除的數,並且每行輸出3個 * * @author xLiu * @version 1.0 * @create 2020.07.24 下午 5:33 */ public class Demo03 { public static void main(String[] args){ for(int i = 1; i <= 1000 ; i++){ // 能被5整除就輸出且不換行 if(i %5 == 0){ System.out.print(i + "\t"); } // 一旦能被55整除就輸出換行 if(i %(5*5) ==0){ System.out.println(); } } } }
-
練習3:列印九九乘法表
package whysff.com.cnblogs.struct.for_demo; /** * 練習3:列印九九乘法表 * * @author xLiu * @version 1.0 * @create 2020.07.24 下午 10:41 */ public class Demo04 { public static void main(String[] args){ /* 先列印第一列 再把固定的1用一個迴圈封裝起來 去掉重複出現的項 調整格式 */ for(int i = 1; i <= 9 ; i++){ for(int j = 1; j <= i ; j++){ System.out.print(j + "*" + i + "=" + j*i + "\t" ); } System.out.println(); } } }
增強for迴圈
-
這裡對這部分內容進行初步的瞭解,之後陣列重點學習
-
JDK5引入了一種主要用於陣列或集合的增強型for迴圈
-
語法格式如下:
for(宣告語句 : 表示式) { //code }
-
宣告語句:宣告新的區域性變數,該變數的型別必須和陣列元素的型別匹配。其作用域限定在迴圈語句塊,其值與此時陣列元素的值相等
-
表示式:表示式是要訪問的陣列名,或者是返回值為陣列的方法
package whysff.com.cnblogs.struct.for_demo; /** * 增強for * * @author xLiu * @version 1.0 * @create 2020.07.24 下午 11:18 */ public class Demo05 { public static void main(String[] args){ // 定義一個數組 int[] numbers = {10,20,30,40,50}; // 普通for遍歷陣列 for(int i = 0; i <5 ; i++){ System.out.println(numbers[i]); } System.out.println("==================="); // 使用增強for遍歷陣列 for(int x : numbers){ System.out.println(x); } } }
5、break & continue
-
break在任何迴圈語句的主體部分,均可用break控制迴圈的流程。作用是強行退出迴圈,不執行迴圈中剩餘的語句(break也在Switch語句中使用)
package whysff.com.cnblogs.struct.breakandcontinue; import com.sun.org.apache.bcel.internal.generic.IfInstruction; /** * @author xLiu * @version 1.0 * @create 2020.07.24 下午 11:36 */ public class BreakDemo { public static void main(String[] args){ int i = 0; while(i < 100){ i++; System.out.println(i); if(i == 30){ break; } } System.out.println("已經出來迴圈體啦"); } }
-
continue語句用在迴圈體重,用於終止某次迴圈過程,作用是跳過迴圈體中剩餘語句,接著進行下一次是否執行迴圈的判斷!
package whysff.com.cnblogs.struct.breakandcontinue; /** * @author xLiu * @version 1.0 * @create 2020.07.24 下午 11:40 */ public class ContinueDemo { public static void main(String[] args){ int i = 0; while(i<100){ i++; if(i%10==0){ System.out.println(); continue; } System.out.print(i+"\t"); } /* 總結: break直接跳出迴圈(辭職) continue是僅跳過當前的單次迴圈,進入下一迴圈過程(請假) */ } }
-
關於goto關鍵字
- goto關鍵字很早就在程式設計語言中出現,儘管goto仍是Java的一個保留字,但從未正式使用;Java沒有goto。然而在break和continue這兩個關鍵字的身上,我們仍能看出goto的影子——帶標籤的break和continue
- “標籤”是指後面跟一個冒號的識別符號,例如:label:
- 對Java來說唯一用到標籤的地方是在迴圈語句之前。理由是:我們希望在其中巢狀另一個迴圈,由於break和continue關鍵字通常只中斷當前迴圈,但若和標籤一起使用,它就會中斷到存在標籤的地方
6、練習
package whysff.com.cnblogs.struct;
/**
* 列印三角形
*
* @author xLiu
* @version 1.0
* @create 2020.07.25 上午 12:02
*/
public class Test01 {
public static void main(String[] args){
// 列印三角形,10行
for(int i = 1; i <= 10; i++){
// 列印空格,位於三角形的左上方區域
for(int j = 10; j >=i ; j--){
System.out.print(" ");
}
// 列印三角形的左半部
for(int j = 1; j <= i ; j++){
System.out.print("*");
}
// 列印三角形的右半部
for(int j = 1; j < i ; j++){
System.out.print("*");
}
// 每列印完一行就換行
System.out.println();
}
}
}