天天看點

2018-05-14 第八天

一、

分支選擇:

java 的流程控制語句:

控制代碼執行的一個路徑、方向。

三類:1.順序執行:從上到下依次執行代碼。

  2.分支選擇:根據條件 來 選擇執行某些代碼,跳過某些代碼。

3.循環:某些代碼反複的被執行。

switch:常用于等值比較的多分支選擇。

if-else if -else :既可以使用等值比較判斷,還可以進行不等值的比較的多分支選擇。

switch 能實作的,if-else if -else能比較輕松地實作。

而if-else if -else 能實作的,switch 可能實作起來很繁瑣。

是以,不等值的比較常用:if-else if -else

等值比較根據case 的數量決定使用哪個:switch 、 if-else if -else。

switch優點: 結構清晰一些。

(一) if 選擇語句: 1.if 單分支選擇:

文法:

if(條件表達式){

//任意行java 代碼

}

//java 後續代碼

解釋:

if 是關鍵字,如果 的意思。

條件表達式:必須是一個傳回值為 boolean 類型的表達式。 往往是關系表達式、邏輯表達式。

{}:if 代碼塊。看做一個執行的整體。

執行過程:

1:如果 條件表達式成立即傳回值為 true,那麼就執行if 代碼塊中的所有的代碼。

2:如果 條件表達式不成立即傳回值為false,那麼就跳過if 代碼塊中的所有的代碼,執行java 後續的代碼内容。

注意:

1.如果 if 代碼塊 隻有一條語句,那麼大括号可以省略。if 隻控制這一條代碼的執行與否。

2.條件表達式的小括号的後面,千萬不要加分号,加上分号之後,條件控制的就是分号是否執行。和後面的代碼塊就沒有一點關系了。

2. 

if-else:雙分支選擇語句。

文法:if(條件表達式){

//if 代碼塊

}else{

//else 代碼塊

//後續代碼

else:java 關鍵字否則的意思

1:如果 if 的條件成立即條件表達式的傳回值為true。那麼執行 if 代碼塊的内容。執行完 if 代碼塊的内容後,跳過else 代碼塊。直接執行後續代碼。

2:如果 if 條件不成立即傳回false。那麼跳過 if 代碼塊 的内容,直接執行else 的代碼塊,執行完畢後,執行後續代碼。

1:if 和 else 代碼塊必須執行且隻能執行一個代碼塊。

2:if 代碼塊  和 else 代碼塊 ,任意一個代碼塊 如果隻有一條語句,大括号可以省略。

3:if 和 else 條件的後面不能添加“;”

4: if 語句可以單獨存在,但是else 是不可以單獨存在的。else 必須和某一個if 配對。

3. 多分支:if else if else

if(條件-1){

//代碼塊-1

}else if(條件-2){

//代碼塊-2

//代碼塊-3

//代碼塊-4

}.... //任意個else if

else{

//代碼塊-n

//後續代碼塊

1:先判斷條件-1成立即傳回true,執行代碼塊-1  然後跳過後續的所有的 代碼塊-n,執行後續代碼。

2:如果條件-1 不成立即傳回false,跳過 代碼塊-1 繼續 判斷條件-2 ,如果成立,則執行代碼塊-2,并跳過後續的所有條件和代碼塊-n ,直接執行後續代碼。如果條件-2不成立即傳回false,則跳過代碼塊-2  繼續判斷條件-3,依此類推。

3:簡單概述:if 後面的條件,如果有一個成立的,那麼就執行 對應的代碼塊。其他的代碼塊 都不執行。

4:如果所有的條件都不成立,那麼,執行最後的 else 代碼塊-n。

注意的問題:

1:所有的代碼塊-1 到 -n,必須執行且僅執行一個。條件互斥的代碼塊。

2:else 的數量必須小于等于 if 的個數。最後的else可以沒有。如果最後的else沒有,那麼可能沒有一個代碼塊-n 被執行,即所有條件都不成立。

3:else 和它前面的最近的if 配對。

例1:

// 需求:産生一個随機數,範圍[0-22]. 來代表一個年齡 age,

// 使用if 語句,如果 age [0-3] 輸出 還沒有上學 [4-6] 幼稚園小朋友  [7-12] 國小生 [13-15] 中學生 [16-18]  高中生 [19-22] 大學生。

public class TestIfElseIf{

public static void main(String[] args){

final int MIN = 0;

final int MAX = 23;

//得到一個随機年齡

int age = (int)(Math.random() * (MAX-MIN) + MIN);

System.out.println("age = "+age );

if(age <= 3){

System.out.println("還沒有上學!");

}else if(age <= 6){

System.out.println("幼稚園小朋友!");

}else if(age <= 12){

System.out.println("國小生!");

}else if(age <= 15){

System.out.println("中學生!");

}else if(age <= 18){

System.out.println("高中生!");

}else /*if(age >= 19 && age <= 22)*/{

System.out.println("大學生!");

}

}

例2:

//需求:模拟一次打鬥  随機産生一個人的生命值hp[50-100],然後列印。 然後才随機産生一個傷害值[30-60],暴擊的機率為60%,1.5倍傷害 。。

//然後将傷害值也列印

//如果出現暴擊的話,要提示。然後根據此次的傷害和生命值,最後輸出 人 是否被 over掉。 如果沒有over,輸出 最後的血量 hp。

//暴擊是否出現的算法:産生一個随機數 0-1,  可以把0  or  1 任意一個值出現的時候認為出現暴擊就可以了。

public class TestIfElse{

final int MAX_HP = 101;

final int MIN_HP  =50;

int hp = (int)(Math.random() * (MAX_HP-MIN_HP)+MIN_HP);

System.out.println("hp = "+hp);

final int MIN_DAMAGE = 30;

final int MAX_DAMAGE = 61;

//60%的暴擊

final double CRITICAL_PERCENT = 0.6;

final double CRITICAL_DAMAGE = 1.5;

int damage = 0;

damage = (int)(Math.random() * (MAX_DAMAGE-MIN_DAMAGE)+MIN_DAMAGE);

//定義一個變量,來表示本次攻擊是否産生了暴擊

boolean isCritical = false;

//産生一個随機數,[1-100] ran ran [1-60]

//Math.random() [0.0~1.0) [0.0~0.6]

double ran = Math.random();

if(ran <= CRITICAL_PERCENT){//産生暴擊

isCritical = true;

//根據是否産生了暴擊,進行暴擊的加成

if(isCritical){

damage *= CRITICAL_DAMAGE;

//damage = (int)(damage * CRITICAL_DAMAGE);

//減血

hp -= damage;

//控制hp 不能小于0

hp = hp < 0 ? 0 : hp;

System.out.println("本次傷害為【暴擊】傷害!傷害值為:"+damage +"\t剩餘血量為:"+hp);

}else{

System.out.println("本次傷害為普通傷害!傷害值為:"+damage +"\t剩餘血量為:"+hp);

//輸出人是否over了

if(hp > 0){

System.out.println("人還活着!剩餘血量:"+hp);

System.out.println("逝者長已矣!大家好好活着。");

4. switch:多分支選擇語句。

switch:開關。

文法:比較多見的形式:

switch(表達式-1){

case 常量表達式:

//任意行的java 代碼

break;

...

default:

1:表達式-1: 必須是一個變量,或者是變量表達式。

----表達式的傳回值類型隻能是:char 、byte、short、int、enum(jdk1.5)、String(jdk1.7)。

2:case 後的表達式:必須是常量 或者是 常量表達式

3:default:是關鍵字 ,預設的意思。

1:首先計算表達式-1 的傳回值。

2:用 表達式-1 的傳回值  依次  和 每一個case 後的表達式的傳回值進行比較,如果兩個值相等。那麼就執行 case 和 下一個break 之間的代碼。

執行到break 結束整個switch 語句。

3:如果表達式-1 的傳回值和每一個case 後的值都不相同,那麼就執行default 後的java代碼。遇到break 結束 switch 語句。

1:表達式-1 和 所有的case 後的表達式的傳回值的類型要相容。

2:每一個case 後的表達式的傳回值都必須和其他的case 是不同的。

3:default 和其後的 break; 語句是可以沒有。

4:每一個case 後的 break,都是可以沒有的。

但如果case 沒有對應的break ,那麼執行的效果是?後面的case 語句,被當作了普通的java 代碼被順序執行。直到遇到了一個break 語句,才能結束整個switch 語句。

5:break 是打斷的意思。在switch 語句中的作用:就是為了結束switch 語句。

例:

// 随機得到一個整數  [0-100] ,定義分數變量  score 用來存儲該随機數。列印目前分數

// 然後,如果score在[90-100] 列印 成績為A級。 在[80-89] 列印為B級  [60-79] C 級 剩餘部分 為 D級。

// 使用switch 實作。

public class TestSwitch{

final int MAX = 101;

int score = (int)(Math.random() * (MAX-MIN) + MIN);

System.out.println("score = "+score );

score/=10;

switch(score){

case 10:

case 9:

System.out.println('A');

break;

case 8:

System.out.println('B');

case 6:

case 7:

System.out.println('C');

default:

System.out.println('D');

二、

循環--loop

循環的分類:四種:1.while 循環

      2.do-while 循環

      3.for 循環

       4.for-each 循環,專門針對容器的循環。 jdk1.5

循環的構成:1:循環體

    2:循環的控制部分:a:循環控制初始化;b:循環條件

    3:循環疊代部分

)while 循環:

文法:while(循環條件){

//循環體---需要反複執行的java 代碼。

1:循環條件: 必須是一個boolean 表達式。傳回一個布爾值。根據該布爾值的結果來判斷是否需要執行某些代碼。

2:{}:中的内容稱之為循環體即需要反複執行的某些代碼。

1:先判斷循環條件是否成立,如果是true 那麼就執行循環體中的代碼。循環體執行完畢之後,繼續判斷循環條件,成立,繼續執行循環體。

2:反複判斷,執行的過程。直到判斷到循環條件不成立的時候--false。那麼就直接結束整個循環。執行後續的代碼。

1: 如果循環體的内容隻有一條java 語句,那麼循環體的大括号可以沒有。如果循環體是多條語句,那麼必須使用大括号括起來。

2:千萬不要在循環條件後添加分号。

3:通常會在循環體中對循環條件進行改變,以達到在适當的時候結束循環。

4:while 循環有可能循環體一次都不執行。即一開始循環條件不成立,那麼循環體就一次都不執行。

public class TestWhile1{

// 需求:有100塊錢 買礦泉水 一瓶水2塊錢,空瓶可以退1元  瓶蓋還可以退double 0.5元  問可以買多少瓶水?

double money = 100;

final int WATER_PRICE = 2;

final int EMPTY_BOTTLE_PRICE = 1;

final double BOTTLE_COVER = 0.5;

int counter = 0;

while(money >= WATER_PRICE){

//買水

money -= WATER_PRICE;

counter ++;

//喝水,退瓶,退瓶蓋

//System.out.println("咕咚~~~~");

money += EMPTY_BOTTLE_PRICE;

money += BOTTLE_COVER;

System.out.println("counter = "+counter);

System.out.println("money = "+money);

// 需求 産生一個随機數[10-100] [該随機數必須可以被7整除,還可以被5整除]  使用 do-while 實作

final int MIN = 10;

int num = 0;

do{

num = (int)(Math.random()*(MAX-MIN)+MIN);

}while(/*!(num%7==0 && num % 5 == 0)*/num%7!=0 || num%5!= 0);

System.out.println("num = "+num);

//隻要num 餘7 或者 餘5 不等于0    

(二) do-while

文法:do{

//循環體

}while(循環條件);

上來就先執行一次循環體,然後再進行循環條件的判斷。成立-true,繼續執行循環體,不成立,false 直接結束循環。

1:循環體是一句java 代碼,大括号可以省略。

2:循環條件後的分号 ; 必須存在。

3:do-while 至少會執行一次循環。while 有可能一次都不執行循環體。

使用的環境:

如果循環條件判斷要依賴于循環體得到的結果,那麼可以考慮使用 do-while。

但是仍然可以使用while 替代 do-while 在循環條件之前先得到一個結果。然後再判斷。

例:石頭剪刀布小遊戲

// 和計算機 石頭剪刀布,1,石頭,2,剪刀,3,布。5局3勝。循環實作。

// 分析:定義的變量:終态變量,石頭,剪刀,布, 最大的勝利的場數

import java.util.Scanner;

public class TestGame{

//終态變量,石頭,剪刀,布

final int ROCK = 1;

final int SCISSORS = 2;

final int PAPER = 3;

// 最大的勝利的場數

final int MAX_WIN_COUNT = 3;

//電腦随機的數值

int computerInput = 0;

//玩家輸入

int playerInput = 0;

//電腦勝利的次數

int computerWinCount = 0;

//玩家勝利的次數

int playerWinCount = 0;

//計數器  目前的局數

int counter = 1;

//建立一個掃描器對象接收鍵盤輸入

Scanner scanner = new Scanner(System.in);

//

while(computerWinCount < MAX_WIN_COUNT && playerWinCount < MAX_WIN_COUNT){

//局數顯式

System.out.println("********************************第 "+counter+" 局遊戲開始了*************************");

//先讓玩家輸入,提示輸入的資訊

System.out.println("請輸入您的選擇數字:[1-->石頭][2-->剪刀][3-->布]");

playerInput = scanner.nextInt();

//電腦随機一個選擇

computerInput = (int)(Math.random()*(PAPER + 1 - ROCK) + ROCK);

// 列印電腦和玩家選擇的内容

if(playerInput == ROCK){

System.out.println("玩家選擇的是【石頭】");

}else if(playerInput == SCISSORS){

System.out.println("玩家選擇的是【剪刀】");

}else if(playerInput == PAPER){

System.out.println("玩家選擇的是【布】");

}

switch(computerInput){

case ROCK:

System.out.println("電腦選擇的是【石頭】");

break;

case SCISSORS:

System.out.println("電腦選擇的是【剪刀】");

case PAPER:

System.out.println("電腦選擇的是【布】");

//比較電腦和玩家本局的結果,列印提示資訊,修改勝利的局數。

//把所有的可能的情況都羅列出來,給出對應的解決方案,

if(playerInput == ROCK){//玩家選擇的是石頭

switch(computerInput){

case ROCK:

System.out.println("本局是平局!!!");

break;

case SCISSORS:

System.out.println("本局【玩家】勝利!!!");

playerWinCount++;

case PAPER:

System.out.println("本局【電腦】勝利!!!");

computerWinCount++;

}

}else if(playerInput == SCISSORS){//玩家選擇的是剪刀

}else if(playerInput == PAPER){//玩家選擇的是布

//列印目前比分

System.out.println("目前比分【電腦】vs【玩家】 == "+ computerWinCount +" vs "+playerWinCount);

System.out.println("********************************第 "+counter++ +" 局遊戲結束了*************************");

//列印遊戲的最終結果

if(playerWinCount == MAX_WIN_COUNT){

System.out.println("【玩家】勝利了,最終比分:【電腦】vs【玩家】 == "+ computerWinCount +" vs "+playerWinCount);

System.out.println("【電腦】勝利了,最終比分:【電腦】vs【玩家】 == "+ computerWinCount +" vs "+playerWinCount);

2018-05-14 第八天