一、
分支選擇: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 elseif(條件-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);
