1.流程控制语句
1.1 概述
对于我们人来说有很多个需要选择的时候,对于程序来说也是这样子的。在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接的影响的。也就是说程序的流程对运行结果是有直接的影响的。所以,我们必须清楚每条语句的执行流程。而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能。
分类
- 顺序结构
- 选择结构
- 循环结构
1.2 顺序结构
1.2.1 概述
程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。总的来说,写在前面的先执行,写在后面的后执行。
1.2.2 顺序结构图
package com.study.demo;
/**
* @Auther: lds
* @Date: 2018/10/19
* @Description:
*/
public class ProcessDemo {
public static void main(String[] args) {
System.out.println("开始");
System.out.println("语句A");
System.out.println("语句B");
System.out.println("结束");
}
}
1.3 选择结构
1.3.1 概述
- 选择结构也被成为分支结构
- 选择结构有特定的语法规则,代码要执行具体的逻辑运算进行判断,逻辑运算的结果有两个,所以产生选择,按照不同的选择执行不同的代码。
- Java语言提供了两种选择结构语句
- if 语句
- switch 语句
1.3.2 选择结构 if
if 语句有三种格式
- if 语句1格式
if(关系表达式){
语句体;
}
- 执行流程
首先判断关系表达式看其结果是 true 还是 false
如果是 true 就执行语句体
如果是 false 就不执行语句体
- 流程图
package com.study.demo.ifdemo;
/**
* @Auther: lds
* @Date: 2018/10/19
* @Description:
*/
public class IfDemo01 {
public static void main(String[] args) {
System.out.println("开始");
// 定义两个变量
int a = 10;
int b = 20;
if(a==b){
System.out.println("a等于b");
}
int c = 10;
if(a==c){
System.out.println("a等于c");
}
System.out.println("结束");
}
}
- if 语句2格式
if(关系表达式){
语句体1;
}else{
语句体2;
}
- 执行流程
首先判断关系表达式看其结果是 true 还是 false
如果是 true 就执行语句体 1
如果是 false 就执行语句体 2
- 流程图
package com.study.demo.ifdemo;
/**
* @Auther: lds
* @Date: 2018/10/19
* @Description:
*/
public class IfDemo02 {
public static void main(String[] args) {
System.out.println("开始");
// 定义两个变量
int a = 100;
// 经过一系列的逻辑...最后a的值被修改成99
a = 99;
if (a % 2 == 0) {
System.out.println("a能被2整除,所以a是偶数");
}else{
System.out.println("a不能被2整除,所以a是奇数");
}
System.out.println("结束");
}
}
- if 语句3格式
if(关系表达式 1){
语句体1;
}else if(关系表达式 2 ){
语句体2;
}
......
}else if(关系表达式 n){
语句体n;
}else{
语句体n+1;
}
- 执行路程
首先判断关系表达式 1 看其结果是 true 还是 false
如果是 true 就执行语句体 1
如果是 false 就继续判断关系表达式 2 看其结果是 true 还是 false
如果是 true 就执行语句体 2
如果是 false 就继续判断关系表达式…看其结果是 true 还是 false
…
如果没有任何关系表达式为 true,就执行语句体 n+1
-
流程图
例:键盘录入学生考试成绩,判断学生等级
90-100 优秀
80-90 好
70-80 良
60-70 及格
60 以下 不及格
package com.study.demo.ifdemo;
import java.util.Scanner;
/**
* @Auther: lds
* @Date: 2018/10/19
* @Description:
*/
public class IfDemo03 {
public static void main(String[] args) {
// 创建对象
Scanner sc = new Scanner(System.in);
// 接收输入的数字
System.out.println("请输入学生考试成绩分数:");
int score = sc.nextInt();
// 应该考虑分数在0-100分,不能小于0和大于100
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("成绩不及格");
}
}
}
1.3.3 选择结构 switch
- 格式
switch(表达式){
case 目标值1;
语句体1;
break;
case 目标值2;
语句体2;
break;
......
default:
语句体n+1;
break;
}
- 格式解释
- switch 表示这是 switch 语句
- 表达式的取值:byte,short,int,char
- JDK5 以后可以是枚举
- JDK7 以后可以是 String
- switch 表示这是 switch 语句
- case 后面跟的是要和表达式进行比较的值
- 语句体部分可以是一条或多条语句
- break 表示中断,结束的意思,可以结束 switch 语句
- default 语句表示所有情况都不匹配的时候,就执行该处的内容,和 if 语句的 else
相似。 - 执行流程
- 首先计算出表达式的值
- 其次,和 case 依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程
中,遇到 break 就会结束。 - 最后,如果所有的 case 都和表达式的值不匹配,就会执行 default 语句体部分,然
后程序结束掉。
- 流程图
例:根据键盘录入的数值 1、2、3...7 输出对应的星期一、星期二、星期三...星期日
package com.study.demo.switchdemo;
import java.util.Scanner;
/**
* @Auther: lds
* @Date: 2018/10/19
* @Description:
*/
public class SwitchDemo {
public static void main(String[] args) {
// 创建键盘录入对象
Scanner sc = new Scanner(System.in);
// 接收数据
System.out.println("请输入一个数字(1-7):");
int weekday = sc.nextInt();
// 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 分支 。 如果在 case 分支语句的末尾没有 break 语句 , 那么就会接着执行下一个 case 分支语句,因为case具有穿透功能。这种情况相当危险,常常会引发错误。为此, 我们在程序中从不使用 switch 语句。
1.4 循环结构
1.4.1 概述
循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称
为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为 false,
从而结束循环,否则循环将一直执行下去,形成死循环。
1.4.2 循环语句的组成
- 循环变量初始化 (初始化表达式):
一条或者多条语句,这些语句完成一些初始化操作。 - 循环出口(布尔表达式):
这是一个 boolean 表达式,这个表达式能决定是否执行循环体。 - 循环逻辑内容(循环体):
这个部分是循环体语句,也就是我们要多次做的事情。 - 循环增量(步进表达式):
这个部分在一次循环体结束后,下一次循环判断条件执行前执行。通过用于控制循环条
件中的变量,使得循环在合适的时候结束。
1.4.3 循环结构 for
- 格式
for(初始化表达式①;布尔表达式②;步进表达式④){
循环体③
}
- 执行流程
- 执行顺序: ①②③④>②③④>②③④… ②不满足为止。
- ①负责完成循环变量初始化
- ②负责判断是否满足循环条件,不满足则跳出循环
- ③具体执行的语句
- ④循环后,循环条件所涉及变量的变化情况
- 流程图
例:在控制台输出 10 次 HelloWorld
package com.study.demo.fordemo;
/**
* @Auther: lds
* @Date: 2018/10/19
* @Description:
*/
public class ForDemo01 {
public static void main(String[] args) {
// 原始写法
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("HelloWorld");
System.out.println("-------------------------");
// 用循环改进
for (int x = 1; x <= 10; x++) {
System.out.println("HelloWorld" + x);
}
}
}
例:求出 1-5 之间数据之和
package com.study.demo.fordemo;
/**
* @Auther: lds
* @Date: 2018/10/19
* @Description:
*/
public class ForDemo02 {
public static void main(String[] args) {
// 1.定义一个初始化变量,记录累加求和,默认值为 0
int sum = 0;
// 2.使用 for 循环获取 1-5 之间的数据
for (int i = 1; i <= 5; i++) {
// 3.把每一次 for 循环获取到的数据累加起来
/*
* 第一次:sum = 0 + 1 = 1
* 第二次:sum = 1 + 2 = 3
* 第三次:sum = 3 + 3 = 6
* 第四次:sum = 6 + 4 = 10
* 第五次:sum = 10 + 5 = 15
*/
//sum = sum + i;
sum += i;
}
// 4.循环结束之后,打印累加结果
System.out.println("sum:" + sum);
}
}
例:控制台打印出所有的水仙花数
所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身。
举例:153 就是一个水仙花数。
153 = 1*1*1 + 5*5*5 + 3*3*3
package com.study.demo.fordemo;
/**
* @Auther: lds
* @Date: 2018/10/19
* @Description:
*/
public class ForDemo03 {
public static void main(String[] args) {
// 使用 for 循环获取所有的三位数
for (int i = 100; i < 1000; i++) {
// 拆分个位,十位,百位
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 10 / 10 % 10;
// 让获取到的个位,十位,百位的立方和相加和该数比较,如果相等就是水仙花数,在控制台输出
if ((ge * ge * ge + shi * shi * shi + bai * bai * bai) == i) {
System.out.println(i);
}
}
}
}
1.4.4 循环结构 while
- 格式
基本格式
while(布尔表达式) {
循环体语句;
}
- 扩展格式
初始化表达式①
while(布尔表达式②){
循环体③
步进表达式④
}
- 执行流程
- 执行顺序: ①②③④>②③④>②③④… ②不满足为止。
- ①负责完成循环变量初始化。
- ②负责判断是否满足循环条件,不满足则跳出循环。
- ③具体执行的语句。
- ④循环后,循环变量的变化情况
- 流程图
例:输出 10 次 HelloWorld
package com.study.demo.whiledemo;
/**
* @Auther: lds
* @Date: 2018/10/19
* @Description:
*/
public class WhileDemo01 {
public static void main(String[] args) {
// 使用 for 循环打印 10 次 HelloWorld
for (int i = 1; i <= 10; i++) {
System.out.println("HelloWorld");
}
System.out.println("--------------------");
// while 循环实现打印 10 次 HelloWorld
int i = 1;
while (i <= 10) {
System.out.println("HelloWorld");
i++;
}
}
}
例:求出1-100之间数据之和
package com.study.demo.whiledemo;
/**
* @Auther: lds
* @Date: 2018/10/19
* @Description:
*/
public class WhileDemo02 {
public static void main(String[] args) {
// 回顾 for 循环 求 1-100 之和
// 定义一个变量,记录累加求和
int sum = 0;
// 利用 for 循环获取 1-100 之间的数字
for (int i = 1; i <= 100; i++) {
//累加求和
sum += i;
}
// 打印求和的变量
System.out.println("1-100 的和是:" + sum);
// 使用 while 循环实现
// 定义一个变量,记录累加求和
sum = 0;
// 定义初始化表达式
int i = 1;
// 使用 while 循环让初始化表达式的值变化
while (i <= 100) {
// 累加求和
sum += i;
// 步进表达式改变变量的值
i++;
}
// 打印求和的变量
System.out.println("1-100 的和是:" + sum);
}
}
1.4.5 循环结构 do..while
- 格式
基本格式
do {
循环体语句;
}while(布尔表达式);
- 扩展格式
初始化表达式①
do{
循环体③
步进表达式④
}while(布尔表达式②);
- 执行流程
- 执行顺序: ①③④>②③④>②③④… ②不满足为止。
- ①负责完成循环变量初始化。
- ②负责判断是否满足循环条件,不满足则跳出循环。
- ③具体执行的语句
- ④循环后,循环变量的变化情况
- 流程图
例:输出10次HelloWorld
package com.study.demo.dowhiledemo;
/**
* @Auther: lds
* @Date: 2018/10/19
* @Description:
*/
public class Dowhiledemo {
public static void main(String[] args) {
// 输出 10 次 HelloWorld
/*
for(int x=1; x<=10; x++) {
System.out.println("HelloWorld");
}
*/
// do...while 改写
int x = 1;
do {
System.out.println("HelloWorld");
x++;
} while (x <= 10);
}
}
三种循环的区别
- 虽然可以完成同样的功能,但是还是有小区别:
- do…while 循环至少会执行一次循环体。
- for 循环和 while 循环只有在条件成立的时候才会去执行循环体。
- for 循环语句和 while 循环语句的小区别:
- 使用区别:控制条件语句所控制的那个变量,在 for 循环结束后,就不能再被访问到了,而 while 循环结束还可以继续使用,如果你想继续使用,就用 while,否则推荐使用 for。原因是 for 循环结束,该变量就从内存中消失,能够提高内存的使用效率。
- 循环使用推荐 for -- while -- do..while
2. 跳转控制语句
2.1 概述
我想让循环在某一步的时候结束或者跳过某些数据不要这些数据,现在就做不了这件事
情。为了弥补这个缺陷,Java 就提供了 break,continue 来实现控制语句的中断和跳转。
- break 中断
- continue 继续
2.2 Break
- break 的使用场景:
在选择结构 switch 语句中
在循环语句中
离开使用场景的存在是没有意义的
- break 的作用:
跳出单层循环
package com.study.demo;
/**
* @Auther: lds
* @Date: 2018/10/19
* @Description:
*/
public class BreakDemo {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
// 需求:打印完两次 HelloWorld 之后结束循环
if (i == 3) {
break;
}
System.out.println("HelloWorld" + i);
}
}
}
2.3 Continue
- continue 的使用场景:
在循环语句中
离开使用场景的存在是没有意义的
- continue 的作用:
单层循环对比 break,然后总结两个的区别
break 结束当前循环
continue 结束本次循环,继续下一次循环
package com.study.demo;
/**
* @Auther: lds
* @Date: 2018/10/19
* @Description:
*/
public class ContinueDemo {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
// 需求:不打印第三次 HelloWorld
if (i == 3) {
continue;
}
System.out.println("HelloWorld" + i);
}
}
}