程序控制结构
0x01 流程控制介绍
流程控制分为顺序结构、分支结构、循环结构三种类型。if适合做区间匹配,switch适合做值匹配。知道循环几次用for,不知道则用while。跳转语句有break(结束当前所在的循环或者switch分支)和continue(跳过本次循环,进入下一次循环)。
0x02 顺序结构
程序默认的执行流程,代码从上往下执行。
0x03 分支结构
1、if分支
if分支根据判定的结果(真或假)决定执行某个分支的代码,If分支有如下3种格式
下面分别演示其3种格式的if分支
public class IfDemo1 {
public static void main(String[] args) {
double t = 38.9;
if (t > 37) {
System.out.println("这个人温度异常,把他赶紧带走");
}
}
}
public class IfDemo2 {
public static void main(String[] args) {
double money = 99;
if (money > 90) {
System.out.println("发红包成功了");
} else {
System.out.println("余额不足");
}
}
}
public class IfDemo3 {
public static void main(String[] args) {
int score = 78;
if (score >= 0 && score < 60) {
System.out.println("您的绩效成绩为: D");
} else if (score >= 60 && score < 80) {
System.out.println("您的绩效成绩为: C");
} else if (score >= 80 && score < 90) {
System.out.println("您的绩效成绩为: B");
} else if (score >= 90 && score < 100) {
System.out.println("您的绩效成绩为: A");
} else {
System.out.println("您录入的分数不正确");
}
}
}
2、switch分支
switch分支也是匹配条件去执行分支, 适合做值匹配的分支选择,结构清晰,格式良好
public class SwitchDemo {
public static void main(String[] args) {
String week = "周六";
switch (week) {
case "周一":
System.out.println("埋头苦干,解决bug");
break;
case "周二":
System.out.println("请求大牛程序员帮忙");
break;
case "周三":
System.out.println("今晚啤酒、龙虾、小烧烤");
break;
case "周四":
System.out.println("主动帮助新来的女程序解决bug");
break;
case "周五":
System.out.println("今晚吃鸡");
break;
case "周六":
System.out.println("与王婆介绍的小芳相亲");
break;
case "周日":
System.out.println("郁郁寡欢、准备上班。");
break;
default:
System.out.println("您输入的星期信息肯定是不存在的~~");
}
}
}
switch分支的注意事项:
表达式类型只能是byte、short、int、char,JDK5开始支持枚举,JDK7开始支持String、不支持double、float、long。
case给出的值不允许重复,且只能是字面量,不能是变量。
不要忘记写break,否则会出现穿透现象。
3、小总
1)if、switch分支各自适合做什么业务场景?
if其实在功能上远远强大于switch。if适合做区间匹配。switch适合做:值匹配的分支选择、代码优雅。
2)什么情况下会出现switch穿透现象?
case中没有写break。
3)switch穿透性能解决什么问题?
存在多个case分支的功能代码是一样时,可以用穿透性把流程集中到同一处处理,这样可以简化代码。
0x04 循环结构
1、for循环
示例执行的流程:
循环一开始,执行int i = 0 一次。
然后判断循环条件:0 < 3 返回true ,进入到循环体中执行输出 :helloWorld ,然后执行迭代语句i++ , 此时i=1了。
然后判断循环条件:1 < 3 返回true ,进入到循环体中执行输出 :helloWorld ,然后执行迭代语句i++ , 此时i=2了。
然后判断循环条件:2 < 3 返回true ,进入到循环体中执行输出 :helloWorld, 然后执行迭代语句i++ , 此时i=3了。
然后判断循环条件:3 < 3 返回false, 循环立即结束!!
2、while循环
3、do-while循环
do-while循环的特点就是先执行后判断,一定会先执行一次循环体
4、三种循环的区别小结
for循环 和 while循环(先判断后执行)
do...while (第一次先执行后判断)
for循环和while循环的执行流程是一模一样的。如果已知循环次数建议使用for循环,如果不清楚要循环多少次建议使用while循环。
for循环中,控制循环的变量只在循环中可以使用。While循环中,控制循环的变量在循环后还可以继续使用。
5、死循环
死循环:一直循环的执行下去,如果没有干预不会停止下来。
//死循环第一种写法
public class EndLessLoopDemo1 {
public static void main(String[] args) {
for (; ; ) {
System.out.println("Hello World");
}
}
}
//死循环第二种写法,经典写法,建议用此方法比较规范
public class EndLessLoopDemo2 {
public static void main(String[] args) {
while (true) {
System.out.println("Hello World");
}
}
}
//死循环第三种写法
public class EndLessLoopDemo3 {
public static void main(String[] args) {
do {
System.out.println("Hello World");
}
while (true);
}
}
案例需求:系统密码是520,请用户不断的输入密码验证,验证不对输出:密码错误,验证成功输出:欢迎进入系统,并停止程序。
//定义一个整型变量记录正确的密码:520
//使用while死循环,让用户不断输入数据,与正确密码比对:验证不成功输出:密码错误、验证成功输出:欢迎进入系统,并使用break结束当前循环的执行。
6、循环嵌套
循环嵌套:循环中又包含循环,外部循环每循环一次,内部循环全部执行完一次。
//假如你有老婆,你犯了错,你老婆罚你连续3天,每天说5句我爱你
public class LoopNestedDemo {
public static void main(String[] args) {
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 5; j++) {
System.out.println("我爱你" + i);
}
System.out.println("----------------------");
}
}
}
案例需求:在控制台使用 * 打印出4行5列的矩形
public class LoopNestedDemo {
public static void main(String[] args) {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 5; j++) {
System.out.print("*"); //不换行
}
System.out.println(); //换行
}
}
}
0x05 跳转关键字
1、break
break跳出并结束当前所在循环并执行,只能用于结束所在循环, 或者结束所在switch分支的执行。
public class BreakAndContinueDemo10 {
public static void main(String[] args) {
// 目标:理解break 和 continue的作用。
// 场景:假如你又有老婆了,然后你犯错了,你老婆罚你做5天家务,每天都是洗碗。
// 但是洗碗到第三天后心软了 原谅你了不用洗了
for (int i = 0; i < 5; i++) {
System.out.println("快乐的洗碗~~~~");
if(i == 2) {
break; // 跳出并结束当前循环的执行~~
}
}
// continue 跳出当前循环的当次执行,进入循环的下一次
// 场景:假如你又有老婆了,然后你犯错了,你老婆罚你做5天家务,
// 每天都是洗碗。但是洗碗到第三天后心软了 原谅你了不用洗了 但是依然不解恨 继续洗第4天 5天
for (int i = 1; i <= 5 ; i++) {
if(i == 3){
continue; // 立即跳出当次执行,进入循环的下一次!
}
System.out.println("洗碗:" + i);
}
2、continue
用于跳出当前循环的当次执行,进入下一次循环,只能在循环中进行使用。
public class BreakAndContinueDemo11 {
public static void main(String[] args) {
// 目标:理解break和continue操作外部循环。
// 场景:假如你有老婆,你老婆罚你说3天,每天5句我爱你,但是说到第二天的第3句就心软了,以后都不用说了!
OUT:
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 5; j++) {
System.out.println("我爱你~~");
if(i == 2 && j == 3){
break OUT; // 指定跳出外部循环,并结束外部循环了!
}
}
System.out.println("-----------------");
}
System.out.println("====================================================");
// continue可以指定结束外部循环的当次执行,进入外部循环的下一次执行
// 场景:假如你有老婆,你老婆罚你说3天,每天5句我爱你,但是说到第二天的第3句就心软了,当天
// 不用说了,但是依然不解恨,第3天还是要说的。
OUT:
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 5; j++) {
System.out.println("我爱你~~");
if(i == 2 && j == 3){
continue OUT;
}
}
System.out.println("-----------------");
}
}
}
3、random的使用
import java.util.Random;
public class RandomDemo1 {
public static void main(String[] args) {
// 目标:学会使用Java提供的随机数类Random
// 1、导包
// 2、创建随机数对象
Random r = new Random();
// 3、调用nextInt功能(方法)可以返回一个整型的随机数给你
for (int i = 0; i < 20; i++) {
int data = r.nextInt(10); // 0 - 9 不包含10的(包前不包后)
System.out.println(data);
}
System.out.println("-----------------------");
// 1 - 10 ==> -1 ==> (0 - 9) + 1
int data = r.nextInt(10) + 1;
System.out.println(data);
// 3 - 17 ==> -3 ==> (0 - 14) + 3
int data1 = r.nextInt(15) + 3;
System.out.println(data1);
}
}
案例需求:Random随机数如何生成 65 – 91之间的随机数
65 – 91 => (0 - 26)+ 65
int number = r.nextInt(27) + 65;
//random自带功能
案例需求:随机生成一个1-100之间的数据,提示用户猜测,猜大提示过大,猜小提示过小,直到猜中结束游戏
import java.util.Random;
import java.util.Scanner;
public class RamdomTest2 {
public static void main(String[] args) {
// 1、随机一个幸运号码 1- 100之间 (0 - 99) + 1
Random r = new Random();
int luckNumber = r.nextInt(100) + 1;
// 2、使用一个死循环让用户不断的去猜测,并给出提示
Scanner sc = new Scanner(System.in);
while (true) {
// 让用户输入数据猜测
System.out.println("请您输入猜测的数据(1-100):");
int guessNumber = sc.nextInt();
// 3、判断这个猜测的号码与幸运号码的大小情况
if(guessNumber > luckNumber){
System.out.println("您猜测的数据过大~");
}else if(guessNumber < luckNumber){
System.out.println("您猜测的数据过小");
}else {
System.out.println("恭喜您,猜中了,可以去买单了~~~");
break; // 直接跳出并结束当前死循环!!
}
}
}
}