day06_java中的流程控制语句
流程控制语句
Java提供了一些流程控制语句,来控制程序的执行流程
顺序结构
- 任何编程语言中最常见的程序结构就是顺序结构
- 顺序结构就是程序从上到下逐行地执行,中间没有任何判断和跳转
- 如果main方法的多行代码之间没有任何流程控制,则程序总是从上向下依次执行,排在前面的代码先执行,排在后面的代码后执行
执行流程图
示例
public class Demo01Sequence {public static void main(String[] args) {//顺序执行,根据编写的顺序,从上到下运行System.out.println(1);System.out.println(2);System.out.println(3);System.out.println(4);}
}
分支结构之if语句
if语句第一种格式
执行流程
- 首先判断条件表达式看其结果是true还是false
- 如果是true就执行语句体
- 如果是false就不执行语句体
- 执行后续其他代码
执行流程图
代码示例
import java.util.Scanner;/*
案例:从键盘输入年份,请输出该年的2月份的总天数。闰年2月份29天,平年28天。闰年:(1)能被4整除,不能被100整除或者(2)能被400整除*/
public class Demo03If {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("输入年份");int year = sc.nextInt();int day = 28;//判断是否是闰年if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {day++;}System.out.println(year + "年,2月" + day + "天");}
}
注意事项:
- 当 if 分支结束后 会继续向下执行
- 如果大括号控制的只有一行代码,则大括号可以省略不写。只对第一行语句有效。强烈建议大家不要省略括号,可读性不好
if语句第二种格式
执行流程
- 首先判断关系表达式看其结果是true还是false
- 如果是true就执行语句体1
- 如果是false就执行语句体2
- 执行后续代码
执行流程图
代码示例
public static void main(String[] args){// 判断给定的数据是奇数还是偶数// 定义变量int a = 1;if(a % 2 == 0) {System.out.println("a是偶数");} else{System.out.println("a是奇数");}System.out.println("结束");
}
在某些简单的应用中,if语句是可以和三元运算符互换使用的
public static void main(String[] args) {int a = 10;int b = 20;//定义变量,保存a和b的较大值int max;if(a > b) {max = a;} else {max = b;}//可以上述功能改写为三元运算符形式max = a > b ? a : b;
}
if语句第三种格式
执行流程
- 先判断条件1的值,如果为true则执行语句体1,分支结束;
- 如果为false则判断条件2的值 如果值为true就执行语句体2,分支结束;
- 如果为false则判断条件3的值 ...
- 如果没有任何条件为true,就执行else分支的语句体n+1
执行流程图
代码示例
package sgg.demo01;import java.util.Scanner;
/*
通过指定考试成绩,判断学生等级90-100 优秀80-89 好70-79 良60-69 及格60以下 不及格*/
public class Demo05If {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int score = sc.nextInt();if (score < 0 || score > 100) {System.out.println("你的成绩是错误的");} else 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 {System.out.println("你的成绩属于不及格");}}
}
if..els嵌套
在if的语句块中,或者是在else语句块中, 又包含了另外一个条件判断(可以是单分支、双分支、多分支)
执行的流程
- 如果是嵌套在if语句块中的 只有当外部的if条件满足,才会去判断内部的条件
- 如果是嵌套在else语句块中的 只有当外部的if条件不满足,进入else后,才会去判断内部的条件
示例
public class Demo06If {public static void main(String[] args) {int score =100;if (score < 0 || score > 100) {System.out.println("你的成绩是错误的");} else {if (score >= 90) {System.out.println("你的成绩属于优秀");} else if (score >= 80) {System.out.println("你的成绩属于好");} else if (score >= 70) {System.out.println("你的成绩属于良");} else if (score >= 60) {System.out.println("你的成绩属于及格");} else {System.out.println("你的成绩属于不及格");}}}
}
分支结构之switch语句
语法格式:
执行过程:
- 先执行表达式的值,拿着这个值去与case后的值进行匹配
- 匹配哪个case的值为true就执行哪个case里面的语句,遇到break就跳出switch分支
- 如果case后的值都不匹配则寻找default分支进入,不管default在哪里
注意事项
- switch(表达式)的值的类型,只能是:4种基本数据类型(byte,short,int,char),两种引用数据类型(JDK1.5之后枚举、JDK1.7之后String)
- case后面必须是常量值,而且不能重复
case的穿透性
在switch语句中,如果case的后面不写break,将出现穿透现象,也就是一旦匹配成功,不会在判断下一个case的值,直接向后运行,直到遇到break或者整个switch语句结束,switch语句执行终止。
代码示例
import java.util.Scanner;/** 需求:输入一个月份,输出该月份对应的季节。* 一年有四季* 3,4,5 春季* 6,7,8 夏季* 9,10,11 秋季* 12,1,2 冬季*/
public class Demo07Switch {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int month = sc.nextInt();switch (month) {case 3:case 4:case 5:System.out.println(month + "月是春季");break;case 6:case 7:case 8:System.out.println(month + "月是夏季");break;case 9:case 10:case 11:System.out.println(month + "月是秋季");break;case 12:case 1:case 2:System.out.println(month + "月是冬季");break;default:System.out.println("错误月份");}}
}
循环介绍
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句。我们可以通过修改循环变量使得循环判断条件为false,从而结束循环,否则循环将一直执行下去,形成死循环。
循环结构之while语句
while循环语句格式:
执行流程:
- 第一步:执行初始化语句①,完成循环变量的初始化;
- 第二步:执行循环条件语句②,看循环条件语句的值是true,还是false;
- 如果是true,执行第三步;
- 如果是false,循环语句中止,循环不再执行。
- 第三步:执行循环体语句③
- 第四步:执行迭代语句④,针对循环变量重新赋值
- 第五步:根据循环变量的新值,重新从第二步开始再执行一遍
代码示例
//需求 输出 1~100内偶数
public class Demo01While {public static void main(String[] args) {//1.起始点 初始化条件 ①int i = 1;//循环条件②while (i < 101) {//循环体③if (i % 2 == 0) {System.out.println(i);}//迭代条件④i++;}System.out.println("程序结束");}
}
循环结构之do...while语句
do...while循环语句格式
执行流程:
- 第一步:执行初始化语句①,完成循环变量的初始化;
- 第二步:执行循环体语句②;
- 第三步:执行迭代语句③,针对循环变量重新赋值;
- 第四步:执行循环条件语句④,看循环条件语句的值是true,还是false;
- 如果是true,根据循环变量的新值,重新从第二步开始再执行一遍;
- 如果是false,循环语句中止,循环不再执行。
代码示例
package sgg.demo01;import java.util.Random;
import java.util.Scanner;/*
随机生成一个100以内的数,猜数字游戏从键盘输入数,如果大了提示,大了,如果小了,提示小了,如果对了,就不再猜了,并统计一共猜了多少次*/
public class Demo03DoWhile {public static void main(String[] args) {Random random = new Random();//随机生成一个100以内的整数int i = random.nextInt(100) + 1;//声明一个变量,用来存储猜的次数int count = 0;Scanner sc = new Scanner(System.in);int number;//提升作用域do {System.out.println("输入要你要猜的数字 1 - 100");number = sc.nextInt();//输入一次,就表示猜了一次count++;//判断输入的数字和随机生成的数字if (i > number) {System.out.println("输入的数字小了");} else if (i < number) {System.out.println("输入的数字大了了");}} while (number != i);System.out.println("猜对了,一共猜了:" + count + "次");}
}
循环结构之for语句
for循环语句格式:
执行流程:
- 第一步:执行初始化语句①,完成循环变量的初始化;
- 第二步:执行循环条件语句②,看循环条件语句的值是true,还是false;
- 如果是true,执行第三步;
- 如果是false,循环语句中止,循环不再执行。
- 第三步:执行循环体语句③
- 第四步:执行迭代语句④,针对循环变量重新赋值
- 第五步:根据循环变量的新值,重新从第二步开始再执行一遍
代码示例
package sgg.demo01;/** 练习:求出1-100之间偶数和**/
public class Demo04For {public static void main(String[] args) {//定义求和变量,初始化值是0int sum = 0;//获取1-100之间的数据,用for循环实现for (int x = 1; x <= 100; x++) {//把获取到的数据进行判断,看是否是偶数if (x % 2 == 0) {sum += x;}}//输出求和结果System.out.println("sum:" + sum);}}
循环语句的区别
从循环次数角度分析
- do...while循环至少执行一次循环体语句
- for和while循环先循环条件语句是否成立,然后决定是否执行循环体,至少执行零次循环体语句
从循环变量的生命周期角度分析
- for循环的循环变量在for()中声明的,在循环语句结束后,不可以被访问;
- while和do...while循环的循环变量因为在外面声明的,所以while和do...while结束后可以被继续使用的;
如何选择
- 遍历有明显的循环次数(范围)的需求,选择for循环
- 遍历没有明显的循环次数(范围)的需求,循环while循环
- 如果循环体语句块至少执行一次,可以考虑使用do...while循环
本质上:三种循环之间是可以互相转换的,都能实现循环的功能
嵌套循环
-
所谓嵌套循环,是指一个循环的循环体是另一个循环。比如for循环里面还有一个for循环,就是嵌套循环。总共的循环次数=外循环次数*内循环次数。当然可以是三种循环任意互相嵌套。
最常见的嵌套循环格式
执行流程
代码示例
/*
输出下面图形12 23 3 34 4 4 45 5 5 5 5
*/public class Demo09ForFor {public static void main(String[] args) {for (int i = 0; i < 5; i++) {//控制几行for (int j = 0; j <= i; j++) {//控制每行多少列System.out.print(i+1+"\t");//输出具体数据}System.out.println();//换行}}
}
控制语句break
使用场景:
- 只能在switch语句和循环中使用,离开使用场景的存在是没有意义的
作用:
- 终止switch语句或者当前循环
代码示例
import java.util.Scanner;//案例:从键盘输入不断输入整数,输入0表示结束,统计一共有几个正数、负数。
public class Demo05Break {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int positive = 0;int negative = 0;while (true) {System.out.println("输入数字");int number = sc.nextInt();if (number > 0) {positive++;} else if (number < 0) {negative++;} else {break;}}System.out.println("正数个数:" + positive);System.out.println("负数个数:" + negative);}
}
我们可以使用标记指定结束哪个循环
public class Demo06Test {public static void main(String[] args) {out:for (int i = 0; i < 3; i++) {for (int j = 1; j < 4; j++) {if (j==3){break out;}System.out.print(j+"\t");}System.out.println();}}
}/*
输出结果
1 2
*/
控制语句continue
使用场景
- 只能使用在循环中
作用
- 结束本次循环,继续下一次的循环
代码示例
public class Demo07Test {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也可以配合标记使用,控制指定的循环
public class Demo08Test {public static void main(String[] args) {a: for (int i = 0; i < 5; i++) {for (int j = 0; j < 5; j++) {if (j == 2){continue a;}System.out.print(j+"\t");}System.out.println();}}
}/*
执行结果0 1 0 1 0 1 0 1 0 1 */