2020-10-16
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(表示式){
case 值1:
語句1;
break ;
case 值2:
語句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...") ;
}
}