第4章程序控制结构

1.程序流程控制介绍

在程序中,程序运行的流程控制决定程序是如何执行的,是我们必须掌握的,主要有三大流程控制语句。

  1. 顺序控制

  2. 分支控制

  3. 循环控制

1.1顺序控制

1662815447456

1.2分支控制 if-else

让程序有选择的的执行,分支控制有三种

  1. 单分支 if

  2. 双分支 if-else

  3. 多分支 if-else if -....-else

1) 单分支 if

1662815798270

1662816111003

2) 双分支 if-else

1662816126942

1662816145775

3) 多分支 if-else if -....-else

1662816169603

1662816180308

2.嵌套分支

在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支的结构称为内层分支外面的分支结构称为外层分支。

1662816254126

3.switch 分支结构

1662816299090

3.1 switch 注意事项和细节讨论

1662817473811


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 的比较

  1. 如果判断的具体数值不多,而且符合 byte、 short 、int、 char, enum[枚举], String 这 6 种类型。虽然两个语句都可以使用,建议使用 swtich 语句。

  2. 其他情况:对区间判断,对结果为 boolean 类型判断,使用 if,if 的使用范围更广

4.for 循环控制(!!!)

基本介绍:听其名而知其意,就是让你的代码可以循环的执行

1662817869586

  1. for 关键字,表示循环控制

  2. for 有四要素: (1)循环变量初始化(2)循环条件(3)循环操作(4)循环变量迭代

  3. 循环操作 , 这里可以有多条语句,也就是我们要循环执行的代码

  4. 如果 循环操作(语句) 只有一条语句,可以省略 {}, 建议不要省略

1662817910063

4.1 for的使用细节

  1. 循环条件是返回一个布尔值的表达式

  2. for(;循环判断条件;) 中的初始化和变量迭代可以写到其它地方,但是两边的分号不能省略。

  3. 循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,循环变量迭代也可以有多条变量迭代 语句,中间用逗号隔开。


//演示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 循环控制

1662818568965

1662818584785

4.1 注意事项和细节说明

  1. 循环条件是返回一个布尔值的表达式

  2. while 循环是先判断再执行语句

6.do..while 循环控制

1662818670944

  1. do while 是关键字

  2. 也有循环四要素, 只是位置不一样

  3. 先执行,再判断,也就是说,一定会至少执行一次

  4. 最后 有一个 分号 ;

1662818711301

6.1注意事项和细节说明

  1. 循环条件是返回一个布尔值的表达式

  2. do..while 循环是先执行,再判断, 因此它至少执行一次

7.多重循环控制(难点! 重点!)

  1. 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for ,while ,do…while 均可以作为外层循环和内层循环。

【建议一般使用两层,最多不要超过 3 层, 否则,代码的可读性很差】

  1. 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为 false 时,才会完全跳出内 层循环,才可结束外层的当次循环,开始下一次的循环.

  2. 设外层循环次数为 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;

​ ……

}

1662821146974

9.1 注意事项和细节说明

1662821196385

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

  1. continue 语句用于结束本次循环继续执行下一次循环

  2. continue 语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环 , 这个和前面的标签的使用的规则一样.

{

​ ……

​ continue;

​ ……

}

1662821615791


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 + "不是水仙花数");
		}
	}
}
posted @ 2022-09-10 23:06  半路_出家ren  阅读(81)  评论(0编辑  收藏  举报
返回顶端