在这里插入代码片
2、流程控制
2.1、什么是流程控制
2.1.1、程序的执行结构
-
顺序结构:
- 代码从上往下,依次执行。
- 是程序执行的基本结构。
-
分支结构:
- 程序运行到某一个节点,出现了多种继续执行的可能性。通过指定的条件,来决定程序往哪一个方向执行。
-
循环结构
-
某一段代码需要被重复执行多次。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FrL7b7M6-1582718328637)(C:\Users\Administrator\Desktop\捕获.PNG)]
-
2.1.2、流程控制的简介
使用指定的控制语句,修改程序的执行结构。
流程控制语句,按照修改的程序执行结构来分,可以分为:分支流程控制语句 (switch)和 循环流程(for、)控制语句。
其中,分支流程控制语句,最常用的是: if-else 和 switch-case
循环流程控制语句,最常用的是: for 和 while
2.2、分支流程控制 - if else
2.2.1、基础语法
语法:
if (condition) {
// 代码段1
}
else {
// 代码段2
}
语法说明:
1、 condition:是一个boolean变量,或者是一个boolean结果的表达式。
2、 如果condition为true,则代码段1执行
如果condition为false,则代码段2执行
3、 可以只有if,没有else。但是不能没有if,只写else。
// 1. 流程控制之 if-else
// 需求:做一个简单的分支结构,如果天气好,就出去玩;否则就回教室学习。
boolean flag = true;
if (flag) {
System.out.println("明天可以出去玩");
}
else {
System.out.println("回教室学习");
}
// 需求:判断一个字符是不是一个小写字母,如果是,则将其转成大写输出;否则就输出“不是小写字母”
char c = 'H';
// 判断一个字符是不是一个小写字母
if (c >= 'a' && c <= 'z') {
System.out.println(c -= 32);
}
else {
System.out.println("不是小写字母");
}
// 需求:判断一个字符是不是一个数字字符,如果是,将其表示的数字输出,例如:'1' => 1;否则输出“不是数字字符”
char c1 = '2';
if (c1 >= '0' && c1 <= '9') {
System.out.println(c1 - '0');
}
else {
System.out.println("不是数字字符");
}
2.2.2、实现多分支
if-else只能做两个分支,如果需要实现多分支,就需要对if-else进行嵌套。
语法特性:
if-else语句中,如果代码段中的代码只有一句。则这个大括号可以省略。
如果需要使用if-else做多分支,可以使用 else if 语法
if (contion1) {
}
else if (condition2) {
}
else if (condition3) {
}
...
else {
}
int score = 7;
if (score < 0 || score > 100) {
System.out.println("错误成绩");
}
else if (score < 60) {
System.out.println("不及格");
}
else if (score < 70) {
System.out.println("中");
}
else if (score < 80) {
System.out.println("良");
}
else if (score < 90) {
System.out.println("优");
}
else {
System.out.println("秀");
}
2.3、分支流程控制 - switch case
2.3.1、基础语法
switch (variable) {
case value1:
case value2:
...
default:
}
语法说明:
1、variable:是一个变量,可以是任意的类型。但是,不能是浮点型。
2、执行逻辑:检测变量variable的值,如果和某一个case匹配上了,则执行这个case后面的语句。如果变量variable的值没有和任意的一个case匹配上,则执行default之后的语句。
3、default不是必须的。
2.3.2、穿透性
switch-case语句具有穿透性。如果switch的变量的值,和某一个case匹配上了,则会执行从这个case开始往后所有的语句,会向下穿透。并且,在向下穿透的时候,不会和后面的case进行匹配。
穿透性,是一把双刃剑,有利有弊。
任何规避穿透性:使用关键字break;
switch中,程序在向下穿透执行的时候,如果遇到break,会结束穿透,立即停止这个switch。
int season = 1;
switch (season) {
case 1:
System.out.println("春天");
break;
case 2:
System.out.println("夏天");
break;
case 3:
System.out.println("秋天");
break;
case 4:
System.out.println("冬天");
break;
default:
System.out.println("错误的季节");
break;
}
2.3.3、switch和if的区别
switch语句和if语句,都能实现分支结构。那么在用到分支的时候,该如何选择?
通过条件选择:
如果分支的条件,是一个区间。这种情况下,使用if-else;
如果分支的条件,是一个确切的值。这种情况下,可以使用switch-case,也可以使用if-else。
2.4、循环流程控制 - for
2.4.1、循环的要素
实例:小明在操场上跑步,跑1000米。这个过程,其实就是一个循环。
循环的起点:
每一个循环都需要找到一个循环的起点。这个条件是必不可少的,如果没有这个条件,将无法开始一个循环。
循环的条件:
循环其实是一个重复判断条件成立的过程,如果条件成立,则代码段需要重复执行。
循环的步长:
循环中,一定需要维护一个变量,来控制循环的次数。每一次的循环,一定要适当的修改这个变量值。
2.4.2、循环的使用场景
某一个代码段需要被多次执行,并且多次执行之间是有一定的规律的。
2.4.3、for循环的基础语法
for (循环起点; 循环条件; 循环步长) {
// 循环体
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B5o95cmM-1582718328640)(./images/for.png)]
// 实例:在控制台输出1到100之间的每一个数字
for (int n = 1; n <= 100; n++) {
System.out.println(n);
}
// 实例:计算 1+2+3+4+5+...+100 的和
int sum = 0;
for (int n = 1; n <= 100; n++) {
sum += n;
}
System.out.println(sum);
// 实例:在控制台输出1到100之间所有的偶数
for (int i = 1; i <= 100; i++) {
if (i % 2 == 0) {
System.out.println(i);
}
}
for (int i = 2; i <= 100; i += 2) {
System.out.println(i);
}
// 实例:判断一个数字是不是质数
// 质数:如果一个数字,只能够被1和他自己整除,那么这个数字就是一个质数。最小的质数是2
int number = 17;
boolean flag = true; // 假设所有的数字都是质数
for (int i = 2; i <= number / 2; i++) {
if (number % i == 0) {
flag = false;
break;
}
}
if (flag) {
System.out.println("是一个质数");
}
else {
System.out.println("不是一个质数");
}
高级的语法:
for的小括号中,包含有三部分内容。每一部分的内容都可以省略。
但是,分号不能省略。
int i = 1;
for (;;) {
System.out.println(i);
if (++i > 100) {
break;
}
}
2.5、循环流程控制 - while
2.5.1、while循环的基础语法
也是实现循环结构的常见的语法。while的基础语法如下:
while (condition) {
// 循环体
}
语法说明:
1、condition:是一个boolean类型的变量,或者是boolean结果的表达式。
2、执行逻辑:判断条件condition是否成立,如果成立,执行循环体,再判断;如果不成立,结束循环。
// 使用while循环的综合案例:
int n = 1;
while (n <= 100) {
System.out.println(n++);
}
2.5.2、while和for循环的使用场景
- 如果循环的次数非常明确,建议使用for循环。
- 如果循环的次数不明确,但是循环的条件非常明确,推荐使用while循环。
// 计算一个十进制数字有多少位?
// 12345 -> 1234 -> 123 -> 12 -> 1 -> 0
int number = 127338274;
int count = 0; // 记录位数
while (number != 0) {
number /= 10;
count++;
}
System.out.println(count);
2.5.3、do-while
do-while循环和while循环基本是一样的。语法如下:
do {
// 循环体
} while(condition);
语法说明:
先执行一次循环体,再判断循环条件是否成立。如果条件成立,继续执行循环体;如果条件不成立,结束循环。
如果初始的condition是false,则do-while比while多执行一次循环体。
2.6、循环控制
2.6.1、continue
写在循环体中,如果循环在执行的过程中遇到了continue,则立即停止本次的循环,进入下次的循环。
// continue: 小明在操场上跑100米,当跑到50米的时候,看到地上有个坑,跳过这个坑继续跑。
for (int meter = 0; meter <= 100; meter++) {
if (meter == 50) {
System.out.println("诶呀,上次我是不是摔在这里了?");
// 立即停止本次的循环,开始下一次的循环
continue;
}
System.out.println("小明在跑步,跑了" + meter + "步");
}
2.6.2、break
写在循环体中,表示结束循环。如果循环执行的过程中遇到了break,需要立即结束这个循环,无论循环条件是否成立。
// break: 小明在操场上跑100米,当跑到了50米的时候,摔了一跤,不再继续跑了。
for (int meter = 0; meter <= 100; meter++) {
System.out.println("小明在跑步,跑了" + meter + "步");
if (meter == 50) {
System.out.println("诶呀,小明摔了一跤");
break;
}
}
2.6.3、循环标签(了解)
给一个循环添加一个标签,标签一般情况下没有任何作用。但是配合break或者continue使用,会有奇效。
break的作用是结束循环,但是如果应用在嵌套的循环中,只能结束一层循环。break写在了哪一个循环中,break就停止哪一个循环。如果需要结束多层循环,需要配合标签使用。
outter:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
System.out.println("i = " + i + ", j = " + j);
if (j == 1) {
break outter; // 停止指定标签的循环
}
}
}