程序的三种执行顺序
1. 顺序结构
就是按照指令编写的顺序,一条一条执行,没有跳转,没有循环
2. 分支结构
2.1 if 分支结构
- 单分支结构
只有一个 if 条件表达式+执行语句Scanner scanner = new Scanner(System.in); int score = scanner.nextInt(); if(score >= 60){ System.out.println("及格"); }
- if - else结构
满足 if 条件语句→代码1,不满足(else)→代码2if(score >= 60){ System.out.println("及格"); }else{ //除去score>=60的情况 System.out.println("不及格"); }
- if - else if - else if - …else
满足第i个条件→执行代码i,从上至下开始判断是否满足条件表达式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("不及格"); }
🔺if (条件){ },“(条件)” 后不能跟" ; ",否则{ }中的代码将不受 if 的控制 (“ ; ” 表示一个程序语句的结束)
🔺在多条件中,将较小范围的条件判断语句在前面(即最小的交集)。这是因为在 if-else if-else if…-else 语句中,是从上往下开始匹配,且匹配成功后,下面的其他条件就不再匹配了。
橙色警告显示这两个条件永远都是false,那是因为如果第一个条件符合了,后面的else if判断语句就不会判断了,如果第一个条件不符合,那后面的也不符合,也是只执行else的代码块
2.2 switch分支结构
switch (表达式){
case 常量值1:
语句1;
break;
case 常量值2:
语句2;
break;
default:
语句3;
break;
}
1)机制:
-
比对值:
通过与case后的值进行比对,来判断需要执行哪一段程序 -
break跳出:
在与case后的值匹配成功后,如若需要跳出当前switch结构,则可以只用break语句 -
default默认板块:
在与所有的case后的值匹配后,发现没有匹配上的,则执行default块的代码Scanner scanner = new Scanner(System.in); int score = scanner.nextInt(); switch (score / 10){ case 10: case 9: System.out.println("优秀"); break; case 8: System.out.println("中等"); break; case 7: System.out.println("及格"); break; default: //类似于if语句中的else System.out.println("不及格"); break; } //输入:87 输出:中等
2)相较于if判断语句的优点:
在值匹配时,switch语句对于各种可能的值采用类似树结构进行存储,能够直接匹配到相对应的值,不同于if语句中需要逐行进行判断
3)注意事项和穿透性的应用
- 比对不支持小数(double、float、long),小数可以用if语句判断
- case后的值不能重复,且只能是字面量,不能是变量
- 正常使用switch的时候,记得写break,否则会出现穿透性:在匹配成功后,执行代码块,并接着执行下一个case语句的代码块
switch (score / 10){ case 10: case 9: System.out.println("优秀"); break; case 8: System.out.println("中等"); case 7: System.out.println("及格"); break; default: System.out.println("不及格"); break; } // 输入:87 输出:中等 及格
3. 循环结构
3.1 for循环
for(初始化语句①;循环条件②;迭代语句③){
循环体语句④(重复执行的语句)
}
🔺① → ② → ④ → ③ → ② → ④ → ③ → ② → ④ → ③ …
- 在初始化语句中定义循环变量时,要注意循环变量的作用域
for (int i = 0; i < 8; i++) { System.out.print(i+"\t"); } //执行结果:0 1 2 3 4 5 6 7 //执行过程: //i=0,0<8,true,打印0,i=1 //i=1,1<8,true,打印1,i=2
3.2 while循环
初始化语句;
while(循环条件){
循环体语句(重复执行的语句)
迭代语句;
}
- 不知道循环次数时,可以用while循环
//输入一个小于10的数字,利用计数的方式求10减去这个数。 Scanner scanner = new Scanner(System.in); int num = scanner.nextInt(); int i = 0; int temp = num; while (temp < 10) { temp++; i++;//temp每加一次记一次数,直至与10相等 } System.out.println("10 - " + num + " = " + i); //输入:5 输出:10 - 5 = 5
3.3 do-while循环
先执行后判断,执行至少一次
初始化语句;
do{
循环体语句;
迭代语句;
}while(循环条件)
int i = 1;
do {
System.out.println("你好!");
i++;
} while (i <= 1);
//输出:你好!
while (i <= 1) {
System.out.println("你好!");
i++;
}
//无输出
3.4 死循环
不进行干预就一直执行下去的循环
- for死循环
for(;;){ System.out.println("死循环"); }
- while死循环
while(true){ System.out.println("死循环"); }
- do…while死循环
do{ System.out.println("死循环"); }while(true);
🔺使用场景:如服务器一直监测状态
3.5 循环嵌套:打印九九乘法表
外部循环执行一次,内部循环执行一轮循环
- 需求:打印出九九乘法表
3.5.1 思路分析:
1)在输出时,输出的内容默认是按照行来输出的,所以外层的for循环是对行进行处理
- 一共有9行,i=1→9
2)再看每一行的等式与行号的关系,即乘数=行号,被乘数从1开始递增,直至等于乘数
3.5.2 代码
// 一共有9行,i=1→9
for (int i = 1; i <= 9; i++) {
// 被乘数从1开始递增,直至等于乘数
for (int j = 1; j <= i ; j++) {
System.out.print(i + "x" + j + "=" + i*j);
System.out.print('\t'); //通过制表符对齐输出点
}
System.out.println(); //循环一轮后 换行
}
3.6 break、continue
1)break
跳出并结束当前所在循环的执行,即这一轮循环都结束了
🔺break:只能用于结束所在循环,或者结束 所在switch分支的执行
🔺continue:只能在循环中进行使用
2)continue
跳出当前循环的当次执行,直接进入循环的下一次执行