Java零基礎入門(三)流程控制

,.┏ (^ω^)=☞@.犭а①+☆ā發表於2020-09-25

流程控制

1. 分支結構

1.1 if-else條件判斷結構

書寫方法:

結構一:
if(條件表示式){
	執行表示式
}
結構二:二選一
if(條件表示式){
	執行表示式1
}else{
	執行表示式2
}
結構三:n選一
if(條件表示式){
	執行表示式1
}else if(條件表示式){
	執行表示式2
}else if(條件表示式){
	執行表示式3
}
...
else{
	執行表示式n
}

說明:

  • else 結構是可選的。
  • 針對於條件表示式:
    • 如果多個條件表示式之間是“互斥”關係(或沒有交集的關係),哪個判斷和執行語句宣告在上面還是下面,無所謂。
    • 如果多個條件表示式之間有交集的關係,需要根據實際情況,考慮清楚應該將哪個結構宣告在上面。
    • 如果多個條件表示式之間有包含的關係,通常情況下,需要將範圍小的宣告在範圍大的上面。否則,範圍小的就沒機會執行了。
  • if-else結構是可以相互巢狀的。
  • 如果if-else結構中的執行語句只有一行時,對應的一對{}可以省略的。但是,不建議省略。

1.2. switch-case選擇結構

書寫方法

switch(表示式){
case 常量1:
	執行語句1;
	//break;
case 常量2:
	執行語句2;
	//break;
...
default:
	執行語句n;
	//break;
}

說明:

  1. 根據switch表示式中的值,依次匹配各個case中的常量。一旦匹配成功,則進入相應case結構中,呼叫其執行語句。
    • 當呼叫完執行語句以後,則仍然繼續向下執行其他case結構中的執行語句,直到遇到break關鍵字或此switch-case結構末尾結束為止。
  2. break,可以使用在switch-case結構中,表示一旦執行到此關鍵字,就跳出switch-case結構
  3. switch結構中的表示式,只能是如下的6種資料型別之一: byte 、short、char、int、列舉型別(JDK5.0新增)、String型別(JDK7.0新增)
  4. case 之後只能宣告常量。不能宣告範圍。
  5. break關鍵字是可選的。
  6. default:相當於if-else結構中的else.
  7. default結構是可選的,而且位置是靈活的。

補充:

  • 如果switch-case結構中的多個case的執行語句相同,則可以考慮進行合併。
  • *if和switch語句很像,具體什麼場景下,應用哪個語句呢?
  • 如果判斷的具體數值不多,而且符合byte、short 、char、int、String、列舉等幾 種型別。雖然兩個語句都可以使用,建議使用swtich語句。因為效率稍高。
  • 其他情況:對區間判斷,對結果為boolean型別判斷,使用if,if的使用範圍更廣。 也就是說,使用switch-case的,都可以改寫為if-else。反之不成立

2. 迴圈結構

2.1. 迴圈結構的四要素

① 初始化條件
② 迴圈條件 --->是boolean型別
③ 迴圈體
④ 迭代條件 說明:通常情況下,迴圈結束都是因為②中迴圈條件返回false了。

2.2. 三種迴圈結構:

for迴圈結構

for(①;②;④){
    ③
}
//執行過程:① - ② - ③ - ④ - ② - ③ - ④ - ... - ②


 說明:
對於①初始化部分可以宣告多個變數,但必須是同一個型別,用逗號分隔
對於②迴圈條件部分為boolean型別表示式,當值為false時,退出迴圈
對於④可以有多個變數更新,用逗號分隔

while迴圈結構

①
while(②){
	③;
	④;
}
//執行過程:① - ② - ③ - ④ - ② - ③ - ④ - ... - ②

注意:寫while迴圈千萬小心不要丟了迭代條件。一旦丟了,就可能導致死迴圈!

for和while迴圈總結:

  1. 開發中,基本上我們都會從for、while中進行選擇,實現迴圈結構。
  2. for迴圈和while迴圈是可以相互轉換的! 區別:for迴圈和while迴圈的初始化條件部分的作用範圍不同。
  3. 我們寫程式,一般要避免出現死迴圈。

do-while迴圈結構

①
do{
  ③;
  ④;
  }while(②);
//執行過程:① - ③ - ④ - ② - ③ - ④ - ... - ②

說明:

  1. do-while迴圈至少會執行一次迴圈體!

  2. 開發中,使用for和while更多一些。較少使用do-while

  3. 陣列迴圈比遍歷通常用for迴圈

  4. 觸發條件複雜的用while迴圈

“無限迴圈”結構: while(true) 或 for(;;)

如何主動結束一個迴圈結構?

  • 在迴圈體中,執行break

巢狀迴圈

巢狀迴圈:將一個迴圈結構A宣告在另一個迴圈結構B的迴圈體中,就構成了巢狀迴圈

說明:
① 內層迴圈結構遍歷一遍,只相當於外層迴圈迴圈體執行了一次
② 假設外層迴圈需要執行m次,內層迴圈需要執行n次。此時內層迴圈的迴圈體一共執行了m * n次
③ 外層迴圈控制行數,內層迴圈控制列數

/練習一:
    /*
		******
		******
		******
		******
		*/
    for(int j = 1;j <= 4;j++ ){
        for(int i = 1;i <= 6;i++){
            System.out.print('*');
        }
        System.out.println();
    }
//練習二:
/*			i(行號)		j(*的個數)
		*			1			1
		**			2			2
		***			3			3
		****		4			4
		*****		5			5
		*/
for(int i = 1;i <= 5;i++){//控制行數
    for(int j = 1;j <= i;j++){//控制列數
        System.out.print("*");
    }
    System.out.println();
}

3. 關鍵字:break和continue

break和continue關鍵字的使用

 使用範圍迴圈中的作用(不同點)相同點
breakswitch-case 迴圈結構中結束當前迴圈關鍵字後面不能宣告執行語句
continue迴圈結構中結束當次迴圈關鍵字後面不能宣告執行語句

注意:

break、continue之後不能有其他的語句,因為程式永遠不會執行其後的語句

return:並非專門用於結束迴圈的,它的功能是結束一個方法。 當一個方法執行到一個return語句時,這個方法將被結束。

與break和continue不同的是,return直接結束整個方法,不管 這個return處於多少層迴圈之內

很多語言都有goto語句,goto語句可以隨意將控制轉移到程式中的任意一條 語句上,然後執行它。但使程式容易出錯。Java中的break和continue是不同 於goto的

4. 補充:Scanner類的應用

如何從鍵盤獲取不同型別的變數:需要使用Scanner類

具體實現步驟:

  1. 導包:import java.util.Scanner;
  2. Scanner的例項化:Scanner scan = new Scanner(System.in);
  3. 呼叫Scanner類的相關方法next() 或 nextxxx(),來獲取指定型別的變數

注意: 需要根據相應的方法,來輸入指定型別的值。如果輸入的資料型別與要求的型別不匹配時,會報異常:InputMisMatchException導致程式終止

//1.導包:import java.util.Scanner;
import java.util.Scanner;
class ScannerTest{
    public static void main(String[] args){
        //2.Scanner的例項化
        Scanner scan = new Scanner(System.in);
        //3.呼叫Scanner類的相關方法
        System.out.println("請輸入你的姓名:");
        String name = scan.next();
        System.out.println(name);
        System.out.println("請輸入你的芳齡:");
        int age = scan.nextInt();
        System.out.println(age);
        System.out.println("請輸入你的體重:");
        double weight = scan.nextDouble();
        System.out.println(weight);
        System.out.println("你是否相中我了呢?(true/false)");
        boolean isLove = scan.nextBoolean();
        System.out.println(isLove);
        //對於char型的獲取,Scanner沒有提供相關的方法。只能獲取一個字串
        System.out.println("請輸入你的性別:(男/女)");
        String gender = scan.next();//"男"
        char genderChar = gender.charAt(0);//獲取索引為0位置上的字元
        System.out.println(genderChar);	
    }
}

練習題目

第一題:求ax2+bx+c=0方程的根。 求ax2+bx+c=0方程的根。a,b,c分別為函式的引數, 如果a≠0,那麼: (1)當b2-4ac>0,則有兩個解; (2)當b2-4ac=0,則有一個解; (3)當b2-4ac<0,則無解; 如果a=0,b≠0,那麼,

提示1:Math.sqrt(num); sqrt指平方根
例如:
求x2-4x+1=0方程的根
求x2-2x+1=0方程的根


import java.util.Scanner;

class Exer5{
	public static void main(String[] args){
		Scanner input = new Scanner(System.in);
		
		System.out.println("一元二次方程:ax^2+bx+c=0");
		System.out.print("請輸入引數a:");
		double a = input.nextDouble();
		
		System.out.print("請輸入引數b:");
		double b = input.nextDouble();
			
		System.out.print("請輸入引數c:");
		double c = input.nextDouble();

		if(a!=0){
			double temp = b*b - 4*a*c;
			if(temp==0){
				double x = -b/(2*a);
				System.out.println("該方程是一元二次方法,有兩個相同解:" + x);
			}else if(temp>0){
				double sqrt = Math.sqrt(temp);
				double x1 = (-b+ sqrt)/(2*a);
				double x2 = (-b- sqrt)/(2*a);
				System.out.println("該方程是一元二次方法,兩個不同解:" + x1 +"," + x2);
			}else{
				System.out.println("該方程是一元二次方法,在實數範圍內無解!");
			}
		}else{
			if(b!=0){
				double x = -c/b;
				System.out.println("該方程是一元一次方程,有一個解:" + x);
			}else{
				System.out.println("不是方程,是一個等式");
                if(c == 0){
                    System.out.println("等式成立");
}else{
    System.out.println("等式不成立");
}
			}
		}
	}
}

第二題 假設你想開發一個玩彩票的遊戲,程式隨機地產生一個兩位數的彩票,提示使用者輸入一個兩位數,然後按照下面的規則判定使用者是否能贏。

1)如果使用者輸入的數匹配彩票的實際順序,獎金10 000美元。
2)如果使用者輸入的所有數字匹配彩票的所有數字,但順序不一致,獎金 3 000美元。
3)如果使用者輸入的一個數字僅滿足順序情況下匹配彩票的一個數字,獎金1 000美元。
4)如果使用者輸入的一個數字僅滿足非順序情況下匹配彩票的一個數字,獎金500美元。
5)如果使用者輸入的數字沒有匹配任何一個數字,則彩票作廢。

提示:使用Math.random() 產生隨機數
Math.random() 產生[0,1)範圍的隨機值
Math.random() * 90:[0,90)
Math.random() * 90 + 10:[10,100) 即得到 [10,99]
使用(int)(Math.random() * 90 + 10)產生一個兩位數的隨機數

import java.util.Scanner;

class TestCaiPiao{
	public static void main(String[] args){
		//1、隨機產生一個兩位數
		//System.out.println(Math.random());//產生[0,1)
		int number = (int)(Math.random()*90 + 10);//得到[10,99],即[10,100)
		//System.out.println(number);
		
		int numberShi = number/10;
		int numberGe = number%10;
		
		//2、使用者輸入一個兩位數
		Scanner input = new Scanner(System.in);
		System.out.print("請輸入一個兩位數:");
		int guess = input.nextInt();
		
		int guessShi = guess/10;
		int guessGe = guess%10;
		
		if(number == guess){
			System.out.println("獎金10 000美元");
		}else if(numberShi == guessGe && numberGe == guessShi){
			System.out.println("獎金3 000美元");
		}else if(numberShi==guessShi || numberGe == guessGe){
			System.out.println("獎金1 000美元");
		}else if(numberShi==guessGe || numberGe == guessShi){
			System.out.println("獎金500美元");
		}else{
			System.out.println("沒中獎");
		}
		
		System.out.println("中獎號碼是:" + number);
	}
}

相關文章