前言:
流程控制:用来控制程序中各个语句执行顺序,将语句组合成可以完成一定功能的小逻辑模块。
在设计程序时,规定的流程结构有三种:
- 顺序结构:程序从上到下执行,中间过程中没有任何判断和跳转。
- 分支结构:根据条件,选择性的执行某段代码;例:if-else语句和switch-case语句。
- 循环结构:根据循环结构,重复性的执行某段代码;例:for、while、do-while。
1.分支语句
1.1 if-else结构
1.1.1 单分支条件判断
if(条件表达式) {
语句块;
}
执行流程:
- 运行结果为true,执行代码块。
- 结果为false,结束运行。
流程图:
1.1.2 双分支条件判断
if(条件表达式){
语句块1;
}else{
语句块2;
}
执行流程:
- 结果为true,执行语句1。
- 结果为false,执行语句2。
流程图:
1.1.3 多分支条件判断
if(条件表达式){
语句块1;
}else{
语句块2;
}
...
}else if(条件表达式n){
语句块n;
} else{
语句块n+1;
}
执行流程:
- 先判断关系表达式1结果为true还是false。
- 如果为true,执行语句块1,然后结束当前多分支。
- 如果是false,就继续判断关系表达式2的结果为true还是false(下同)
流程图:
1.1.4 if-else的嵌套使用示例
假设我们想根据一个学生的分数判断他的成绩等级。具体来说,我们可以定义如下等级:
- 90分及以上:优秀
- 80到89分:良好
- 70到79分:中等
- 60到69分:及格
- 60分以下:不及格
//这里使用了Scanner类从键盘获取数据
import java.util.Scanner;
public class Person{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 输入学生分数
System.out.print("请输入学生的分数: ");
int score = scanner.nextInt();
// 嵌套if-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("成绩等级: 不及格");
}
scanner.close();
}
}
结果:
1.2 switch-case结构
1.2.1 格式与执行流程
switch(表达式){
case 常量值1:
语句块1;
break;
case 常量值2:
语句块2;
break;
...
[default:
语句块n=1;
break;
]
}
执行过程:
- 首先计算表达式的值,并与每个case标签进行比较。
- 找到第一个匹配的case后,执行对应的代码块。
- 如果没有匹配的case,可以选择执行default块。
- 如果没有使用break,控制流将继续执行下一个case,直到遇到break或结束整个switch。
- 一旦执行了break,或所有case都执行完毕,控制流将跳出switch结构。
流程图:
1.2.2 示例
题目:输入1-7 判断并输出星期几
import java.util.Scanner;
public class Person{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 输入星期几
System.out.print("请输入一个数字(1-7)代表星期几: ");
int day = scanner.nextInt();
// switch-case 结构
switch (day) {
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("无效的输入,请输入1到7之间的数字。");
break;
}
scanner.close();
}
}
结果:
1.2.3 注意事项
- switch中的表达式只能是特定的数据类型,如:byte \ short \ char \ int \ enum \ String()
2.循环语句
概念:循环语句具有在某些条件满足的情况下,反复执行特定代码的功能。
循环结构四要素:
- 初始化部分
- 循环条件部分
- 循环体部分
- 迭代部分
2.1 for循环
2.1.1 for循环结构
说明:for
循环是一种控制结构,用于重复执行一段代码块,直到满足特定条件。for
循环通常用于已知次数的迭代。
for (初始化①; 条件②; 迭代④) {
循环体③
}
执行过程:①-②-③-④-②-③-④...
2.1.2 示例
题目:遍历1到100以内的偶数,并计算偶数的个数和它们的总和
public class Person {
public static void main(String[] args) {
int count = 0; // 用于记录偶数的个数
int sum = 0; // 用于计算偶数的和
// 使用for循环遍历1到100的数字
for (int i = 1; i <= 100; i++) {
// 检查当前数字是否为偶数
if (i % 2 == 0) {
count++; // 偶数个数加1
sum += i; // 累加偶数到sum
}
}
// 输出结果
System.out.println("1到100之间的偶数个数: " + count);
System.out.println("1到100之间的偶数的和: " + sum);
}
}
2.2 while循环
2.2.1 while循环结构
说明:在条件为true
时反复执行循环体,直到条件为false
。while
循环适用于在不确定循环次数的情况下反复执行的场景。
while (条件) {
循环体
}
2.2.2 示例
题目:使用while
循环遍历1到100的偶数
public class Person {
public static void main(String[] args) {
int i = 1; // 循环变量,从1开始
int count = 0; // 用于记录偶数的个数
int sum = 0; // 用于计算偶数的和
// 使用while循环遍历1到100的数字
while (i <= 100) {
// 检查当前数字是否为偶数
if (i % 2 == 0) {
count++; // 偶数个数加1
sum += i; // 累加偶数到sum
}
i++; // 增加循环变量,避免无限循环
}
// 输出结果
System.out.println("1到100之间的偶数个数: " + count);
System.out.println("1到100之间的偶数的和: " + sum);
}
}
结果:
2.3 do-while循环
2.3.1 do-while结构
说明:do-while
循环会 先执行一次循环体,然后再检查循环条件。也就是说,do-while
循环至少会执行一次,即使条件一开始就是false
。
do {
循环体
} while (条件);
2.3.2 示例
题目:使用 do-while
循环遍历1到100的偶数
public class Person {
public static void main(String[] args) {
int i = 1; // 循环变量,从1开始
int count = 0; // 用于记录偶数的个数
int sum = 0; // 用于计算偶数的和
// 使用 do-while 循环遍历 1 到 100 的数字
do {
// 检查当前数字是否为偶数
if (i % 2 == 0) {
count++; // 偶数个数加 1
sum += i; // 累加偶数到 sum
}
i++; // 增加循环变量,避免无限循环
} while (i <= 100); // 循环条件,直到 i 超过 100
// 输出结果
System.out.println("1到100之间的偶数个数: " + count);
System.out.println("1到100之间的偶数的和: " + sum);
}
}
结果:
2.4 无限循环结构
2.4.1 无限循环的结构
说明:它会不断重复执行某段代码,直到程序被强制停止或循环内部存在某种条件来中断循环。
1. 使用 while 循环
while (true) {
// 循环体
System.out.println("这是无限循环");
}
2. 使用 for 循环
for (;;) {
// 循环体
System.out.println("这是无限循环");
}3. 使用 do-while 循环
do {
// 循环体
System.out.println("这是无限循环");
} while (true);
2.4.2 示例
题目:带有条件的无限循环
public class Person {
public static void main(String[] args) {
int count = 0;
while (true) {
System.out.println("循环次数: " + count);
count++;
// 假设在10次后退出循环
if (count >= 10) {
break; // 退出循环
}
// 休眠1秒钟
try {
Thread.sleep(1000); // 休眠1000毫秒(1秒)
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("循环结束。");
}
}
结果:
注意:
- 容易引发死循环。
- 在合适的场景下,它是非常有用的,如服务器监听、实时数据处理、GUI事件监听、游戏主循环以及后台任务。
- 设计时,要确保有清晰的退出条件,以避免资源泄露和性能问题
2.5 嵌套循环
2.5.1 嵌套循环的结构
说明:嵌套循环是指在一个循环内部再包含一个或多个循环的结构。在Java中,嵌套循环可以用于处理多维数组、生成图形、执行复杂的算法等。是处理多维数据和执行重复任务等有效方法。
1.嵌套for循环的基本结构:
for (int i = 0; i < 外部条件; i++) {
// 外层循环代码
for (int j = 0; j < 内部条件; j++) {
// 内层循环代码
}
}2.嵌套while循环的基本结构:
while (条件1) {
// 外层循环的代码while (条件2) {
// 内层循环的代码
}// 外层循环的其他代码
}
3.嵌套do-while循环的基本结构:do {
// 外层循环的代码do {
// 内层循环的代码
} while (条件2);// 外层循环的其他代码
} while (条件1);
2.5.2 示例
题目:二维数组的遍历
public class Person {
public static void main(String[] args) {
int[][] array = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
for (int i = 0; i < array.length; i++) { // 遍历行
for (int j = 0; j < array[i].length; j++) { // 遍历列
System.out.print(array[i][j] + " "); // 打印元素
}
System.out.println(); // 换行
}
}
}
结果:
3.关键字break和continue
3.1 break
说明:break用于立即终止当前循环。它可以用于for、while和do-while循环中。当程序执行到break语句时,循环将被完全退出,控制权将转移到循环后面的第一条语句。
示例:打印5遍内容
public class Person{
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
if (i == 5) {
break; // 当 i 等于 5 时,终止循环
}
System.out.println(i);
}
System.out.println("循环已终止");
}
}
结果:当i
等于5时,break
语句被触发,循环终止,因此只打印出0到4的数字。
3.2 continue
说明:continue用于跳过当前循环中的剩余语句,并立即开始下一次循环的迭代。也就是说,当程序执行到continue语句时,当前迭代将被跳过,控制权将转移到循环的开始部分。
示例:打印10以内的所有奇数
public class Person {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue; // 跳过偶数
}
System.out.println(i);
}
}
}
结果:当i为偶数时,continue语句被触发,跳过了System.out.println(i);语句,因此只打印出奇数。
3.3 综合使用
示例:跳过所有能被3整除的数字,并在num
大于15时终止循环。
public class Person {
public static void main(String[] args) {
for (int num = 0; num < 20; num++) {
if (num % 3 == 0) {
continue; // 跳过能被3整除的数字
}
if (num > 15) {
break; // 当 num 大于15时,终止循环
}
System.out.println(num);
}
}
}
结果:
注意:
- break和continue都是用于控制循环执行流的关键字。
- break用于完全退出循环,而continue则跳过当前迭代并继续下一次循环。