一、 分支选择:
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);
}
}
}