第4章 程序控制结构


提示:此为本人学习笔记,欢迎指出有误之处

第4章 程序控制结构

三大流程控制语句: 1、 顺序控制 2、分支控制 3、 循环控制

4.1 顺序控制

在这里插入图片描述

4.2 分支控制

4.2.1分支控制 if-else 介绍

让程序有选择的的执行,分支控制有三种:单分支、双分支、多分支
单分支
在这里插入图片描述

//if 的快速入门 
import java.util.Scanner;//导入 
public class If01 { //编写一个 main 方法 
	public static void main(String[] args) {
		//编写一个程序,可以输入人的年龄,如果该同志的年龄大于 18 岁, 
		//则输出 "你年龄大于 18,要对自己的行为负责,送入监狱" //
		//思路分析 
		//1. 接收输入的年龄, 应该定义一个 Scanner 对象 
		//2. 把年龄保存到一个变量 int age 
		//3. 使用 if 判断,输出对应信息 
		//应该定义一个 Scanner 对象
		Scanner myScanner = new Scanner(System.in); 		
		System.out.println("请输入年龄"); 
		//把年龄保存到一个变量 
		int age int age = myScanner.nextInt(); 
		//使用 if 判断,输出对应信息
		if(age > 18) { 
			System.out.println("你年龄大于 18,要对自己的行为负责,送入监狱"); 
		}
		System.out.println("程序继续..."); 
	} 
}

双分支
在这里插入图片描述

//if-else 的快速入门 
import java.util.Scanner;//导入
	public class If02 {
		//编写一个 main 方法 
		public static void main(String[] args) {
		//编写一个程序,可以输入人的年龄,如果该同志的年龄大于 18 岁, 
		//则输出 "你年龄大于 18,要对 
		//自己的行为负责, 送入监狱"。否则 ,输出"你的年龄不大这次放过你了
		//思路分析 
		//1. 接收输入的年龄, 应该定义一个 Scanner 对象 
		//2. 把年龄保存到一个变量 int age 
		//3. 使用 if-else 判断,输出对应信息
		//应该定义一个 Scanner 对象 
		Scanner myScanner = new Scanner(System.in); 
		System.out.println("请输入年龄"); 
		//把年龄保存到一个变量 
		int age int age = myScanner.nextInt(); 
		//使用 if-else 判断,输出对应信息
		if(age > 18) { 
			System.out.println("你年龄大于 18,要对自己的行为负责,送入监狱");
		} else {//双分支 
			System.out.println("你的年龄不大这次放过你了"); 
		}
		System.out.println("程序继续..."); 
	}
}

练习

  1. 编写程序,声明 2 个 double 型变量并赋值。判断第一个数大于 10.0,且第 2 个数小于 20.0,打印两数之和。
  2. 定义两个变量 int,判断二者的和,是否能被 3 又能被 5 整除,打印提示信息
  3. 判断一个年份是否是闰年,闰年的条件是符合下面二者之一:(1)年份能被 4 整除,但不能被 100 整除;(2)能被 400 整除

多分支
在这里插入图片描述

//课堂练习 
import java.util.Scanner; public class If03 { //编写一个 main 方法 
	public static void main(String[] args) { 
		/*输入保国同志的芝麻信用分: 
		如果: 信用分为 100 分时,输出 信用极好; 
		信用分为(80,99]时,输出 信用优秀; 
		信用分为[60,80]时,输出 信用一般; 
		其它情况 ,输出 信用 不及格 
		请从键盘输入保国的芝麻信用分,并加以判断 假定信用分数为 int 	*/ 
		Scanner myScanner = new Scanner(System.in); //接收用户输入 
		System.out.println("请输入信用分(1-100):"); 
		//请思考:如果小伙伴输入的不是整数,而是 hello.. (可以使用异常处理机制搞定)
		int grade = myScanner.nextInt(); 
		//先对输入的信用分,进行一个范围的有效判断 1-100, 否则提示输入错误 
		if(grade >=1 && grade <= 100) {
			//因为有 4 种情况,所以使用多分支 
			if(grade == 100) { 
				System.out.println("信用极好"); 
			} else if (grade > 80 && grade <= 99) { //信用分为(80,99]时,输出 信用优秀; 
				System.out.println("信用优秀"); 
			} else if (grade >= 60 && grade <= 80) {//信用分为[60,80]时,输出 信用一般 
				System.out.println("信用一般"); 
			} else {//其它情况 ,输出 信用 不及格 
				System.out.println("信用不及格"); 
			} 
		} else { 
			System.out.println("信用分需要在 1-100,请重新输入:)"); 
		}
	}
}

嵌套分支
在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支的结构称为内层分支外面的分支结构称为外 层分支。建议: 不要超过 3 层 (可读性不好)

import java.util.Scanner;
public class NestedIf { //编写一个 main 方法 
	public static void main(String[] args) {
		/*参加歌手比赛,如果初赛成绩大于 8.0 进入决赛, 否则提示淘汰。
		并且根据性别提示进入男子组或女子组。 输入成绩和性别,进行判断和输出信息。
		提示: double score; char gender; 
		接收字符: char gender = scanner.next().charAt(0) 	*/
		
		Scanner myScanner = new Scanner(System.in); 
		System.out.println("请输入该歌手的成绩"); 
		double score = myScanner.nextDouble(); 
		if( score > 8.0 ) { 
			System.out.println("请输入性别");
			char gender = myScanner.next().charAt(0); 
			if( gender == '男' ) { 
				System.out.println("进入男子组"); 
			} else if(gender == '女') { 
				System.out.println("进入女子组"); 
			} else { 
				System.out.println("你的性别有误,不能参加决赛~"); 
			} 
		} else { 
			System.out.println("sorry ,你被淘汰了~"); 
		} 
	}
}

练习
在这里插入图片描述

4.2.2 switch 分支结构

基本语法
在这里插入图片描述

在这里插入图片描述

import java.util.Scanner; 
public class Switch01 { //编写一个 main 方法 
	public static void main(String[] args) { 
		/*案例:Switch01.java 请编写一个程序,该程序可以接收一个字符,
		比如:a,b,c,d,e,f,g 
		a 表示星期一,b 表示星期二 … 根据用户的输入显示相应的信息.要求使用 switch 语句完成 
		思路分析 1. 接收一个字符 , 创建 Scanner 对象 2. 使用 switch 来完成匹配,并输出对应信息 代码*/ 
		Scanner myScanner = new Scanner(System.in); 
		System.out.println("请输入一个字符(a-g)"); 
		char c1 = myScanner.next().charAt(0);// 
		//在 java 中,只要是有值返回,就是一个表达式
		switch(c1) { 
			case 'a' :
				System.out.println("今天星期一,猴子穿新衣"); 
				break; 
			case 'b' : 
				System.out.println("今天星期二,猴子当小二"); 
				break; 
			case 'c' : 
				System.out.println("今天星期三,猴子爬雪山.."); 
				break; 
			//.....
			default: 
				System.out.println("你输入的字符不正确,没有匹配的"); 
		}
		System.out.println("退出了 switch ,继续执行程序"); 
	}
}

注意事项
在这里插入图片描述
练习

  1. 使用 switch 把小写类型的 char 型转为大写(键盘输入)。只转换 a, b, c, d, e. 其它的输出 “other”。
  2. 对学生成绩大于 60 分的,输出"合格"。低于 60 分的,输出"不合格"。(注:输入的成绩不能大于 100), 提示 成绩/60
  3. 根据用于指定月份,打印该月份所属的季节。3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12, 1, 2 冬季 [课堂练习, 提示使用穿透 ]

switch 和 if 的比较

  1. 如果判断的具体数值不多,而且符合 byte、 short 、int、 char, enum[枚举], String 这 6 种类型。建议使用 swtich 语句。
  2. 其他情况:对区间判断,对结果为 boolean 类型判断,建议使用 if,(if 的使用范围更广)

4.3 循环控制

4.3.1 for 循环控制

语法:
在这里插入图片描述
流程图:
在这里插入图片描述

  1. 循环条件是返回一个布尔值的表达式
  2. for(;循环判断条件;) 中的初始化和变量迭代可以写到其它地方,但是两边的分号不能省略。
  3. 循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,循环变量迭代也可以有多条变量迭代 语句,中间用逗号隔开
//打印 1~100 之间所有是 9 的倍数的整数,统计个数 及 总和.[化繁为简,先死后活]
public class ForExercise { 
	public static void main(String[] args) {
		//老韩的两个编程思想(技巧)  1. 化繁为简 : 即将复杂的需求,拆解成简单的需求,逐步完成 编程 = 思想 --练习-> 代码   2. 先死后活 : 先考虑固定的值,然后转成可以灵活变化的值
		//思路分析 
		//打印 1~100 之间所有是 9 的倍数的整数,统计个数 及 总和 
		//化繁为简
		//(1) 完成 输出 1-100 的值 
		//(2) 在输出的过程中,进行过滤,只输出 9 的倍数 i % 9 ==0 
		//(3) 统计个数 定义一个变量 int count = 0; 当 条件满足时 count++; 
		//(4) 总和 , 定义一个变量 int sum = 0; 当条件满足时累积 sum += i; 
		//先死后活 
		//(1) 为了适应更好的需求,把范围的开始的值和结束的值,做出变量 
		//(2) 还可以更进一步 9 倍数也做成变量 int t = 9
		int count = 0; //统计 9 的倍数个数 变量 int sum = 0; //总和 
		int start = 10; 
		int end = 200; 
		int t = 5; // 倍数 
		for(int i = start; i <= end; i++) {
			if( i % t == 0) { 
				System.out.println("i=" + i); 
				count++; sum += i;//累积 
			} 
		}
		System.out.println("count=" + count); 	
		System.out.println("sum=" + sum); 
	} 
}

4.3.2 while 循环控制

语法
在这里插入图片描述
在这里插入图片描述

//while 循环的案例 
public class While01 { 
	public static void main(String[] args) {
		//输出 10 句 你好,hello world !
		int i = 1; //循环变量初始化 
		while( i <= 10 ) {//循环条件 
			System.out.println("你好,你好,hello world !" + i);//执行语句 
			i++;//循环变量迭代 
		}
		System.out.println("退出 while ,继续.." + i); // 11 
	} 
}
  1. 循环条件是返回一个布尔值的表达式
  2. while 循环是先判断再执行语句

练习

  1. 打印 1—100 之间所有能被 3 整除的数 [使用 while ]
  2. 打印 40—200 之间所有的偶数 [使用 while]

4.3.3 do…while 循环控制

语法:
在这里插入图片描述
在这里插入图片描述

  1. do while 是关键字
  2. 也有循环四要素, 只是位置不一样
  3. 先执行,再判断,也就是说,一定会至少执行一次
  4. 最后 有一个 分号 ;
  1. 循环条件是返回一个布尔值的表达式
  2. do…while 循环是先执行,再判断, 因此它至少执行一次

练习

  1. 打印 1—100
  2. 计算 1—100 的和
  3. 统计 1—200 之间能被 5 整除但不能被 3 整除的个数

4.3.4 多重循环控制(难点! 重点!)

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

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

//双层 for 
for(int i = 0; i < 2; i++) { //先思考 
	for( int j = 0; j < 3; j++) { 
		System.out.println("i=" + i + j=" + j); 
	} 
}

练习

  1. 统计 3 个班成绩情况,每个班有 5 名同学,求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。
  2. 统计三个班及格人数,每个班有 5 名同学。
  3. 打印出九九乘法表
//请编写一个程序,可以接收一个整数,表示层数(totalLevel),打印出金字塔。
public class Stars { 
	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("");
		} 
	} 
}

在这里插入图片描述

4.3.5 跳转控制语句-break

break 语句用于终止某个语句块的执行,一般使用在 switch 或者循环[for , while , do-while]中
在这里插入图片描述

  1. break语句出现在多层嵌套的语句块中时,可以通过标竖指明要终止的是哪一层循环
    在这里插入图片描述

(1)break 语句可以指定退出哪层
(2)label1是标签,名字由程序员指定。
(3) break后指定到哪个label就退出到哪里
(4)在实际的开发中,尽量不要使用标签.
(5)如果没有指定break,默认退出最近的循环体

练习

  1. 1-100 以内的数求和,求出 当和 第一次大于 20 的当前数
  2. 实现登录验证,有 3 次机会,如果用户名为"丁真" ,密码"666"提示登录成功,否则提示还有几次机会,请使用 for+break

4.3.6 跳转控制语句-continue

  1. continue 语句用于结束本次循环,继续执行下一次循环。
  2. continue 语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环

在这里插入图片描述

//演示
label1: 
for(int j = 0; j < 4; j++){ 
	label2: 
	for(int i = 0; i < 10; i++){ 
		if(i == 2){ 
			//看看分别输出什么值,并分析 
			//continue ; 
			//continue label2; 
			continue label1; 
		}
		System.out.println("i = " + i); 
	} 
}

4.3.7 跳转控制语句-return

return 使用在方法,表示跳出所在的方法,在讲解方法的时候,会详细的介绍,这里我们简单的提一下。如果 return 写在 main 方法,退出程序

for(int i=1;i<=5;i++){
	if(i==3) {
		System.out.println("好好学习"+i);
		return;//continue; break;
	}
	System.out.println("Hello World!");
}
System.out.println("go on..");

4.4 本章作业

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值