Java 流程控制
一、程序流程控制概述
程序的流程控制一般分为3种:顺序结构、分支结构、循环结构。
- 顺序结构:就是不加任何控制,代码从main开始自上而下的执行。
- 分支结构:就是根据条件判断是true还是false,有选择性的执行哪些代码。在Java语言中提供了两个格式if 、 switch。
- 循环结构:就是控制某一段代码重复执行。在Java语言中提供了三种格式,for、while、do-while。
二、分支结构
1、if分支
if它的作用,是用于对条件进行判断,判断的结果只可能有两个值true或者false,然后根据条件判断的结果来决定执行哪段代码。
1.1 if分支的格式
在Java中,if分支有三种格式:
1.2.1 if 第一种形式
if 第一种形式执行流程如下:
如果 条件表达式 为true,就执行下面的语句体
如果 条件表达式 为false,就不执行
// 需求:测量用户体温,发现体温高于37度就报警。
double t = 36.9;
if(t > 37){
System.out.println("这个人的温度异常,把他赶紧带走~~");
}
1.2.2 if 第二种形式
if 第二种形式执行流程如下:
如果 条件表达式 为true,就执行下面的语句体1
如果 条件表达式 为false,就执行else下面的语句体2
// 需求2:发红包,你的钱包余额是99元,现在要发出90元
// 如果钱够触发发红包的动作,如果钱不够,则提示:余额不足。
double money = 19;
if(money >= 90){
System.out.println("发红包成功了~");
}else {
System.out.println("余额不足~~");
}
1.2.3 if 第三种形式
if 第三种形式执行流程如下:
如果 条件表达式1 为true,就执行下面的代码1;
如果 条件表达式1 为false,就继续判断条件表达式2;如果 条件表达式2 为true,就执行下面的语句体;
如果 条件表达式2 为false,就继续判断条件语句体3;如果 条件表达式3 为true,就执行下面的语句体3
如果 条件表达式3 为false,就继续判断后面的表达式;….
如果前面所有条件表达式判断都为false,就执行最后的else语句中的代码
// 需求3:某个公司有一个绩效系统,根据员工的打分输出对应的绩效级别。[0,60) D [60,80) C [80,90) B [90,100] A
int score = 298;
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("您录入的分数有毛病~~");
}
注意事项:
- if的()后面不能写分号;,否则if下面的语句与if无关
- if后面的大括号,如果只有一行代码,大括号可以省略
1.2.4 总结
2、switch分支
switch分支的作用,是通过比较值来决定执行哪条分支代码。
2.1 switch分支的执行流程
需求:做个电子备忘录,在控制台分别输出周一到周五的工作安排
周一:埋头苦干,解决bug
周二: 请求大牛程序员帮忙
周三:今晚啤酒、龙虾、小烧烤
周四:主动帮助新来的女程序解决bug
周五:今晚吃鸡
周六:与王婆介绍的小芳相亲
周日:郁郁寡欢、准备上班。
public class SwitchDemo1 {
public static void main(String[] args) {
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("数据有误!");
}
}
}
2.2 switch的注意事项
- 表达式类型只能是byte、short、int、char。JDK5开始支持枚举,JDK7开始支持String,不支持double、float、double。
- case给出的值不允许重复,且只能是字面量,不能是变量。
- 正常使用switch的时候,不要忘记写break,否则会出现穿透现象。
1. 演示switch语句匹配的数据类型
2. 演示case后面的值,只能是字面量不能是变量
3. 演示case穿透现象
当switch语句中没有遇到break,就会直接穿透到下一个case语句执行,直到遇到break为止。
这种语法设计也是有它的用处的,当多个case语句想要执行同一段代码时,可以利用case穿透现象,提高代码复用性。
public class SwitchDemo2 {
public static void main(String[] args) {
// 需求:用户输入月份可以展示该月份的天数。
// 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("数据有误!");
}
}
}
2.3 if、switch如何选择
如果单从功能上来讲,if 分支 的功能是更加强大的,switch分支能做的事情if 分支都能做。但是具体用哪一种分支形式,也是有一些使用原则的。
- 如果是对一个范围进行判断,建议使用if分支结构
- 如果是与一个一个的值比较的时候,建议使用switch分支结构
三、循环结构
循环结构可以控制一段代码重复执行。循环结构有for循环、while循环、do-while循环。
1、for循环
为了让大家更直观的理解for循环的执行流程,我们直接来看具体的案例代码。
比如:我们想要在控制台打印输出3个HelloWorld
public class ForDemo1 {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
System.out.println("Hello World");
}
}
}
如下图所示,是按照下面的① ② ③ ④, ② ③ ④… 的顺序来执行的;
当②条件为true时,再依次执行③④代码,然后回到②继续判断
当②条件为false时,就结束循环
for循环格式
for (初始化语句; 循环条件; 迭代语句) {
循环体语句(重复执行的代码);
}初始化语句:一般是定义一个变量,并给初始值
循环条件:一般是一个关系表达式,结果必须是true或者false
迭代语句:用于对条件进行控制,一般是自增或者自减
循环语句体:需要重复执行的代码
1.1 for循环案例
案例1:求和
public class ForTest1 {
public static void main(String[] args) {
// 需求:计算1-5的和
// 2、定义一个整数变量用于累加数据求和
int sum = 0;
// 1、定义一个for循环找到 1 2 3 4 5
for (int i = 1; i <= 5 ; i++) {
// i = 1 2 3 4 5
// 3、把循环的数据累加给sum变量
/**
等价于: sum = sum + i
i == 1 sum = 0 + 1
i == 2 sum = 1 + 2
i == 3 sum = 3 + 3
i == 4 sum = 6 + 4
i == 5 sum = 10 + 5
*/
sum += i;
}
System.out.println("1-5的和是:" + sum);
}
}
案例2:求奇数和
public class ForTest2 {
public static void main(String[] args) {
// 需求:求1-0的奇数和
// 3、定义一个求和的变量 累加奇数和
int sum = 0;
// 1、定义一个循环找到 1 2 3...10
for (int i = 1; i <= 10; i++) {
// i 1 2 3 4 5 6 7 8 9 10
// 2、筛选出奇数
if(i % 2 == 1){
// i = 1 3 5 7 9
sum += i;
}
}
// 4、输出求和变量即可
System.out.println("1-10的奇数和是:" + sum);
System.out.println("-------------------");
// 2、定义一个求和的变量 累加奇数和
int sum1 = 0;
// 1、定义循环找到 1 3 5 7 9
for (int i = 1; i <= 10; i+=2) {
// i = 1 3 5 7 9
sum1 += i;
}
// 3、输出求和变量即可
System.out.println("1-10的奇数和是:" + sum1);
}
}
案例3:找水仙花数
public class ForTest3 {
public static void main(String[] args) {
// 需求:找出水仙花数并输出
// 在循环外定义一个变量用于记录水仙花的个数
int count = 0;
// 1、定义一个for循环找出全部三位数
for (int i = 100; i <= 999; i++) {
// 2、判断这个三位数是否满足要求
// i = 157
// 个位
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++;
}
}
System.out.println(); // 换行!
System.out.println("水仙花个数是:" + count);
}
}
2、while循环
格式:
需求:打印5行HelloWorld
public class WhileDemo1 {
public static void main(String[] args) {
int i = 0;
while (i < 5) {
// i = 0 1 2 3 4
System.out.println("Hello World");
i++;
}
}
}
2.1 while循环案例
/**
* 需求:
* 珠穆朗峰高度是8848860 纸张厚度 0.1 折叠纸张直到不低于珠穆朗峰位置,求折叠几次
*/
public class WhileTest7 {
public static void main(String[] args) {
// 1、定义变量记录山峰的高度和纸张的厚度
double peakHeight = 8848860;
double paperThickness = 0.1;
// 3、定义一个变量用于记录纸张折叠的次数
int count = 0;
// 2、定义while循环控制纸张进行折叠
while (paperThickness < peakHeight) {
// 把纸张进行折叠,把纸张的厚度变成原来的2倍
paperThickness *= 2;
count++;
}
System.out.println("折叠的次数:" + count);
System.out.println("纸张的最终厚度:" + paperThickness);
}
}
3、do-while循环
格式和流程:
如下图所示:do-while循环的执行流程,是按照① ②③④ ②③④… 的顺序执行的。
我们会发现,do-while循环的特点是先执行,再判断的。即使条件不成立,也会先执行一次。
public class DoWhileDemo1 {
public static void main(String[] args) {
// 需求:打印多行Hello World
int i = 0;
do {
System.out.println("Hello World");
i++;
}while (i < 3);
}
}
4、三种循环的总结
- for循环 和 while循环(先判断后执行);
do…while (先执行后判断)2.for循环和while循环的执行流程是一模一样的,
功能上无区别,for能做的while也能做,反之亦然。
如果已知循环次数建议使用for循环,如果不清楚要循环多少次建议使用while循环。3 for循环中控制循环的变量只在循环中使用
while循环中,控制循环的变量在循环后还可以继续使用
public class DoWhileDemo2 {
public static void main(String[] args) {
/**
* 三种循环的区别小结:
* for循环和while循环是先判断后执行,do while循环是先执行后判断
* for循环和while循环的执行流程是一模一样的,功能上无区别,for能做的,while也能做,反之亦然。
*/
for (int j = 0; j < 3; j++) {
System.out.println("Hello World");
}
for (int j = 0; j < 3; j++) {
System.out.println("Hello World");
}
int n = 0;
while (n < 3){
System.out.println("Hello World");
n++;
}
System.out.println(n);
}
}
5、死循环
所谓死循环就是停不下来的循环。
三种死循环的格式:
for死循环
for ( ; ; ){
System.out.println(“Hello World1”);
}while死循环
while (true) {
System.out.println(“Hello World2”);
}do-while死循环
do {
System.out.println(“Hello World3”);
}while (true);
public class EndLessLoopDemo {
public static void main(String[] args) {
// for ( ; ; ) {
// System.out.println("Hello World~~~~");
// }
// 经典写法
// while (true) {
// System.out.println("我是快乐的死循环~~~~");
// }
// do{
// System.out.println("我是快乐的死循环~~~~");
// }while (true);
System.out.println("-----------------------------");
// 1、定义正确的密码
int okPassword = 520;
// 2、定义一个死循环让用户不断的输入密码认证
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请您输入正确的密码:");
int password = sc.nextInt();
// 3、使用if判断密码是否正确
if(password == okPassword){
System.out.println("登录成功了~~~");
break; // 可以理解结束当前所在循环的执行的
}else {
System.out.println("密码错误!");
}
}
}
}
6、嵌套循环
所谓循环嵌套,就是一个循环中又包含另一个循环(就是常说的,套娃^_^),下面我们通过案例代码演示一下。
循环嵌套执行流程:外部循环每循环一次,内部循环会全部执行完一轮。
i=0时; i<3为true; 进入循环
//j的取值从0到5,执行一轮,打印5次”我爱你”
for(int j = 1; j <= 5; j++) {
System.out.println(“我爱你:” + i);
}
内层循环执行完之后,执行外层的i++; i的值1i=1时:i<3为true; 进入循环
//j的取值从0到5,又执行一轮,打印5次”我爱你”
for(int j = 1; j <= 5; j++) {
System.out.println(“我爱你:” + i);
}
内层循环执行完之后,执行外层的i++; i的值2i=2时:i<3为true; 进入循环
//j的取值从0到5,再执行一轮,打印5次”我爱你”
for(int j = 1; j <= 5; j++) {
System.out.println(“我爱你:” + i);
}
内层循环执行完之后,执行外层的i++; i的值3i=3时:i<3为false; 外层循环结束
需求:在控制台使用 * 打印出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(); // 换行
}
}
}
7、跳转语句break、continue
如果我们想要在循环过程中提前跳出循环,就需要用到跳转语句break、continue两个关键字。
- break作用:跳出并结束当前所在循环的执行。
continue作用:结束本次循环,进入下一次循环。
public class BreakAndContinueDemo11 {
public static void main(String[] args) {
// 1、break:跳出并结束当前循环。
// 场景:假如你又有老婆了,然后你犯错了,你老婆罚你做5天家务,每天都是洗碗。
// 但是洗碗到第三天后心软了 原谅你了不用洗了
for (int i = 0; i < 5; i++) {
System.out.println("快乐的洗碗~~~~");
if(i == 2) {
break; // 跳出并结束当前循环的执行~~
}
}
// 2、continue:跳出当前循环的当次执行,进入循环的下一次
// 场景:假如你又有老婆了,然后你犯错了,你老婆罚你做5天家务,
// 每天都是洗碗。但是洗碗到第三天后心软了 原谅你了不用洗了 但是依然不解恨 继续洗第4天 5天
for (int i = 1; i <= 5 ; i++) {
if(i == 3){
continue; // 立即跳出当次执行,进入循环的下一次!
}
System.out.println("洗碗:" + i);
}
}
}
注意:break和continue不是任何地方都可以使用的。
四、生成随机数
1、如何产生一个随机数
生成随机数的功能,其实Java已经给我们提供了,在JDK中提供了一个类叫做Random,我们只需要调用Random这个类提供的功能就可以了。
// 目标:掌握使用Random生成随机数的步骤。
// 1、导包。import java.util.Random; (idea会自动完成)
import java.util.Random;
public class RandomDemo1 {
public static void main(String[] args) {
// 2、创建一个Random对象,用于生成随机数。
Random r = new Random();
// 3、调用Random提供的功能:nextInt得到随机数。
for (int i = 1; i <= 20; i++) {
int data = r.nextInt(10); // 0 - 9
System.out.println(data);
}
}
}
2、案例:猜数字小游戏
需求:
随机生成一个1-100之间的数据,提示用户猜测,猜大提示过大,猜小提示过小,直到猜中 结束游戏分析:
1.先随机生成一个1-100之间的数据。
谁可以帮你生成随机数啊? 是不是要用到Random?2.定义一个死循环让用户可以一直猜测。
用户猜的数据从哪里来啊? 是不是要用到Scanner?3.在死循环里,每次让用户录入的数据和随机数进行比较
如果比随机数大:提示猜大了
如果比随机数小:提示猜小了
如果和随机数相同:提示恭喜你猜中了
import java.util.Random;
import java.util.Scanner;
public class RandomTest2 {
public static void main(String[] args) {
// 1、随机产生一个1-100之间的数据,做为中奖号码。
Random r = new Random();
int luckNumber = r.nextInt(100) + 1;
// 2、定义一个死循环,让用户不断的猜测数据
Scanner sc = new Scanner(System.in);
while (true) {
// 提示用户猜测
System.out.println("请您输入您猜测的数据:");
int guessNumber = sc.nextInt();
// 3、判断用户猜测的数字与幸运号码的大小情况
if(guessNumber > luckNumber){
System.out.println("您猜测的数字过大~~");
}else if(guessNumber < luckNumber){
System.out.println("您猜测的数字过小~~");
}else {
System.out.println("恭喜您,猜测成功了,可以买单了~~");
break; // 结束死循环
}
}
}
}
还没有评论,来说两句吧...