2020-10-16

Mr.Arbor發表於2020-10-17

java 流程控制語句

流程控制語句概述

在一個程式執行的過程中,各條語句的執行順序對程式的結果是有直接影響的。
也就是說程式的流程對執行結果有直接影響。所以,我們必須清楚內調語句的執行流程。
而且,很多時候我們要通過控制語句的執行順序來實現我們要完成的功能。

流程控制語句的分類

  • 順序結構語句
  • 選擇結構語句
  • 迴圈結構語句

順序結構語句

順序結構概述

是程式中最簡單最基本的流程控制,沒有特定的語法結構,
按照程式碼的先後順序,依次執行,程式中大多數的程式碼都是這樣執行的。
總的來說:寫在前面的先執行,
//順序結構語句
class OrderDemo{
	public static void main(String[] args){
		//順序結構語句	(簡單)
		//一旦進入main方法中(由Jvm 呼叫),從有效行開始依次從上往下執行!
		System.out.println("程式開始了....") ;
		
		System.out.println("愛生活,愛Java....") ;
		
		System.out.println("程式結束了....") ;
	}
}

選擇結構

也被稱為分支結構。
選擇結構有特定的語法規則,程式碼要執行具體的邏輯運算進行判斷,
邏輯運算的結果有兩個,所以產生選擇,按照不同的選擇執行不同的程式碼。

Java語言提供了兩種選擇結構語句:

  • if 語句
  • switch 語句

if 語句

if 語句格式1
if(表示式){	 
    語句;																																											
}		

執行流程

1)判斷表示式是否成立,如果是true,成立,執行語句;
2)如果不成立,不執行!

注意事項

 有if的地方需要一對 {  } ,有 {  } 地方不能有分號
//導包
import java.util.Scanner ;
class IfDemo{
	public static void main(String[] args){
		
		//建立鍵盤錄入物件
		Scanner sc = new Scanner(System.in) ;
		
		//提示並接收
		System.out.println("請你輸入一個資料:");
		int a = sc.nextInt() ;
		
		//if格式1
		if(a >= 10){
			System.out.println("a的值大於等於10") ;
		}
		
		System.out.println("over") ;
		
	}
}
if 語句格式2
if(表示式){
		語句1;
	}else{
		語句2;
	}

執行流程

1)首先判斷表示式是否成立,如果是true,執行語句1
2)如果不成立,執行語句2;
/*需求:
	鍵盤錄入一個資料,判斷這個是否是偶數!
	
	應用場景
			針對兩種情況進行判斷
			
			需求: 鍵盤錄入兩個資料,求最大值!
			
					(使用if...else.../三元)
	
*/

//導包
import java.util.Scanner;
class IfDemo3{
	public static void main(String[] args){
		
		//定義一個變數
		int x = 10 ;
		if(x >=10){
			System.out.println("x大於等於10") ;
		}else{
			System.out.println("x小於10") ;
		}
		
		System.out.println("over...") ;
		System.out.println("---------------------------") ;
		
		//建立鍵盤錄入物件
		Scanner sc = new Scanner(System.in) ;
		//提示並接收
		System.out.println("請輸入一個資料:") ;
		int num = sc.nextInt() ;
		
		if(num %2 == 0){ //%:求餘: 能夠被2整數,餘數為0
			System.out.println(num+"是偶數!") ; 
		}else{
				System.out.println(num+"是奇數!") ; 
		}
	}
}
if 語句格式3
if(表示式1){
			語句1;
		}else if(表示式2){
			語句2;
		...
		...
		...
		}else{
			語句n+1 ;
		}

執行流程

1)首先判斷表示式1是否成立,如果成立,執行語句1,if語句結束!
2)如果表示式1不成立,再次判斷表示式2是否成立,如果成立,執行語句2,語句結束!
3)如果上述表示式都不成立,就執行else中的語句,if語句結束!
/*需求:

		鍵盤錄入學生的成績,判斷學生的成績等級
			90~100    突出
			80~90之間 優秀
			70~80之間  良好
			60~70     及格
			60以下    不及格
*/
//導包
import java.util.Scanner ;
class IfDemo4{
	public static void main(String[] args){
		
		//建立鍵盤錄入物件
		Scanner sc = new Scanner(System.in) ;
		
		//提示,並接收資料
		System.out.println("請您錄入學生的成績: ") ;
		int score = sc.nextInt() ;
		
		if(score >100 || score < 0){
			System.out.println("您錄入的是一個非法資料...") ;
		}else if(score >= 90 && score <=100){
			System.out.println("該學生成績十分突出...") ;
		}else if(score >=80 && score< 90){
			System.out.println("該學生成績優秀...") ;
		}else if(score >= 70 && score <80){
			System.out.println("該學生成績良好...") ;
		}else if(score >= 60 && score <70){
			System.out.println("該學生成績及格...") ;
		}else{
			System.out.println("該學生成績不及格...") ;
		}	
	}
}
if 語句格式2 的巢狀
if(表示式){
	//表示式成立
	if(表示式1){
		語句1;
	}else{
		語句2;
	}else{
		//不成立
		if(表示式11){
			語句11;
		}else{
			語句22;
			}
		}

執行流程

1)首先判斷外層if中表示式是否成立,如果成立,執行表示式2是否成立
2)如果表示式2成立,執行語句1;否則,執行語句2
3)外層if中表示式不成立,就執行else中的語句
4)判斷表示式11是否成立,如果成立,執行語句11,否則執行語句22;
/*
需求:鍵盤錄入三個資料:求三個資料最大值
*/
//導包
import java.util.Scanner ;
class IfTest{

	public static void main(String[] args){
		//建立鍵盤錄入物件
		Scanner sc = new Scanner(System.in) ;
		
		//提示,並接收資料
		System.out.println("請輸入第一個資料:");
		int a = sc.nextInt() ;
		
		System.out.println("請輸入第一個資料:");
		int b = sc.nextInt() ;
		
		System.out.println("請輸入第一個資料:");
		int c = sc.nextInt() ;
		
		//操作判斷
		//方式1:中間變數的方式+三元運算子
		int temp = (a>b) ? a: b ;
		//使用max變數接收
		int max = (temp > c ) ? temp : c ;
		System.out.println("三個資料中的最大值是:"+max) ;
		System.out.println("---------------------------");
		
		//方式2:三元運算子一步走:
		int max2 = (a>b) ? ((a > c) ? a: c) :((b > c) ? b : c) ;
		System.out.println("三個資料中的最大值是:"+max2) ;
		System.out.println("---------------------------");
		
		//方式3:使用if語句格式巢狀
		
		//定義一個變數max3
		int max3 ;
		if( a > b){
			//a>b成立
			if(a > c){
					//a比c大
				max3 = a ;	
			}else{
				//c比a大
				max3 = c ;
			}
		}else{
			//不成立
			if(b > c){
				//b比c大
				max3 = b ;
			}else{
				//c比b大
				max3 = c ;
			}
		}
		System.out.println("三個資料中的最大值是:"+max3) ;
	}
}

switch 語句

switch(表示式){
	case1:
			語句1;
			break ;
	case2:
			語句2;
			break ;		
	...
	...
	default:
			語句n;
			break ;
	}

執行流程

1)先判斷表示式的值它和case語句值1,是否匹配如果匹配,執行語句1,遇見break ,switch語句結束了!
2)如果值1不匹配,繼續判斷值2是否和表示式中的值是否匹配,如果匹配,執行語句2,
遇見break,switch語句結束!
3)如果上面的所有case語句都不匹配,執行default語句,執行語句n,直接結束。
/*
需求:
	鍵盤錄入一個資料,判斷星期  (使用switc語句完成)
		1,星期一
		2,星期二
		3,星期三
		4,星期四
		5,星期五
		6,星期六
		7,星期天	
*/
//導包
import java.util.Scanner;
class SwitchDemo{
	public static void main(String[] args){
		
		//建立鍵盤錄入物件
		Scanner sc = new Scanner(System.in) ;
		
		//提示並接收資料
		System.out.println("請您輸入一個資料:") ;
		int weekDate = sc.nextInt() ;
		
		switch(weekDate){
		case 1:
			System.out.println("星期一") ;
			break ;
		case 2:
			System.out.println("星期二") ;
			break ;
		case 3:
			System.out.println("星期三") ;
			break ;
		case 4:
			System.out.println("星期四") ;
			break ;
		case 5:
			System.out.println("星期五") ;
			break ;
		case 6:
			System.out.println("星期六") ;
			break ;
		case 7:
			System.out.println("星期天") ;
			break ;
		default : //末尾
			System.out.println("非法資料!!") ;
			break ;
			
		}
	}
}

switch語句使用的注意事項

1)switch語句中的case語句後面跟的常量值,不能跟變數!  
對比:javascript:switch語句 中的case可以是常量也可以變數

2)case語句中的break不能輕易省略,否則就會造成"case穿透"如果沒有寫break,
跟下面case值不進行比較,直接執行語句,直到遇見break結束!

3)switch中的default語句:書寫位置預設是在末尾,但是它也可以在switch語句中的任何位置,
但是不影響執行流程,都需要先跟case中的值進行比較,如果都沒有匹配,都需要執行default...
如果default在語句的末尾,break可以省略,如果在語句中的話,不建議省略break ;

4)關於switch語句的結束問題:
	遇見break (中斷,結束的意思) ,switch語句結束
				break:屬於跳轉控制語句中一種:兩種場景:switch中/迴圈語句中
	語句預設執行到末尾!
class SwitchTest{
	public static void main(String[] args){
		
		
		//兩個變數
		int a = 2 ;
		int b = 3 ;
		switch(a){
		default :
			b ++ ;   //b=3     --> 4 
			break ; //遇見break:switch語句
		case 3:
			b ++ ;
		case 4: 
			b ++ ;
		}
		System.out.println("b:"+b) ;
		System.out.println("-----------------------") ;
		//兩個變數
		int x = 2 ;
		int y = 3 ;
		switch(x){//x=2
		default :
			y++ ; //y=3 ++ ===>4
		case 3:
			y ++ ; //4 +1===>5
		case 4: 
			y ++ ;//5+1 ===>6
		}
		System.out.println("y:"+y) ;
		
		
		System.out.println("-----------------------") ;
		
		int m = 2 ;
		int n = 3 ;
		switch(m){//m=2
		default :
			n++ ; 
		case 2:
			n ++ ; 	//n++ --->4
			//break ;
		case 4: 
			n ++ ; //n++--->4+1 = 5
		}
		
		System.out.println("n:"+n) ; 
	}
}

迴圈語句

概念:通過某個條件,重複的執行一段邏輯程式碼。

Java語言提供的迴圈結構語句:

 - for 迴圈語句
 - while 迴圈語句
 - do-while 迴圈語句

for 迴圈語句

for(初始化語句;條件表示式;步長語句){
			  迴圈體語句;
		}

執行流程:

1)初始化語句給變數進行賦值,只執行一次
2)判斷這個條件表示式是否成立,如果成立,就執行迴圈體語句,在去執行步長語句 (++,--)
3)再次判斷條件表示式是否成立,如果成立,繼續上面執行方式...
	...
	...
4)一直迴圈到條件表示式不成立的時候,for迴圈結束!
/*
需求:
		請求在控制檯輸出10次 "helloworld"(明確迴圈次數了)
*/
class ForDemo{
	public static void main(String[] args){
		//最原始的做法
		System.out.println("helloworld") ;
		System.out.println("helloworld") ;
		System.out.println("helloworld") ;
		System.out.println("helloworld") ;
		System.out.println("helloworld") ;
		System.out.println("helloworld") ;
		System.out.println("helloworld") ;
		System.out.println("helloworld") ;
		System.out.println("helloworld") ;
		System.out.println("helloworld") ;
		
		System.out.println("----------------------------") ;
		/*
			for(初始化語句;條件表示式;步長語句){
			  迴圈體語句;
			}
		*/
		//  初始化語句    條件表示式      步長語句(控制體語句)
		for(int x = 1 ;    x <= 10 ;      x ++){ //x = 1  1 <=10    x++ :1++ = 2
													//x=2 <=10 
													//x=3 <=10
													//...
													//x = 10  x++ = 11 <= 10(不成立)
		
			//迴圈體語句
			System.out.println("helloworld") ;//1次 //第二次 第三次........第十次
												
		}
		
		//System.out.println(x) ;
	}
}
for 迴圈的巢狀
for(初始化語句;條件表示式;步長語句){
		
		//迴圈體語句
		for(初始化語句;條件表示式;步長語句){	
			
		}
	}
/*
需求:
控制檯輸出:四行五列的*形
*****
*****
*****
*****
	
*/

class ForForDemo{
	public static void main(String[] args){
		
		//原始的做法:
		System.out.println("*****") ;  //System.out.println():列印內容並換行
		System.out.println("*****") ;
		System.out.println("*****") ;
		System.out.println("*****") ;
		System.out.println("------------------------------") ;
		
		//改進: 上面的程式碼:重複度高
		//*****
		//一次輸出一個*,而且要保證5個*在同一行上 
		//System.out.print("*"): 列印內容不換行
		
		
		//第一行:
		System.out.print("*") ; 
		System.out.print("*") ; 
		System.out.print("*") ; 
		System.out.print("*") ; 
		System.out.print("*") ; 
		//換下一行:
		System.out.println() ; //空行
		
		//第二行:
		System.out.print("*") ; 
		System.out.print("*") ; 
		System.out.print("*") ; 
		System.out.print("*") ; 
		System.out.print("*") ; 
		System.out.println() ;
		
		//第三行:
		System.out.print("*") ; 
		System.out.print("*") ; 
		System.out.print("*") ; 
		System.out.print("*") ; 
		System.out.print("*") ; 
		System.out.println() ;
		
		//第四行:
		System.out.print("*") ; 
		System.out.print("*") ; 
		System.out.print("*") ; 
		System.out.print("*") ; 
		System.out.print("*") ; 
		System.out.println() ;
		
		System.out.println("------------------------------") ;
		
		//上面每一行:輸出* 程式碼重複度高,繼續優化改進
		//見到重複性的程式碼:迴圈改進
		//每一行的*,使用迴圈
		//第一行
		for(int x = 0 ; x < 5 ;x++){ //0,1,2,3,4
			System.out.print("*") ; 
		}
		System.out.println() ; //空行
		
		
		//第二行
		for(int x = 0 ; x < 5 ;x++){ //0,1,2,3,4
			System.out.print("*") ; 
		}
		System.out.println() ; //空行
		
		//第三行
		for(int x = 0 ; x < 5 ;x++){ //0,1,2,3,4
			System.out.print("*") ; 
		}
		System.out.println() ; //空行
		
		//第四行
		for(int x = 0 ; x < 5 ;x++){ //0,1,2,3,4
			System.out.print("*") ; 
		}
		System.out.println() ; //空行
		
		System.out.println("--------------------------") ;
		
		//上面程式碼:重複度還是很高,每一行都一個for迴圈+輸出空行(換行)
		
		for(int x = 0 ; x < 4 ; x ++){//x = 0,1,2,3 (迴圈四次)    :外層迴圈控制行數
			
			for(int y = 0 ; y < 5 ;y++){ //0,1,2,3,4 //記憶體迴圈控制:列數
				
				System.out.print("*") ; 
			}
			System.out.println() ; //空行
		}
		
		System.out.println("----------------------------------") ;
		
		//6行7列
		for(int x = 0 ; x < 6 ; x ++){
			for(int y = 0 ; y < 7 ; y ++){
				System.out.print("*") ;
			}
			System.out.println();
		}
	}
}

while 迴圈語句

while迴圈語句格式:
基本格式
	while(初始化語句以及條件表示式){
		 迴圈體語句;
		 步長語句(控制體語句) ;
	}
	
擴充套件格式:(推薦)
		初始化語句;
		while(條件表示式){
			迴圈體語句;
			步長語句(控制體語句) ;
		}

執行流程

1)首先初始化語句進行賦值
2)判斷條件表示式是否成立,如果成立,執行迴圈體語句再次執行步長語句;
3)繼續判斷條件表示式是否成立,如果成立,執行迴圈體語句再次執行步長語句;
	  ...
	  ...	  
4)當條件表示式為false,不成立,while迴圈語句結束
/*
需求:	
	控制檯輸出5次"helloworld"
*/
class WhileDemo{
	public static void main(String[] args){
		
		//for迴圈
		for(int x = 0 ; x < 5 ; x ++){//x = 0,1,2,3,4
			System.out.println("helloworld") ;
		} 
		System.out.println("--------------------------") ;
		
		//while迴圈:擴充套件 格式
		/*
			
		初始化語句;
		while(條件表示式){
			迴圈體語句;
			步長語句(控制體語句) ;
		}
		*/
		int j = 1 ;
		while(j <= 5){
			System.out.println("helloworld") ;
			j ++ ;
		}
	}
}

while迴圈和for迴圈的區別

1)從格式上不太一樣 
		for(初始化語句;條件表示式;步長語句){
			迴圈體;
		}
	
		初始化語句;
		while(條件表示式){
			迴圈體語句;
			步長語句;
		}
2)從記憶體角度:(是否節省記憶體空間)
			變數:     編譯時期變數          執行時期變數
					   int i  = 10 ;      Integer(引用型別) i = 100 ;
	for迴圈:for迴圈語句結束,變數從記憶體中釋放掉了,節省記憶體空間(優先)
	while迴圈:while迴圈語句結束,依然可以訪問變數,耗費記憶體空間
變數/物件   最終程式結束,都需要垃圾回收器GC
			(jvm:假想計算機--->開啟:垃圾回收執行緒)
3)應用場景:是否明確次數
	針對for迴圈:(使用居多) 明確迴圈次數
	針對while迴圈:(使用:僅此for) :不明確迴圈次數
class WhileDemo2{
	public static void main(String[] args){
		
		//需求:分別使用for,while迴圈控制檯輸出3次 "我愛Java"
		
		for(int x = 1; x <=3 ; x ++){
			System.out.println("我愛Java") ;
		}
		//System.out.println(x) ;
		
		System.out.println("---------------") ;
		//初始化語句:
		int j = 1 ;
		while(j <=3 ){
			System.out.println("我愛Java") ;
			j ++ ;
		}
		System.out.println(j) ;
		
		System.out.println("over") ;
		
	}
}

兩個死迴圈

格式1:
			for(;;){
				
				迴圈體語句;
			}
			
格式2 :(推薦)
			while(true){
				
				迴圈體語句;
			}
class WhileDemo3{
	public static void main(String[] args){
		
		//格式1;
		/*
		for(;;){
			System.out.println("我很開心,學習了死迴圈....") ;
		}
		*/
		
		//格式2:
		while(true){ //恆成立
			System.out.println("我很開心,學習了死迴圈....") ;
		}
		
		//死迴圈:要靈活使用: 
		//學習:java.lang.Math:數學運算(提供三角函式/基本的數學運算)
		//方法random()--->產生隨機數
	}
}

水仙花數

/*
	使用while迴圈完成:
	1)1-100之間的和
	2)1-100之間的偶數和
	3)5的階乘
	4)輸出所有的水仙花數
	5)統計水仙花數的個數
	
	
	格式:
		初始化語句;
		while(條件表示式){
			迴圈體;
			步長語句;
		}
*/
class WhileTest{
	public static void main(String[] args){
		//1-100之間的和
		//最終結果變數
		int sum = 0 ;
		int i = 1 ;
		while(i <= 100){
			sum += i ;
			i ++ ;
		}
		System.out.println("sum:"+sum) ;
		
		System.out.println("----------------------") ;
		
		//1-100之間的偶數和
		int sum2 = 0 ;
		int j = 1 ;
		while(j <= 100){
			//判斷
			if(j%2==0){
				sum2 += j ;
			}
			j ++ ;
		}
		System.out.println("sum2:"+sum2) ;
		
		System.out.println("----------------------") ;
		//5的階乘
		int jc = 1 ;
		int x = 1 ;
		while(x <= 5 ){
			
			jc *= x ;
			x ++ ;
		}
		System.out.println("5的階乘是:"+jc) ;
		
		
		System.out.println("----------------------") ;
		
		//輸出所有的水仙花數
		//初始化語句
		int m = 100 ;
		while(m < 1000){
			//定義三個變數
			int ge  = m % 10 ;
			int shi = m /10 % 10 ;
			int bai = m/ 10 /10 %10 ;
			
			//條件
			if(m == (ge*ge*ge+shi*shi*shi+bai*bai*bai)){
				System.out.println(m) ;
			}
			
			m ++ ;
		}
		
		System.out.println("----------------------") ;
		
		//統計水仙花數的個數
		//定義一個統計變數
		int count = 0 ;
		int n = 100;
		while(n <= 999){
			//定義三個變數
			int ge  = n % 10 ;
			int shi = n /10 % 10 ;
			int bai = n / 10 /10 %10 ;
			
			//條件
			if(n == (ge*ge*ge+shi*shi*shi+bai*bai*bai)){
				//統計變數++
				count ++ ;
			}
			
			n++;
		}
		System.out.println("水仙花數共有"+count+"個") ;
	}
}

do-while 迴圈語句

do-while迴圈語句的格式: (開發中:使用不多,在java原碼中)
	
	格式:
		初始化語句;
		do{
			迴圈體語句;
			步長語句(控制體語句) ;
		}while(條件表示式) ;

執行流程:

1)初始化語句賦值
2)直接執行迴圈體語句---->步長語句--->條件表示式
....
....

特點

迴圈體至少執行一次 (它和while,for的區別)
/*
需求:控制檯使用do-while迴圈輸出5次"helloworld"	
*/
class DoWhileDemo{
	public static void main(String[] args){
		
		/*
			初始化語句;
		do{
			迴圈體語句;
			步長語句(控制體語句) ;
		}while(條件表示式) ;
		*/
		int x = 6 ;
		do{
			System.out.println("helloworld");
			x ++ ;
		}while(x <= 5) ;
	}
}

跳轉控制語句

break  :中斷,結束得的意思,不能單獨使用,沒有意義!在switch中以及迴圈中使用!
continue: 結束當前迴圈,立即進入下一次迴圈單獨不能使用,結合迴圈語句中使用
return :結束方法方法去使用的!(結合方法)
/*
break
*/
class BreakDemo{
	public static void main(String[] args){
		
		//break ;//在 switch 或 loop 外部中斷
		
		for(int x = 0 ; x <10 ; x ++){
		
			//0,1,2,3,4,5,6,7,8,9
			//判斷
			if(x == 2){
				break ; //單層迴圈中使用
			}
			System.out.println(x) ;//0,1
		}
		System.out.println("over") ;
		System.out.println("--------------------------------");
		
		
		//標籤語句:
		//標籤名稱: for()...
		wc:for(int x = 0; x < 4 ; x ++){//外層迴圈
			nc:for(int y = 0 ; y < 5 ; y ++){//內層迴圈
					//if(x == 2){ //第三行的時候結束 :結束外層迴圈
						//break wc  ;
						//break nc ;
					//}

					if(y == 2){
						break nc ;
					}
					System.out.print("*") ;
				
			}
			System.out.println();
		}
		
	}
}
/*
continue
需求: 筆試題
		for(int x = 1 ; x <=10 ; x ++){
			//1,2,3,4,5,6,7,8,9,10
			//x = 1 ,x = 2, x = 3
			if(x % 3 == 0){ //x = 3 ,x = 6 , x = 9
				//此處補全程式碼
				break ;
				
				continue ;
				
				System.out.println("我愛Java...") ;
			}
			
			System.out.println("我愛Java...") ; //1次  //2次
				
			
		}
		
		//1)在控制檯2次  "我愛Java..."
				break ;
		//2)在控制檯輸出7次 "我愛Java..."
				continue
		//3)在控制檯輸出13次 "我愛Java..."
			System.out.println("我愛Java...") ;

*/

class ContinueDemo{
	public static void main(String[] args){
		
		//continue ;  //continue 在 loop 外部
		
		for(int x = 0 ; x < 10 ; x ++){
			//0 ,1,2,3
			//判斷
			if(x == 3){
				continue ; //結束當前迴圈,立即下次迴圈
			}
			System.out.println(x) ; //0,1,2,4
		}
		
		System.out.println("over") ;
	}
}
/*
return
*/
class ReturnDemo{
	public static void main(String[] args){
		System.out.println("程式開始了...")  ;
		for(int x = 0 ; x < 10 ; x ++){
			
			
			if(x == 2){
				//break ;//中斷,結束,迴圈語句中語句break,結束了
				//continue ;立即結束當前迴圈,進入下一次迴圈:x=2 :不會出現
				return ;//當前方法結束了
			}
			System.out.println(x) ;
			
		}
		System.out.println("程式結束了...") ;
		
		System.out.println("over...") ;
	}
}