第09章 流程控制
流程控制
在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。也就是说,程序的流程对运行结果 有直接的影响。所以,我们必须清楚每条语句的执行流程。而且,很多时候我们要通过控制语句的执行顺序来实现 我们要完成的功能。
第01章 顺序结构
执行顺序:写在前面的先执行,写在后面的后执行
public class DemoSequence {
public static void main(String[] args) {
System.out.println("AAA");
System.out.println("BBB");
System.out.println("CCC");
}
}
第02章 判断语句
1.0 if语句第一种格式
if语句第一种格式:单if语句
if(关系表达式){
语句体
}
1.1 执行流程
1、首先判断关系表达式看其结果是true还是false
2、如果是true就执行语句体
3、如果是false就不执行语句体
1.2 注意
1、关系表达式无论简单还是复杂,结果必须是boolean类型
2、if语句控制的语句体如果是一条语句,大括号可以省略;如果是多条语句,就不能省略。建议永远不要省略。
3、一般来说:有左大括号就没有分号,有分号就没有左大括号
1.3 使用场景
针对结果是boolean类型的判断
针对一个范围的判断
针对几个常量值的判断
public class Demo01If {
public static void main(String[] args) {
System.out.println("AAA");
int age = 16;
if(age >= 18){
System.out.println("BBB");
System.out.println("CCC");
System.out.println("DDD");
}
System.out.println("EEE");
}
}
2.0 if语句第二种格式
if语句第二种格式:标准的if else语句
if(关系表达式) {
语句体1;
}else {
语句体2;
}
2.1 执行流程
1、首先判断关系表达式看其结果是true还是false
2、如果是true就执行语句体1
3、如果是false就执行语句体2
public class Demo02If {
public static void main(String[] args) {
int num = 20;
if(num % 2 == 0){
System.out.println("偶数");
}else{
System.out.println("奇数");
}
}
}
3.0 if语句第三种格式
if语句第三种格式: if…else if …else
if (判断条件1) {
执行语句1;
} else if (判断条件2) {
执行语句2;
}
...
}else if (判断条件n) {
执行语句n;
} else {
执行语句n+1;
}
执行流程首先判断关系表达式1看其结果是true还是false
1、如果是true就执行语句体1
2、如果是false就继续判断关系表达式2看其结果是true还是false
3、如果是true就执行语句体2
4、如果是false就继续判断关系表达式…看其结果是true还是false
…
n、如果没有任何关系表达式为true,就执行语句体n+1。
练习
x和y的关系满足如下:
x>=3 y = 2x + 1;
‐1<=x<3 y = 2x;
x<=‐1 y = 2x – 1;
根据给定的x的值,计算出y的值并输出。
public class Demo03If {
public static void main(String[] args) {
int x = 10;
int y;
if(x >= 3){
y = 2 * x + 1;
}else if(-1 <= x && x<3){
y = 2*x;
} else {
y = 2*x - 1;
}
System.out.println("y:"+y);
}
}
4.0 练习
指定考试成绩,判断学生等级
90-100 优秀
80-89 好
70-79 良
60-69 及格
60以下 不及格
public class DemoPractice {
public static void main(String[] args) {
int score = 59;
if(score >= 90 && score <=100){
System.out.println("优秀");
} else if( score >= 80 && score <90){
System.out.println("好");
} else if( score >= 70 && score < 80){
System.out.println("良");
} else if (score >= 60 && score < 70)
{
System.out.println("及格");
} else if(score < 60) {
System.out.println("不及格");
} else{
System.out.println("数据错误");
}
}
}
5.0 if语句和三元运算符的互换
使用三元运算符和标准的if else语句分别实现:取两个数的最大值
public class Demo04If {
public static void main(String[] args) {
int a = 105;
int b = 20;
// 使用三元运算符
// int max = a > b ? a : b;
int max;
if( a>b ){
max = a;
} else {
max = b;
}
System.out.println("max:"+max);
}
}
第03章 选择语句
选择语句–switch
1.0 switch语句格式
switch(表达式) {
case 常量值1:
语句体1;
break;
case 常量值2:
语句体2;
break;
...
default:
语句体n+1;
break;
}
2.0 执行流程
1、首先计算出表达式的值
2、其次,和case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结 束。
3、最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。
3.0 注意事项
1、多个case后面的数值不可以重复
2、switch后小括号内的数据类型只能是以下类型:
基本类型:byte short int char
引用类型:String 字符串 enum 枚举
3、switch语句格式可以很灵活:前后顺序可以颠倒,匹配到哪个执行哪个,直到遇到break或执行结束
4、在switch语句中,如果case的后面不写break,将出现穿透现象,也就是不会在判断下一个case的值,直接向后运行,直到遇到break,或者整体switch结束。
4.0 使用场景
针对几个常量值的判断
//给定数字 判断是星期几
public class DemoSwitch {
public static void main(String[] args) {
int num = 3;
switch(num){
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 4:
System.out.println("星期四");
break;
case 3:
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;
}
}
}
第04章 循环语句
1.0 循环概述
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成死循环。
循环语句的组成,一般可以分为4各部分:
1、初始化语句,在循环开始最初执行,而且只做唯一一次
2、条件判断:如果成立,则循环继续,如果不成立,则退出循环
3、循环体:重复要做的事情,若干行语句.
4、步进语句:每次循环之后要进行的扫尾工作,每次循环之后都执行一次
2.0 循环语句1–for
2.1 for循环语句格式
for(初始化表达式①; 布尔表达式②; 步进表达式④){
循环体③
}
2.2 执行流程
执行顺序:①②③④>②③④>②③④…②不满足为止。
①负责完成循环变量初始化
②负责判断是否满足循环条件,不满足则跳出循环
③具体执行的语句
④循环后,循环条件所涉及变量的变化情况
2.3 注意
判断条件语句的结果是一个boolean类型
循环体语句如果是一条语句,大括号可以省略;如果是多条语句,大括号不能省略。建议永远不要省略。
一般来说:有左大括号就没有分号,有分号就没有左大括号
/**
需求:计算1-100之间的偶数和
*/
public class TestFor {
public static void main(String[] args) {
// 声明变量计数
int sum = 0;
for (int i = 1; i<=100; i++)
{
// 判断是否为偶数
if (i % 2 == 0)
{
sum += i;
}
}
System.out.println("sum:"+sum);
}
}
3.0 循环语句2–while
3.1 while循环语句格式
初始化表达式①
while(布尔表达式②){
循环体③
步进表达式④
}
3.2 执行流程
执行顺序:①②③④>②③④>②③④…②不满足为止。
①负责完成循环变量初始化。
②负责判断是否满足循环条件,不满足则跳出循环。
③具体执行的语句。
④循环后,循环变量的变化情况。
public class DemoWhile {
public static void main(String[] args) {
int i = 1;
while(i<=10){
System.out.println("Hello World!");
i++;
}
}
}
4.0 循环语句3–do…while
4.1 do…while循环格式
初始化表达式①
do{
循环体③
步进表达式④
}while(布尔表达式②);
4.2 执行流程
执行流程执行顺序:①③④>②③④>②③④…②不满足为止。
①负责完成循环变量初始化。
②负责判断是否满足循环条件,不满足则跳出循环。
③具体执行的语句
④循环后,循环变量的变化情况
4.3 注意
do…while循环的特点:无条件执行一次循环体,即使我们将循环条件直接写成false,也依然会循环一次。
这样的循环具有一定的风险性,因此初学者不建议使用do…while循环。
public class DemoDoWhile {
public static void main(String[] args) {
//for循环
for (int i = 11; i <= 10; i++)
{
System.out.println("AAA" + i);
}
System.out.println("===================");
//do while循环
int i = 11;
do{
System.out.println("BBB" + i);
i++;
}while(i <= 10);
}
}
5.0 循环语句的区别
1、如果条件判断从来没有满足过,那么for循环和while循环将会执行0次,但是do-while循环至少执行一次
2、for循环的变量在小括号中定义,只有循环内部才可以使用。
while循环和do-while循环的初始化语句在外面,出循环之后还可以使用。
3、在已知循环次数的时候使用推荐使用for,循环次数未知的时推荐使用while。
注意:
写程序优先考虑for循环,再考虑while循环,最后考虑do…while循环。
public class DemoQuBie {
public static void main(String[] args) {
for (int i = 1; i<10; i++)
{
System.out.println("I: "+ i);
}
// System.out.println("I: "+ i);
int i = 11;
do{
System.out.println("对不起..."+i);
i++;
}while(i<=10);
System.out.println("I: "+ i);
}
}
6.0 跳出语句
6.1 break关键字
使用场景:终止switch或者循环
1.用在switch语句中,一旦执行,整个switch语句立刻结束。
2.用在循环语句中,一旦执行,整个循环立刻结束。
public class DemoBreak {
public static void main(String[] args) {
for (int i = 1; i<10; i++)
{
if (i == 4) // 如果i是4就不执行
{
break;
}
System.out.println("Hello "+i);
}
}
}
6.2 Continue关键字
使用场景:结束本次循环,继续下一次的循环
public class DemoContinue {
public static void main(String[] args) {
for (int i = 1; i<10; i++)
{
if (i == 4) // 如果i是4就跳过本次循环,执行下次循环
{
continue;
}
System.out.println("Hello "+i);
}
}
}
第05章 扩展知识点
1.0 死循环
死循环:也就是循环中的条件永远为true,死循环的是永不结束的循环。例如:while(true){}。
在后期的开发中,会出现使用死循环的场景,例如:我们需要读取用户输入的输入,但是用户输入多少数据我们并 不清楚,也只能使用死循环,当用户不想输入数据了,就可以结束循环了,如何去结束一个死循环呢,就需要使用 到跳出语句了。
public class DemoDeadLoop {
public static void main(String[] args) {
while(true){
System.out.println("AAA");
}
}
}
2.0 嵌套循环
所谓嵌套循环,是指一个循环的循环体是另一个循环。比如for循环里面还有一个for循环,就是嵌套循环。总 共的循环次数=外循环次数*内循环次数
2.1 嵌套循环格式
for(初始化表达式①; 循环条件②; 步进表达式⑦) {
for(初始化表达式③; 循环条件④; 步进表达式⑥) {
执行语句⑤;
}
}
2.2 嵌套循环执行流程
执行顺序:①②③④⑤⑥>④⑤⑥>⑦②③④⑤⑥>④⑤⑥
外循环一次,内循环多次。
public class DemoForFor {
public static void main(String[] args) {
for (int hour = 0; hour < 24; hour++)
{
for (int minute = 0; minute<60; minute++)
{
System.out.println(hour+"点"+minute+"分");
}
}
}
}
3.0 扩展
3.1 水仙花数
需求:在控制台输出所有的“水仙花数”
解释:什么是水仙花数?
水仙花数是指一个三位数,个位 十位 百位的数字立方和等于原数。
例如:153 333 + 555 + 111 = 153
思路:
1.获取所有的三位数,准备进行筛选,最小的三位数100,最大的是999,使用for循环获取。
2.获取每一个三位数的个位 十位 百位,用if判断是否水仙花数。
public class PraticeShuiXianHua {
public static void main(String[] args) {
for (int i = 100; i<1000; 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.println(i);
}
}
}
}
3.2 珠穆朗玛峰
需求:
世界最高的山峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸,他的厚度是0.1毫米。请问,折叠多少次,可以折成珠穆朗玛峰的高度?
分析:
因为要反复折叠,所以要使用循环,但是不知道要折叠多少次,这种情况下适合用while循环。
折叠过程中,当纸张的厚度大于珠穆朗玛峰的高度就停止,因此循环执行的要求是纸张厚度小于珠峰高度。
public class Pratice02WhileTest {
public static void main(String[] args) {
// 定义变量 计数器 初始值为0
int count = 0;
// 定义纸张厚度
double paper = 0.1;
// 定义珠峰高度
int zhuMountain = 8844430;
while(paper <= zhuMountain){
// 折纸 每次折纸,纸张的厚度要加倍
paper *= 2;
// 在循环中次数累加
count++;
}
System.out.println("需要折叠:"+ count +" 次");
}
}