Java流程控制
用戶交互 Scanner
Scanner對象
之前我們學(xué)的基本語法中我們并沒有實現(xiàn)程序和人的交互 但是Java給我們提供了這一樣一個工具類 我們可以獲取用戶的輸入 java.util.Scanner 是Java5的新特性 我們可以通過Scanner 類來獲取用戶的輸入
-
基本語法:
Scanner s = new Scanner(system.in);
通過Scanner 類的 next() 與 nextLine() 方法獲取輸入的字符串 在讀取前我們一般需要 使用hasNext() 與 hasNextLine() 判斷是否還有輸入的數(shù)據(jù)
-
next():
- 一定要讀取到有效字符后才可以結(jié)束輸入
- 對輸入有效字符之前遇到的空白,next()方法會自動將其去掉
- 只有輸入有效字符后才將其后面輸入的空白作為分隔符或者結(jié)束符
- next()不能得到帶有空格的字符串
package com.cheer.scanner; import java.util.Scanner; public class Demo01 { public static void main(String[] args) { //創(chuàng)建一個掃描器對象 用于接收鍵盤數(shù)據(jù) Scanner scanner = new Scanner(System.in); System.out.println("使用next方式接收:"); //判斷用戶有沒有輸入字符串 if (scanner.hasNext()){ //使用next方式接收 String str = scanner.next(); System.out.println("輸入的內(nèi)容為:"+str); } //凡是屬于IO流的類如果不關(guān)閉會一直占用資源 要養(yǎng)成好習(xí)慣用完就關(guān)掉 scanner.close(); } }
-
nextLine():
- 以Enter為結(jié)束符 也就是說 nextLine()方法返回的是輸入回車之前的所有字符
- 可以獲得空白
package com.cheer.scanner; import java.util.Scanner; public class Demo02 { public static void main(String[] args) { //從鍵盤接收數(shù)據(jù) Scanner scanner = new Scanner(System.in); System.out.println("使用next方式接收:"); //判斷是否還有輸入 if (scanner.hasNextLine()){ String str = scanner.nextLine(); System.out.println("輸入的內(nèi)容為:"+str); } scanner.close(); } }
package com.cheer.scanner; import java.util.Scanner; public class Demo03 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("請輸入:"); String str = scanner.nextLine(); System.out.println("輸入的內(nèi)容為:"+str); } }
package com.cheer.scanner; import java.util.Scanner; public class Demo04 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); //從鍵盤接收數(shù)據(jù) int i = 0; float f = 0.0f; System.out.println("請輸入整數(shù):"); //如果梢灭。夷家。。那么 if (scanner.hasNextInt()){ i = scanner.nextInt(); System.out.println("整數(shù)數(shù)據(jù):" + i); }else { System.out.println("輸入的不是整數(shù)數(shù)據(jù)敏释!"); }
package com.cheer.scanner; import java.util.Scanner; public class Demo05 { public static void main(String[] args) { //輸入多個數(shù)字 并求其總和跟平均值 每輸入一個數(shù)字用回車確認(rèn) 通過輸入非數(shù)字來結(jié)束輸入并輸出執(zhí)行結(jié)果 Scanner scanner = new Scanner(System.in); //和 double sum = 0; //計算輸入了多少個數(shù)字 int m = 0; //通過循環(huán)判斷是否還有輸入 并在里面對每一次進(jìn)行求和跟統(tǒng)計 while (scanner.hasNextDouble()){ double x =scanner.nextDouble(); m = m + 1; //也可寫成m++ sum = sum + x; System.out.println("你輸入了第"+m+"個數(shù)據(jù) 當(dāng)前結(jié)果總和為"+sum); } System.out.println(m + "個數(shù)的和為" + sum); System.out.println(m + "個數(shù)的平均值為" +(sum/m)); scanner.close(); } }
順序結(jié)構(gòu)
Java的基本結(jié)構(gòu)就是順序結(jié)構(gòu) 除非特別指明 否則就按照順序一句一句執(zhí)行
-
順序機構(gòu)是最簡單的算法結(jié)構(gòu)
graph TD A(A) -->B(B) B --> C(C)
語句與語句之間 框與框之間是按從上到下的順序進(jìn)行的 它是由若干個依次執(zhí)行的處理步驟組成的 它是任何一個算法都離不開的一種基本算法結(jié)構(gòu)
選擇結(jié)構(gòu)
- if單選擇結(jié)構(gòu)
- if雙選擇結(jié)構(gòu)
- if多選擇結(jié)構(gòu)
- 嵌套的if結(jié)構(gòu)
- switch多選擇結(jié)構(gòu)
if單選擇結(jié)構(gòu)
我們很多時候需要去判斷一個東西是否可行 然后我們才去執(zhí)行 這樣一個過程在程序中用if語句來表示
-
語法:
if(布爾表達(dá)式){ //如果布爾表達(dá)式為true將執(zhí)行的語句 }
if雙選擇結(jié)構(gòu)
-
那現(xiàn)在有個需求 公司要收購一個軟件 成功了 給人支付100萬元 失敗了 自己找人開發(fā)
這樣的需求用一個if就搞不定了 我們需要有兩個判斷 需要一個雙結(jié)構(gòu)選擇 所以就有了if-else結(jié)構(gòu)
-
語法“
if(布爾表達(dá)式){ //如果布爾表達(dá)式的值為true }else{ //如果布爾表達(dá)式的值為false }
if多選擇結(jié)構(gòu)
-
我們發(fā)現(xiàn)剛才的代碼不符合實際情況 真實的情況還可能存在ABCD 存在區(qū)間多級判斷
比如90-100是A 80-89是B... 在生活中我們很多時候的選擇也不僅僅只有兩個 所以我們需要一個多選擇結(jié)構(gòu)來處理這類問題
-
語法:
if(布爾表達(dá)式1){ //如果布爾表達(dá)式1的值為true執(zhí)行代碼 }else if(布爾表達(dá)式2) //如果布爾表達(dá)式2的值為true執(zhí)行代碼 }else if(布爾表達(dá)式3) //如果布爾表達(dá)式3的值為true執(zhí)行代碼 }else{ //如果以上布爾表達(dá)式的值都不為true執(zhí)行代碼 }
嵌套的if結(jié)構(gòu)
使用嵌套的if...else語句是合法的 也就是說你可以在另一個if或者else if語句中使用if或者else if語句 你可以像if語句一樣嵌套else if...else
-
語法:
if(布爾表達(dá)式1){ //如果布爾表達(dá)式1的值為true執(zhí)行代碼 if(布爾表達(dá)式2){ //如果布爾表達(dá)式2的值為true執(zhí)行代碼 } }
switch多選擇結(jié)構(gòu)
- 多選擇結(jié)構(gòu)還有一個實現(xiàn)方式就是 switch case 語句
- switch case 語句判斷一個變量與一個系列值中某個值是否相等 每個值稱為一個分支
- switch 語句中的變量類型可以是:
- byte short int或者 char
- 從Java SE 7 開始 switch 支持字符串 String類型了
- 同時 case 標(biāo)簽必須為字符串常量或者字面量
package com.cheer.struct;
public class SwitchDemo01 {
public static void main(String[] args) {
//case穿透 switch 匹配一個具體的值
char grade = 'B';
switch (grade){
case 'A':
System.out.println("優(yōu)秀");
break;//可選
case 'B':
System.out.println("良好");
break;//可選
case 'C':
System.out.println("及格");
break;//可選
case 'D':
System.out.println("再接再厲");
break;//可選
case 'E':
System.out.println("掛科");
break;//可選
default: //可選
System.out.println("未知等級");
}
}
}
package com.cheer.struct;
public class SwitchDemo02 {
public static void main(String[] args) {
String name = "哈哈哈";
//JDK7的新特性 表達(dá)式結(jié)果可以是字符串
//字符的本質(zhì)還是數(shù)字
//反編譯 java---class (字節(jié)碼文件)--- 反編譯(IDEA)
switch (name){
case "哈哈哈":
System.out.println("嚯嚯嚯");
break;
case "呵呵呵":
System.out.println("嘿嘿嘿");
break;
default:
System.out.println("笑一個");
}
}
}
循環(huán)結(jié)構(gòu)
- while循環(huán)
- do...while循環(huán)
- for循環(huán)
- 在Java5中引入了一種主要用于數(shù)組的增強型for循環(huán)
while循環(huán)
-
while是最基本的循環(huán) 它的結(jié)構(gòu)為:
while(布爾表達(dá)式){ //循環(huán)內(nèi)容 } package com.cheer.struct; public class WhileDemo01 { public static void main(String[] args) { //輸出1-100 int i = 0; while (i<100){ i++; System.out.println(i); } } }
只要布爾表達(dá)式為true 循環(huán)就會一直執(zhí)行下去
我們大多是情況是會讓循環(huán)停止下來的 我們需要一個讓表達(dá)式失效的方式來結(jié)束循環(huán)
少部分情況需要循環(huán)一直執(zhí)行 比如服務(wù)器的請求響應(yīng)監(jiān)聽等
循環(huán)條件一直為true就會造成無限循環(huán)【死循環(huán)】 我們正常的業(yè)務(wù)編程中應(yīng)該避免死循環(huán) 會影響程序性能或者造成程序卡死崩潰
-
思考:1+2+3+...+100=?
package com.cheer.struct; public class WhileDemo02 { public static void main(String[] args) { //1+2+3+...+100=? int i = 0; int sum = 0; while (i<=100){ sum = sum + i; i++; } System.out.println(sum); } }
do...while循環(huán)
對于while語句而言 如果不滿足條件 則不能進(jìn)入循環(huán) 但有時候我們需要即使不滿足條件 也至少執(zhí)行一次
-
do..while循環(huán)和while循環(huán)相似 不同的是 do..while循環(huán)至少會執(zhí)行一次
do{ //代碼語句 }while(布爾表達(dá)式); package com.cheer.struct; public class DoWhileDemo01 { public static void main(String[] args) { int i = 1; do{ System.out.println(i); i++; }while(i<=100); } }
-
while和do..while的區(qū)別:
- while先判斷再執(zhí)行 do..while先執(zhí)行再判斷
- do..while總實保證循環(huán)至少被執(zhí)行一次
for循環(huán)
雖然所有循環(huán)結(jié)構(gòu)都可以喲弄個while或者do..while表示 但Java提供了另一種語句---for循環(huán) 使一些循環(huán)結(jié)構(gòu)變得更加簡單
for循環(huán)語句是支持迭代的一種通用結(jié)構(gòu) 是最有效 最靈活的循環(huán)結(jié)構(gòu)
-
for循環(huán)執(zhí)行的次數(shù)是在執(zhí)行前就確定的 語法格式為:
for(初始化库快;布爾表達(dá)式;更新){ //代碼語句 } package com.cheer.struct; public class ForDemo01 { public static void main(String[] args) { //初始化//條件判斷//迭代 //快捷鍵輸入:100.for for (int i = 0; i < 100; i++) { System.out.println(i); } } }
-
練習(xí)1:計算0到100之間的奇數(shù)和偶數(shù)的和
package com.cheer.struct; public class ForDemo02 { public static void main(String[] args) { int oddSum = 0; int evenSum = 0; for (int i = 0; i < 100; i++) { if(i%2!=0){ oddSum+=i; }else { evenSum+=i; } } System.out.println("奇數(shù)的和"+oddSum); System.out.println("偶數(shù)的和"+evenSum); } }
-
練習(xí)2:用while或for循環(huán)輸出1-1000之間能被5整除的數(shù) 并且每行輸出3個
package com.cheer.struct; public class ForDemo03 { public static void main(String[] args) { for (int i = 1; i <= 1000; i++) { if (i%5==0){ System.out.print(i+"\t"); } if (i%15==0){ System.out.println(); //System.out.print("\n"); } } } }
-
練習(xí)3:打印九九乘法表
package com.cheer.struct; public class ForDemo04 { public static void main(String[] args) { for (int i = 1; i <= 9; i++) { for (int n = 1; n <= i; n++) { System.out.print(n+"*"+i+"="+(i*n) + "\t"); } System.out.println(); } } }
強型for循環(huán)
數(shù)組重點使用
Java5引入了一種主要用于數(shù)組或集合的增強型for循環(huán)
-
Java增強for循環(huán)語法格式為:
for(聲明語句:表達(dá)式) { //代碼句子 } package com.cheer.struct; public class ForDemo05 { public static void main(String[] args) { int[] numbers = {10,20,30,40,50};//定義了一個數(shù)組 for(int i = 0;i < 5;i++){ System.out.println(numbers[i]); //和for對比 } //遍歷數(shù)組的元素 for (int x:numbers){ System.out.println(x); } } }
聲明語句:聲明新的局部變量 該變量的類型必須和數(shù)組元素的類型匹配 其作用域限定在循環(huán)語句塊 其值與此時數(shù)元素的值相等
表達(dá)式:表達(dá)式是要訪問的數(shù)組名 或者是返回值為數(shù)組的方法
break & continue
-
break在任何循環(huán)語句的主體部分 均可用break控制循環(huán)的流程 break用于強行退出循環(huán) 不執(zhí)行循環(huán)中剩余的語句(break語句也可在switch語句中使用)
package com.cheer.struct; public class BreakDemo { public static void main(String[] args) { int i = 0; while(i<100){ i++; System.out.println(i); if(i==30){ break; } } } }
-
continue語句用在循環(huán)語句體中 用于終止某次循環(huán)過程 即跳過循環(huán)體中尚未執(zhí)行的語句 接著進(jìn)行下一次是否執(zhí)行循環(huán)的判定
package com.cheer.struct; 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"); } }
-
關(guān)于goto關(guān)鍵字
- goto關(guān)鍵字很早就在程序設(shè)計語言中出現(xiàn) 盡管goto仍是Java的一個保留字 但并未在語言中得到正式使用 Java沒有g(shù)oto 然而 在break和continue這兩個關(guān)鍵字的身上 我們?nèi)匀豢梢钥闯鲆恍ゞoto的影子---帶標(biāo)簽的break和continue
- 標(biāo)簽 是指后面跟一個冒號的標(biāo)識符 例如: label:
- 對于Java來說唯一用到標(biāo)簽的地方是在循環(huán)語句之前 而在循環(huán)之前設(shè)置標(biāo)簽的唯一理由是:我們希望在其中嵌套另一個循環(huán) 由于break和continue關(guān)鍵字通常只中斷當(dāng)前循環(huán) 但若隨同標(biāo)簽使用 它們就會中斷到存在標(biāo)簽的地方
練習(xí)
package com.cheer.struct;
public class TestDemo01 {
public static void main(String[] args) {
//打印三角形
// *
// ***
// *****
// *******
//*********
for (int i = 1; i <= 5; i++) {
for (int j =5; 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();
}
}
}