第4章程序控制结构
1.程序流程控制介绍
在程序中,程序运行的流程控制决定程序是如何执行的,是我们必须掌握的,主要有三大流程控制语句。
-
顺序控制
-
分支控制
-
循环控制
1.1顺序控制
1.2分支控制 if-else
让程序有选择的的执行,分支控制有三种
-
单分支 if
-
双分支 if-else
-
多分支 if-else if -....-else
1) 单分支 if
2) 双分支 if-else
3) 多分支 if-else if -....-else
2.嵌套分支
在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支的结构称为内层分支外面的分支结构称为外层分支。
3.switch 分支结构
3.1 switch 注意事项和细节讨论
public class SwitchDetail {
//编写一个main方法
public static void main(String[] args) {
//细节1
//表达式数据类型,应和case 后的常量类型一致,
//或者是可以自动转成可以相互比较的类型,比如输入的是字符,而常量是 int
//细节2
//switch(表达式)中表达式的返回值必须是:
//(byte,short,int,char,enum[枚举],String)
//细节3
//case子句中的值必须是常量(1,'a')或者是常量表达式,而不能是变量
//
//细节4
//default子句是可选的,当没有匹配的case时,执行default
//如果没有default 子句,有没有匹配任何常量,则没有输出
//
//细节5
//break语句用来在执行完一个case分支后使程序跳出switch语句块;
//如果没有写break,程序会顺序执行到switch结尾,除非执行到break
char c = 'b';
char c2 = 'c';
switch(c) {
case 'a' :
System.out.println("ok1");
break;
case 'b' :
System.out.println("ok2");
break;
default :
System.out.println("ok3");
}
System.out.println("退出了switch,继续执行..");
}
}
3.2switch 和 if 的比较
-
如果判断的具体数值不多,而且符合 byte、 short 、int、 char, enum[枚举], String 这 6 种类型。虽然两个语句都可以使用,建议使用 swtich 语句。
-
其他情况:对区间判断,对结果为 boolean 类型判断,使用 if,if 的使用范围更广
4.for 循环控制(!!!)
基本介绍:听其名而知其意,就是让你的代码可以循环的执行
-
for 关键字,表示循环控制
-
for 有四要素: (1)循环变量初始化(2)循环条件(3)循环操作(4)循环变量迭代
-
循环操作 , 这里可以有多条语句,也就是我们要循环执行的代码
-
如果 循环操作(语句) 只有一条语句,可以省略 {}, 建议不要省略
4.1 for的使用细节
循环条件是返回一个布尔值的表达式
for(;循环判断条件;) 中的初始化和变量迭代可以写到其它地方,但是两边的分号不能省略。
循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,循环变量迭代也可以有多条变量迭代 语句,中间用逗号隔开。
//演示for的使用细节
public class ForDetail {
//编写一个main方法
public static void main(String[] args) {
//for(;循环判断条件;)
//中的初始化和变量迭代可以写到其它地方,但是两边的分号不能省略
// 使用for循环控制
// int i = 1;//循环变量初始化
// for( ; i <= 10 ; ) {
// System.out.println("hello" + i);
// i++;
// }
// System.out.println("i=" + i);//11 ok
// int j = 1;
// //补充
// for(;;) { //表示一个无限循环,死循环
// System.out.println("ok~" + (j++));
// }
//循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,
//循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开
//老师使用内存分析法,看看下面代码输出什么?
int count = 3;
for (int i = 0,j = 0; i < count; i++, j += 2) {
System.out.println("i=" + i + " j=" + j);
}
}
}
5.while 循环控制
4.1 注意事项和细节说明
-
循环条件是返回一个布尔值的表达式
-
while 循环是先判断再执行语句
6.do..while 循环控制
do while 是关键字
也有循环四要素, 只是位置不一样
先执行,再判断,也就是说,一定会至少执行一次
最后 有一个 分号 ;
6.1注意事项和细节说明
-
循环条件是返回一个布尔值的表达式
-
do..while 循环是先执行,再判断, 因此它至少执行一次
7.多重循环控制(难点! 重点!)
- 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for ,while ,do…while 均可以作为外层循环和内层循环。
【建议一般使用两层,最多不要超过 3 层, 否则,代码的可读性很差】
-
实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为 false 时,才会完全跳出内 层循环,才可结束外层的当次循环,开始下一次的循环.
-
设外层循环次数为 m 次,内层为 n 次,则内层循环体实际上需要执行 m*n 次。
8.经典案例—打印金字塔
public class Stars {
//编写一个main方法
public static void main(String[] args) {
/*
*
* *
* *
********
思路分析
化繁为简
1. 先打印一个矩形
*****
*****
*****
*****
*****
2. 打印半个金字塔
* //第1层 有 1个*
** //第2层 有 2个*
*** //第3层 有 3个*
**** //第4层 有 4个*
***** //第5层 有 5个*
3. 打印整个金字塔
* //第1层 有 1个* 2 * 1 -1 有4=(总层数-1)个空格
*** //第2层 有 3个* 2 * 2 -1 有3=(总层数-2)个空格
***** //第3层 有 5个* 2 * 3 -1 有2=(总层数-3)个空格
******* //第4层 有 7个* 2 * 4 -1 有1=(总层数-4)个空格
********* //第5层 有 9个* 2 * 5 -1 有0=(总层数-5)个空格
4. 打印空心的金字塔 [最难的]
* //第1层 有 1个* 当前行的第一个位置是*,最后一个位置也是*
* * //第2层 有 2个* 当前行的第一个位置是*,最后一个位置也是*
* * //第3层 有 2个* 当前行的第一个位置是*,最后一个位置也是*
* * //第4层 有 2个* 当前行的第一个位置是*,最后一个位置也是*
********* //第5层 有 9个* 全部输出*
先死后活
5 层数做成变量 int totalLevel = 5;
//小伙伴 技术到位,就可以很快的把代码写出
*/
int totalLevel = 20; //层数
for(int i = 1; i <= totalLevel; i++) { //i 表示层数
//在输出*之前,还有输出 对应空格 = 总层数-当前层
for(int k = 1; k <= totalLevel - i; k++ ) {
System.out.print(" ");
}
//控制打印每层的*个数
for(int j = 1;j <= 2 * i - 1;j++) {
//当前行的第一个位置是*,最后一个位置也是*, 最后一层全部 *
if(j == 1 || j == 2 * i - 1 || i == totalLevel) {
System.out.print("*");
} else { //其他情况输出空格
System.out.print(" ");
}
}
//每打印完一层的*后,就换行 println本身会换行
System.out.println("");
}
}
}
9.跳转控制语句-break
break 语句用于终止某个语句块的执行,一般使用在 switch 或者循环[for , while , do-while]中
{
……
break;
……
}
9.1 注意事项和细节说明
public class BreakDetail {
//编写一个main方法
public static void main(String[] args) {
abc1:
for(int j = 0; j < 4; j++){//外层for
abc2:
for(int i = 0; i < 10; i++){//内层for
if(i == 2){
//break ;//等价 break abc2
break abc1 ;
}
System.out.println("i = " + i);
}
}
}
}
10.跳转控制语句-continue
-
continue 语句用于结束本次循环,继续执行下一次循环。
-
continue 语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环 , 这个和前面的标签的使用的规则一样.
{
……
continue;
……
}
public class ContinueDetail {
//编写一个main方法
public static void main(String[] args) {
label1:
for(int j = 0; j < 2; j++){
label2:
for(int i = 0; i < 10; i++){
if(i == 2){
//看看分别输出什么值,并分析
//continue ; //等价于 continue label2
//continue label2;//等价 continue;
continue label1; //输出 2次[0,1]
}
System.out.println("i = " + i);//输出2次[0,1,3,4,5,6,7,8,9]
}
}
}
}
11.跳转控制语句-return
return 使用在方法,表示跳出所在的方法.
注意:如果 return 写在 main 方法,退出程序.
12.水仙花数案例
public class Homework04 {
//编写一个main方法
public static void main(String[] args) {
/*
4. 判断一个整数是否是水仙花数,所谓水仙花数是指一个3位数,
其各个位上数字立方和等于其本身。
例如: 153 = 1*1*1 + 3*3*3 + 5*5*5
思路分析 => 多听. 见多识广..
1. 比如 int n = 153;
2. 先得到 n的百位,十位 ,各位的数字, 使用 if 判断他们的立方和是否相等
3. n的百位 = n / 100
4. n的十位 = n % 100 / 10
5. n的各位 = n % 10
6. 判断即可
*/
int n = 154;
int n1 = n / 100;
int n2 = n % 100 / 10;
int n3 = n % 10;
if(n1 * n1 * n1 + n2 * n2 * n2 + n3 * n3 * n3 == n) {
System.out.println(n + "是水仙花数");
} else {
System.out.println(n + "不是水仙花数");
}
}
}