流程控制
下面我们来详细学习一下吧
任何编程语言中最常见的程序结构就是顺序结构。顺序结构就是程序从上到下逐行地执行,中间没有任何判断和跳转。如果main方法的多行代码之间没有任何流程控制,则程序总是从上向下依次执行,排在前面的代码先执行,排在后面的代码后执行。
顺序结构执行流程图:
代码示例
public class Demo01Sequence {
public static void main(String[] args) {
//1.顺序结构: 按照代码的书写顺序,从上而下依次执行
System.out.println("开始.....");
System.out.println("A");
System.out.println("B");
System.out.println("C");
System.out.println("结束....");
}
}
分支结构用于实现根据条件来选择性地执行某段代码。在Java语句中包括if和switch 2种语句。
if语句第一种格式: 单if
执行流程:
执行流程图
代码示例
package sgg.demo01;
/*
案例:从键盘输入年份,请输出该年的2月份的总天数。闰年2月份29天,平年28天。
闰年:
(1)能被4整除,不能被100整除 或者 能被400整除
*/
public class Demo01 {
public static void main(String[] args) {
java.util.Scanner input = new java.util.Scanner(System.in);
System.out.print("请输入年份:");
int year = input.nextInt();
int days = 28;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
days++;
}
System.out.println(year + "年的2月份共" + days + "天");
}
}
注意事项:
import java.util.Scanner;
public class Demo02Scanner {
public static void main(String[] args) {
//input是变量名
Scanner input = new Scanner(System.in);
System.out.print("年龄:");
int age = input.nextInt();
if (age >= 18)
//省略大括号,相当于只有一行语句在大括号里
System.out.println("年龄是:" + age + "成年人..");
System.out.println("好好工作..");
System.out.println("后续代码");
}
}
if语句第二种格式: if...else
执行流程:
执行流程图
代码示例
package sgg.demo01;
public class Demo02 {
public static void main(String[] args) {
int a = 10;
int b = 20;
//定义变量,保存a和b的较大值
int max;
if(a > b) {
max = a;
} else {
max = b;
}
System.out.println(max);
//可以上述功能改写为三元运算符形式
max = a > b ? a : b;
System.out.println(max);
}
}
注意事项:
public class Demo02If {
public static void main(String[] args) {
//input是变量名
Scanner input = new Scanner(System.in);
System.out.print("年龄:");
int age = input.nextInt();
if (age >= 18)
System.out.println("成年人");
System.out.println("出去工作..");
else{
System.out.println("未成年人,好好读书");
}
System.out.println("后续代码");
}
}
if语句第三种格式: if...else if ...else
执行流程
执行流程图
代码示例
import java.util.Scanner;
/*
需求:
小明快要期末考试了,小明爸爸对他说,会根据他不同的考试成绩,送他不同的礼物,
假如你可以控制小明的得分,请用程序实现小明到底该获得什么样的礼物,并在控制台输出。
奖励规则:
95~100 山地自行车一辆 包含95和100的 数学中表示方式: [95,100] 不包含95和100: (95,100)
90~94 游乐场玩一次 包含90和94的
80~89 变形金刚玩具一个 包含80和89的
80以下 胖揍一顿 不包含80分的
*/
public class Demo03{
public static void main(String[] args) {
//1.创建键盘录入Scanner类的对象
Scanner sc = new Scanner(System.in);
//2.获取一个0-100之间的整数数字(代表小明的考试成绩),保存到int变量score中
System.out.println("请输入一个0-100之间的整数数字(代表小明的考试成绩): ");
int score = sc.nextInt();
//3.因为score中的数字有多种(大于3)情况,所以使用if语句的第三种格式进行判断,并输出不同的结果内容
if (score >= 95 && score <= 100) {
System.out.println("奖励山地自行车一辆");
} else if (score >= 90 && score <= 94) {
System.out.println("奖励游乐场玩一次");
} else if (score >= 80 && score <= 89) {
System.out.println("奖励变形金刚玩具一个");
} else if (score >= 0 && score < 80) {
System.out.println("奖励胖揍一顿");
} else { //隐藏条件: score<0 || score>100
System.out.println("您输入的成绩错误,是火星来的吧,哥屋恩...");
}
System.out.println("main....end....");//模拟格式中的其它语句
}
}
注意事项
if..else嵌套
执行的特点:
代码示例
package sgg.demo01;
import java.util.Scanner;
//从键盘输入一个年份,和月份,输出该年份该月的总天数
public class Demo04 {
public static void main(String[] args) {
//从键盘输入一个年份,和月份
Scanner input = new Scanner(System.in);
System.out.print("年份:");
int year = input.nextInt();
System.out.print("月份:");
int month = input.nextInt();
if (year > 0) {
if (month >= 1 && month <= 12) {
//全部合法的情况
int days;
if (month == 2) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
days = 29;
} else {
days = 28;
}
} else if (month == 4 || month == 6 || month == 9 || month == 11) {
days = 30;
} else {
days = 31;
}
System.out.println(year + "年" + month + "月有" + days + "天");
} else {
//年份合法,月份不合法的情况
System.out.println("月份输入不合法");
}
} else {
//年份不合法的情况
System.out.println("年份输入不合法");
}
}
}
语法格式:
执行流程:
执行流程图
代码演示
package demo03;
public class SwitchDemo01 {
public static void main(String[] args) {
//定义指定的星期
int weekday = 5;
//switch语句实现选择
switch (weekday) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
case 5:
System.out.println("星期五");
break;
case 6:
System.out.println("星期六");
break;
case 7:
System.out.println("星期日");
break;
default:
System.out.println("你的数字有误");
break;
}
}
}
注意事项:
case的穿透性
执行步骤:
代码示例
import java.util.Scanner;
/*
需求:
一年有12个月,分属于春夏秋冬4个季节,
键盘录入一个月份,请用程序实现判断该月份属于哪个季节,并输出。
演示效果
输入: 1、2、12 输出:冬季
输入: 3、4、5 输出:春季
输入: 6、7、8 输出:夏季
输入: 9、10、11 输出:秋季
输入: 其它数字 输出:数字有误
*/
public class SwitchDemo02 {
public static void main(String[] args) {
//1.创建键盘录入Scanner类的对象
Scanner sc = new Scanner(System.in);
//2.获取键盘录入的一个1-12的整数数字(代表月份),保存到int变量month中
System.out.println("请输入一个1-12的整数数字(代表月份): ");
int month = sc.nextInt();
//3.因为month中的数字有12+1中情况,使用switch语句对month中的值,进行判断,并输出不同的结果
switch (month) {//9
case 1:
case 2:
case 12:
System.out.println("冬季");
break;
case 3:
case 4:
case 5:
System.out.println("春季");
break;
case 6:
case 7:
case 8:
System.out.println("夏季");
break;
case 9:
case 10:
case 11:
System.out.println("秋季");
break;
default:
System.out.println("您输入的月份不存在,哪个星球来的,哥屋恩...");
break;
}
System.out.println("main....end....");//模拟格式中的其它语句
}
}
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成死循环。循环的意义就是用来解决重复的事情..
循环组成
格式
执行流程
第一步:执行初始化语句①,完成循环变量的初始化;
第二步:执行循环条件语句②,看循环条件语句的值是true,还是false;
如果是true,执行第三步;
如果是false,循环语句中止,循环不再执行。
第三步:执行循环体语句③
第四步:执行迭代语句④,针对循环变量重新赋值
第五步:根据循环变量的新值,重新从第二步开始再执行一遍
图解分析:
注意事项:
代码示例
/*
需求:
在控制台输出所有的“水仙花数”及总个数
解释:什么是水仙花数?
水仙花数,指的是一个三位数,个位、十位、百位的数字立方和等于原数
例如 153 3*3*3 + 5*5*5 + 1*1*1 = 27 + 125 + 1 = 153
*/
public class Demo03For {
public static void main(String[] args) {
//1.定义int变量count,初始值0,作用是统计水仙花数字的个数
int count = 0;
//2.使用for循环遍历获取所有的三位数字,每个数字保存到int变量num中
for (int num = 100; num <= 999; num++) {
//2.1计算num中数字的个位,十位,百位 分别保存到3个int变量ge(个位),shi(十位),bai(百位)中
int ge = num % 10;//个位
int shi = num / 10 % 10;//十位
int bai = num / 100 % 10;//百位
//2.2计算个位,十位,百位数字的立方和,保存到int变量sum中
//2.3判断如果三位数字num 等于 每位数字的立方和sum
if ((ge * ge * ge + shi * shi * shi + bai * bai * bai) == num) {
//输出该数字num
System.out.println(num);
//同时计数器count的值增加1
count++;
}
}
//3.for循环结束后,打印count的值
System.out.println("水仙花数字总共有: " + count + " 个");
}
}
格式:
执行流程:
第一步:执行初始化语句①,完成循环变量的初始化;
第二步:执行循环条件语句②,看循环条件语句的值是true,还是false;
如果是true,执行第三步;
如果是false,循环语句中止,循环不再执行。
第三步:执行循环体语句③
第四步:执行迭代语句④,针对循环变量重新赋值
第五步:根据循环变量的新值,重新从第二步开始再执行一遍
图解分析
注意事项:
代码示例
package demo04;
/*
需求:世界最高山峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸,它的厚度
是0.1毫米。请问,我折叠多少次,可以折成珠穆朗玛峰的高度?
*/
public class Demo05While {
public static void main(String[] args) {
//定义一个计数器,初始值为0
int count = 0;
//定义纸张厚度
double paper = 0.1;
//定义珠穆朗玛峰的高度
int zf = 8844430;
//因为要反复折叠,所以要使用循环,但是不知道折叠多少次,这种情况下更适合使用while循环
// 折叠的过程中当纸张厚度大于珠峰就停止了,因此继续执行的要求是纸张厚度小于珠峰高度
while (paper <= zf) {
//循环的执行过程中每次纸张折叠,纸张的厚度要加倍
paper *= 2;
//在循环中执行累加,对应折叠了多少次
count++;
}
//打印计数器的值
System.out.println("需要折叠:" + count + "次");//需要折叠:27次
}
}
格式:
注意事项:
执行流程:
第一步:执行初始化语句①,完成循环变量的初始化;
第二步:执行循环体语句②;
第三步:执行迭代语句③,针对循环变量重新赋值;
第四步:执行循环条件语句④,看循环条件语句的值是true,还是false;
如果是true,根据循环变量的新值,重新从第二步开始再执行一遍;
如果是false,循环语句中止,循环不再执行。
代码示例
/*
输入密码和确认密码,如果两次密码一致则显示注册成功,两次密码不一致则提示重新输入
*/
Scanner input = new Scanner(System.in);
String pwdOne = "";
String pwdTwo = "";
do{
System.out.println("请输入密码");
pwdOne = input.next();
System.out.println("请输入确认密码");
pwdTwo = input.next();
if(!pwdOne.equals(pwdTwo)){
System.out.println("两次密码不一致,请重新输入");
}
}while(!pwdOne.equals(pwdTwo));
System.out.println("注册成功");
从循环次数角度分析
从循环变量的生命周期角度分析
如何选择
本质上:三种循环之间是可以互相转换的,都能实现循环的功能
三种循环结构都具有四要素:
也就是循环中的条件永远为true,死循环的是永不结束的循环。
死循环格式:
/*
(1)for循环的死循环格式
for(;;){循环体}
(2)while循环的死循环格式
while(true){循环体}
(3)do-while循环的死循环格式
do{
循环体
}while(true);
*/
使用场景
代码示例
public class Demo01Break {
public static void main(String[] args) {
System.out.println("顾客获取到了购买的四个包子..........");
for (int num = 1; num <= 4; num++) {
/*
当num的值为2时,num == 2 --> true,if后面()中是true,执行if后面{}中的内容,
首先: 执行输出语句
其次: 执行break,一旦执行break,本次循环的循环体中break后面的代码不再执行,
剩余次数的循环也不再执行,直接从循环中跳出到循环后面的其它代码继续执行
*/
if (num == 2) {
System.out.println("发现2号包子上有个大家伙(小强),2号(及剩余所有)包子不能吃了,找老板投诉");
break;
}
System.out.println("顾客吃第" + num + "个包子......");
}
System.out.println("顾客投诉: 这是神马包子,岂有此理.老板: 非常抱歉,赔偿100000元~~~~~");
}
}
图解分析:
案例:
//从键盘输入不断输入整数,输入0表示结束,统计一共有几个正数、负数。
public class Demo02Break {
public static void main(String[] args) {
java.util.Scanner input = new java.util.Scanner(System.in);
int positive = 0;
int negative = 0;
while (true) {
System.out.print("请输入整数(0)结束:");
int num = input.nextInt();
if (num == 0) {
break;
} else if (num > 0) {
positive++;
} else {
negative++;
}
}
System.out.println("正数:" + positive + ",负数:" + negative);
}
}
循环标号:
import java.util.Scanner;
public class Test {
/* 需求:程序运行后,用户可多次查询星期对应的减肥计划,直到输入0,程序结束
步骤:
1. 不明确用户操作几次, 使用死循环包裹业务逻辑
2. 匹配到0的时候,使用break结束循环死循环
*/
public static void main(String[] args) {
lo:
while (true) {
System.out.println("请输入您要查看的星期数:");
System.out.println("(如无需继续查看,请输入0退出程序)");
// 1. 键盘录入星期数据,使用变量接收
Scanner sc = new Scanner(System.in);
int week = sc.nextInt();
// 2. 多情况判断,采用switch语句实现
switch (week) {
// 3. 在不同的case中,输出对应的减肥计划
case 0:
System.out.println("感谢您的使用");
break lo;
case 1:
System.out.println("跑步");
break;
case 2:
System.out.println("游泳");
break;
case 3:
System.out.println("慢走");
break;
case 4:
System.out.println("动感单车");
break;
case 5:
System.out.println("拳击");
break;
case 6:
System.out.println("爬山");
break;
case 7:
System.out.println("好好吃一顿");
break;
default:
System.out.println("您的输入有误");
break;
}
}
}
}
使用场景:
代码示例
package demo05;
public class Demo03Continue {
public static void main(String[] args) {
System.out.println("顾客获取到了购买的四个包子..........");
for (int num = 1; num <= 4; num++) {
/*
当num的值为2时,num == 2 --> true,if后面()中是true,执行if后面{}中的内容,
首先: 执行输出语句
其次: 执行continue,一旦执行continue,本次循环的循环体中continue后面的代码不再执行,
继续执行下一次循环的步进表达式
总结: continue的作用提前结束本次循环,继续进行下一次循环
*/
if (num == 2) {
System.out.println("把第2个包子弄脏了,不能吃第2个包子了,继续吃其它包子...");
continue;
}
System.out.println("顾客吃第" + num + "个包子......");
}
System.out.println("找老板结账,交钱400块,老板说: 欢迎下次光临....");
}
}
图解分析:
案例:
public class Demo04Continue {
public static void main(String[] args) {
//打印1-100之间的整数,跳过7的倍数和7结尾的数
for (int i = 1; i <= 100; i++) {
if (i % 7 == 0 || i % 10 == 7) {
continue;
}
System.out.println(i);
}
}
}
如果需要告诉continue提前结束指定的循环,继续进行下一次循环,可以给其起一个标号,使用方式和break是一样的。这里代码就不演示了。。
for循环相互嵌套格式
嵌套循环执行流程:
图解分析:
代码示例
public class Demo05ForFor {
public static void main(String[] args) {
//打印2021年至2023年月份
// 年份是外循环,3年;月份是内循环,12月
for (int i = 2021; i <= 2023; i++) {
for (int j = 1; j <= 12; j++) {
//不换行打印星号
System.out.print(i + "年" + j + "月 ");
}
//内循环打印12个月后,需要一次换行
System.out.println();
}
}
}