程序流程控制
01 程序流程控制课程介绍
顺序结构 —>> 程序默认流程
分支结构 —>> If、switch
循环结构 —>> for、while、do…while
02 分支结构:if、switch、switch穿透性
1、If分支的写法有几种,各有什么特点?
格式1:
if (条件表达式) {
语句体;
}
格式2:
if (条件表达式) {
语句体1;
} else {
语句体2;
}
格式3:
if (条件表达式1) {
语句体1;
} else if (条件表达式2) {
语句体2;
} else if (条件表达式3) {
语句体4;
}
. . .
else {
语句体n+1;
}
//格式1 if(条件表达式){代码...}
//心跳60 - 100之间是正常的,否则提示进一步检查
int heartBeat = 90;
if(heartBeat < 60 || heartBeat > 100) {
System.out.println("您的心跳数据是:" + heartBeat + ",您可能需要进一步检查!");
}
System.out.println("检查结束");
//格式2 if(条件表达式){代码...}else{代码...}
//发红包
double money = 1;
//发送一个1314;
if(money >= 1314) {
System.out.println("您当前发送红包成功~~~");
}else {
System.out.println("您自己都没钱,就别发了~~~");
}
//格式3 if(条件表达式){代码...}else if(条件表达式){代码...}} ...else{代码...}}
//绩效系统:0-60 C 60-80 B 80-90 A 90-100 A+
int score = 99;
if(score >= 0 && score < 60) {
System.out.println("您本月的绩效是:C");
}else if(score >= 60 && score < 80) {
System.out.println("您本月的绩效是:B");
}else if(score >= 80 && score < 90) {
System.out.println("您本月的绩效是:A");
}else {
System.out.println("您本月的绩效是:A+");
}
2、switch分支的格式、执行流程是怎么样的?
switch(表达式){
case 值1:
执行代码1;
break;
case 值2:
执行代码2;
break;
…
case 值n-1:
执行代码n-1;
break;
default:
执行代码n;
// break;
}
3、if、switch分支各自适合做什么业务场景?
if其实在功能上远远强大于switch
if适合做区间匹配
switch适合做:值匹配的分支选择、代码优雅
String weekday = "周八";
switch (weekday){
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("数据有误!");
break;
}
4、switch分支注意事项
- 表达式类型只能是byte、short、int、char,JDK5开始支持枚举,JDK7开始支持String、不支持double、float、long
- case给出的值不允许重复,且只能是字面量,不能是变量
- 不要忘记写break,否则会出现穿透现象
5、什么情况下会出现switch穿透现象?
case中没有写break
6、switch穿透性能解决什么问题?
存在多个case分支的功能代码是一样时,可以用穿透性把流程集中到同一处处理,这样可以简化代码
// 需求:用户输入月份可以展示该月份的天数。
// 1、3 、5、 7 、 8、 10、 12月份是 31天
// 2月份是闰年为29天、非闰年为28天。
// 4 、6 、9、 11月份 是30天
int month = 7;
switch (month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
System.out.println(month + "月是31天!");
break;
case 2:
System.out.println(month + "月闰年为29天,非闰年为28天!");
break;
case 4:
case 6:
case 9:
case 11:
System.out.println(month + "月是30天!");
break;
default:
System.out.println("数据有误!");
}
03 循环结构:for循环、求和、水仙花数
1、for循环格式和执行流程是什么样的?
for (初始化语句 ; 循环条件; 迭代语句) {
循环体语句;
}
// 输出3次HelloWorld
for (int i = 0; i < 3; i++) {
System.out.println("Hello World");
}
2、如何实现元素求1-5的和?
// 需求:求1-5之间的数据和,并把求和结果在控制台输出
int sum = 0;
// 使用循环控制输出1-5
for (int i = 0; i <= 5; i++) {
// 在循环外定义变量sum累加数据
sum += i;
}
// 控制台输出结果
System.out.println("1-5之间的数据和是:" + sum);
3、如何实现求奇数和?
方式一:在for循环中,通过if筛选出奇数
// 需求:求1-10之间的奇数和,并把求和结果在控制台输出。
int sum = 0;
for (int i = 1; i <= 10; i++) {
if (i % 2 == 1) sum += i;
}
System.out.println("1-10之间的奇数和是:" + sum);
方式二:直接使用for循环找出奇数
int sum1 = 0;
for (int i = 1; i <= 10; i+=2) {
sum1 += i;
}
System.out.println("1-10之间的奇数和是:" + sum1);
4、如何找出水仙花数?
// 需求:在控制台输出所有的“水仙花数”
// 定义一个for循环从“100一直到999”
for (int i = 100; i <= 999; i++) {
// 每次访问到数据后,提取该数据的:个位、十位、百位数字
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 100;
// 看各个数的立方和是否等于原数,等于则输出原数据
if((ge * ge * ge + shi * shi * shi + bai * bai * bai) == i){
System.out.print(i + "\t");
}
}
5、 如何计算出水仙花的个数?
每输出水仙花数时,让count++
// 需求:在控制台输出所有的“水仙花数”
// 在循环外定义一个变量count用于记录水仙花数
int count = 0
// 定义一个for循环从“100一直到999”
for (int i = 100; i <= 999; i++) {
// 每次访问到数据后,提取该数据的:个位、十位、百位数字
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 100;
// 看各个数的立方和是否等于原数,等于则输出原数据
if((ge * ge * ge + shi * shi * shi + bai * bai * bai) == i){
System.out.print(i + "\t");
// 每输出水仙花数时,让count++
count++;
}
}
System.out.println();
System.out.println("水仙花的个数是:" + count);
04 循环结构:while循环、珠穆朗玛峰案例
1、while循环的格式,执行流程是怎么样的?
初始化语句;
while (循环条件) {
循环体语句;
迭代语句;
}
//输出三次Hello World
int i = 0;
while (i < 3) {
System.out.println("Hello World");
i++;
}
System.out.println("------------------");
//死循环
int j = 0;
while (j < 3) {
System.out.println("Hello World");
}
2、什么时候用for循环,什么时候用while循环?
功能上是完全一样的,for能解决的while也能解决,反之亦然
使用规范是:
知道循环几次:使用for;
不知道循环几次建议使用:while
3、怎么解决珠穆朗玛峰案例?
// 需求:世界最高山峰是珠穆朗玛峰(8848.86米=8848860毫米)
// 假如我有一张足够大的纸,它的厚度是0.1毫米。
// 请问,折叠多少次,可以折成珠穆朗玛峰的高度?
// 定义变量存储珠穆朗玛峰的高度、纸张的高度
double peakHeight = 8848860;
double paperThickness = 0.1;
// 循环外定义计数变量
int count = 0;
// 使用while循环,循环条件是(纸张厚度<山峰高度)
while(paperThickness < peakHeight){
// 内部控制纸张折叠,每折叠一次,纸张厚度为原来两倍
paperThickness *= 2;
// 每折叠依次让该变量+1
count++;
}
System.out.println("折叠的次数:" + count);
System.out.println("纸张的最终厚度:" + paperThickness);
4、for和while使用总结
其实while能做的for都能实现
但是如果一开始不知道循环次数的情况下,建议使用while循环解决更专业
05 循环结构:do-while循环,三种循环的总结
1、do-while循环的格式,执行流程是怎么样的?
先执行再判断循环条件
初始化语句;
do {
循环体语句;
迭代语句;
} while (循环条件);
int i = 0;
do {
System.out.println(“Hello World!");
i++;
} while( i < 3);
do-while循环的特点:一定会先执行一次循环体
2、三种循环的区别
for循环 和 while循环(先判断后执行)
do…while (第一次先执行后判断)
3、for 和 while 的区别:
for循环和while循环的执行流程是一模一样的
如果已知循环次数建议使用for循环,如果不清楚要循环多少次建议使用while循环
for循环中,控制循环的变量只在循环中可以使用;While循环中,控制循环的变量在循环后还可以继续使用
int i = 0;
while (i < 3) {
System.out.println("Hello World");
i++;
}
System.out.println(i);
for (int i = 0; i < 3; i++ ) {
System.out.println("Hello World");
}
System.out.println(i); //报错,找不到变量i
06 死循环、循环嵌套、break、continue
1、死循环可以怎么写?
for(;;) {
}
//经典写法
while(true) {
}
do {
} while (true);
2、密码验证案例实现
package com.itheima.type;
import java.util.Scanner;
public class TypeDemo1 {
public static void main(String[] args) {
// 需求:系统密码是520,请用户不断的输入密码验证,验证不对输出
// 密码错误,验证成功输出欢迎进入系统,并停止程序
int okPassword = 520;
Scanner sc = new Scanner(System.in);
// 使用while死循环,让用户不断输入数据
while(true){
System.out.println("请输入正确的密码:");
int password = sc.nextInt();
if(password == okPassword){
// 验证成功输出欢迎进入系统
System.out.println("密码正确,欢迎进入系统!");
// 并使用break结束当前循环的执行
break;
}else{
// 与密码比对:验证不成功输出密码错误
System.out.println("密码错误!");
}
}
}
}
3、循环嵌套
package com.itheima.type;
public class TypeDemo1 {
public static void main(String[] args) {
// 需求:在控制台使用 * 打印出4行5列的矩形
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 5; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
4、跳转关键字:break、continue
break : 跳出并结束当前所在循环的执行
continue: 用于跳出当前循环的当次执行,进入下一次循环
break : 只能用于结束所在循环, 或者结束所在switch分支的执行
continue : 只能在循环中进行使用
package com.itheima.type;
public class TypeDemo1 {
public static void main(String[] args) {
// 罚做5天家务,第三天心软了,就不用洗了
for (int i = 0; i < 5; i++) {
System.out.println("洗碗干活中~~~");
if(i == 2){
break;
}
}
System.out.println("------------------------");
// 罚做5天家务,第三天心软了,就不用洗了,仍然不解恨,第4、5天继续洗
for (int i = 0; i < 5; i++) {
if(i == 2){
continue;
}
System.out.println("洗碗干活中~~~" + i);
}
}
}
07 案例技术:Random类,猜数游戏
1、Random随机数类生成需要几步,具体是什么样的?
package com.itheima.type;
// 1、导包:告诉程序去JDK的哪个包中找随机数技术
import java.util.Random;
public class TypeDemo1 {
public static void main(String[] args) {
// 2、写一行代码代表得到随机数对象
Random r = new Random();
for (int i = 0; i < 10; i++) {
// 3、调用随机数的功能获取0-9的随机数
int number = r.nextInt(10) + 1;
System.out.println("随机生成了:" + number);
}
}
}
2、Random随机数如何生成 65 – 91之间的随机数?
65 – 91 ---->> (0 - 26)+ 65 ---->> 27 + 65
int number = r.nextInt(27) + 65;
3、猜数字游戏
package com.itheima.type;
import java.util.Random;
import java.util.Scanner;
public class TypeDemo1 {
public static void main(String[] args) {
// 需求:随机生成一个1-100之间的数据
// 提示用户猜测,猜大提示过大,猜小提示过小,直到猜中结束游戏
Random r = new Random();
int data = r.nextInt(100) + 1;
Scanner sc = new Scanner(System.in);
while (true){
System.out.println("请输入您猜测的数据(1-100):");
int guessData = sc.nextInt();
if(guessData > data) System.out.println("您猜测的数据大了!");
else if(guessData < data) System.out.println("您猜测的数据小了!");
else{
System.out.println("恭喜您,猜中了,可以去买单了~~~");
break;
}
}
}
}