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
}else if(条件-2){

//代码块-3
}else if(条件-2){

//代码块-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{

public static void main(String[] args){

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;

if(isCritical){

System.out.println("本次伤害为【暴击】伤害!伤害值为:"+damage +"\t剩余血量为:"+hp);

}else{

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

}

//输出人是否over了

if(hp > 0){

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

}else{

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

}

}

}

 

4.switch:多分支选择语句。

 

switch:开关。

 

语法:比较多见的形式:

 

switch(表达式-1){

case 常量表达式:

//任意行的java 代码

break;

case 常量表达式:

//任意行的java 代码

break;

case 常量表达式:

//任意行的java 代码

break;

...

default:

//任意行的java 代码

break;

}

 

解释:

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{

public static void main(String[] args){

final int MIN = 0;

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');

break;

case 6:

case 7:

System.out.println('C');

break;

default:

System.out.println('D');

break;

}

}

}

 

二、循环--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{

public static void main(String[] args){

// 需求:有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;

final int MAX = 101;

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{

public static void main(String[] args){

//终态变量,石头,剪刀,布

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("电脑选择的是【剪刀】");

break;

case PAPER:

System.out.println("电脑选择的是【布】");

break;

}

//比较电脑和玩家本局的结果,打印提示信息,修改胜利的局数。

//把所有的可能的情况都罗列出来,给出对应的解决方案,

if(playerInput == ROCK){//玩家选择的是石头

switch(computerInput){

case ROCK:

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

break;

case SCISSORS:

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

playerWinCount++;

break;

case PAPER:

System.out.println("本局【电脑】胜利!!!");

computerWinCount++;

break;

}

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

switch(computerInput){

case ROCK:

System.out.println("本局【电脑】胜利!!!");

computerWinCount++;

break;

case SCISSORS:

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

break;

case PAPER:

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

playerWinCount++;

break;

}

}else if(playerInput == PAPER){//玩家选择的是布

switch(computerInput){

case ROCK:

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

playerWinCount++;

break;

case SCISSORS:

System.out.println("本局【电脑】胜利!!!");

computerWinCount++;

break;

case PAPER:

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

break;

}

}

//打印当前比分

System.out.println("当前比分【电脑】vs【玩家】 == "+ computerWinCount +" vs "+playerWinCount);

System.out.println("********************************第 "+counter++ +" 局游戏结束了*************************");

}

//打印游戏的最终结果

if(playerWinCount == MAX_WIN_COUNT){

System.out.println("【玩家】胜利了,最终比分:【电脑】vs【玩家】 == "+ computerWinCount +" vs "+playerWinCount);

}else{

System.out.println("【电脑】胜利了,最终比分:【电脑】vs【玩家】 == "+ computerWinCount +" vs "+playerWinCount);

}

}

}

 

阅读更多

没有更多推荐了,返回首页