Bootstrap

从零开始学Java(超详细韩顺平老师笔记梳理)04——程序控制结构:顺序、分支、(嵌套)循环、空心金字塔


前言

本篇文章是韩顺平老师课程P103-P153(第五章:程序控制结构)重点内容的详细总结,包含以下内容:

  1. 顺序控制
  2. 分支控制(if, else, switch)
  3. 循环控制( for, while, do while, 多重循环)
  4. break、continue、return

从这一章开始,我们会逐步接触编程思想,正式开始敲代码实践,建议大家多练习,常写常新。


一、顺序控制

  • 程序从上到下逐行执行,中间没有判断和转跳
  • Java中定义变量采用合法的前向引用(所有的变量要先定义,再使用
public class Test{
	//先定义num1
	int num1 = 12;
	//再使用
	int num2 = num1 + 2;

二、分支控制(if, else, switch)

1. if-else

  • 介绍:让程序有选择的执行,分支控制有三种:单分支、双分支、多分支

1)单分支 if

  • 基本语法(提示:如果{ }中只有一条语句,则可以不用{ },但建议写上{ })
// 当条件表达式为true时,就会执行{}里面的代码
// 如果为false,就不执行,直接跳出if代码
if(条件表达式) {
      执行代码块;(可以有多条语句)
}
  • 案例分析
import java.util.Scanner;

public class Test01{

	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("程序继续...");
	}
}
  • 单分支执行流程图

在这里插入图片描述

2)双分支 if-else

  • 基本语法
if(条件表达式) {
    执行代码块1;
}
else {
    执行代码块2;
}
  • 说明
    • 当表达式成立时,执行代码块1;否则,执行代码块2
    • 如果执行的代码块只有一条语句,{}可以省略(建议不要省
  • 案例分析
import java.util.Scanner;//导入
public class If02 {
	//编写一个 main 方法
	public static void main(String[] args) {
		//编写一个程序,可以输入人的年龄,如果该同志的年龄大于 18 岁, 
		//则输出 "你年龄大于 18,要对自己的行为负责"。
		//否则 ,输出"你的年龄不大,好好接受教育。"
		//应该定义一个 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("程序继续...");
	}
}

3)多分支

  • 基本语法
if(条件表达式1) {
     执行代码块1;
}
else if(条件表达式2) {
     执行代码块2;
}
//……这里可以有多个else if(){}
//最后用else{}结尾
else {
     执行代码块n
}
  • 说明
    • 多分支可以没有最后这个else{}
    • 如果没有最后这个else{}
      • 当所有的条件表达式都不成立时,则一个执行入口都没有,直接退出分支
    • 如果有else{}
      • 当以上所有else if{}条件表达式都不成立时,则默认执行else{}代码块内容
  • 案例分析
/*输入保国同志的芝麻信用分:
如果:
1) 信用分为 100 分时,输出 信用极好;
2) 信用分为(80,99]时,输出 信用优秀;
3) 信用分为[60,80]时,输出 信用一般;
4) 其它情况 ,输出 信用 不及格
5) 请从键盘输入保国的芝麻信用分,并加以判断
*/
import java.util.Scanner;
public class Test01{

	public static void main (String[] args){

		Scanner myscanner = new Scanner(System.in);

		int score = myscanner.nextInt();
		//先对输入的信用分,进行一个范围的有效判断 1-100, 否则提示输入错误
		if(score >= 1 && score <= 100) { 
			//因为有 4 种情况,所以使用多分支
			if(score == 100) {
				System.out.println("信用极好");
			}
			else if(score > 80 && score <= 99) {
				System.out.println("信用优秀");
			}
			else if(score >=60 && score <=80) {
				System.out.println("信用一般");
			}
			else {
				System.out.println("信用不合格");
			}
		}else{
			System.out.println("信用分输入有误");
		}
	}
}
  • 多分支执行流程图
    在这里插入图片描述
  • 老韩多分支练习2大家看视频多练习,有很多容易踩坑的细节需要大家好好学习

4)嵌套分支

  • 介绍
    • 在一个分支结构中又完整嵌套了另一个完整的分支结构,里面的分支的结构成为内层分支,外面的分支结构称为外层分支
    • 规范:不要超过3层,层数太多可读性不好
  • 基本语法
if() {
	if() {
	  //if-else...
	}else{
	 //if-else
	}
}
  • 案例
    参加歌手比赛,如果初赛成绩大于 8.0 进入决赛,否则提示淘汰。并且根据性别提示进入男子组或女子组。输入成绩和性别,进行判断和输出信息。
import java.util.Scanner;
public class NestedIf {
	public static void main(String[] args) {
		//思路分析
		//1. 创建 Scanner 对象,接收用户输入
		//2. 接收 成绩保存到 double score
		//3. 使用 if-else 判断 如果初赛成绩大于 8.0 进入决赛,否则提示淘汰
		//4. 如果进入到 决赛,再接收 char gender, 使用 if-else 输出信息
		//代码实现 => 思路 --> java 代码
		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 ,你被淘汰了~");
		}
	}
}

2. switch

  • 基本语法
switch(表达式){ // 1.switch是关建字,表示switch分支
	case 常量1:  // 2.表达式对应一个具体的值
	语句块1; // 3.case常量1:当表达式的值等于常量1,就执行语句块1
	break; // 4.break:表示tui出switch
	case 常量2: // 5.如果和case常量1匹配,就执行语句块1,如果没有匹配,就继续匹配
	语句块2; //  case常量2
	break; // 6.如果一个都没匹配上,执行default
	....
	case 常量n:
	语句块n;
	break;
	default:
	default 语句块;
	break;
}
  • 流程图
    在这里插入图片描述
  • 案例说明(快速入门)
import java.util.Scanner;

public class Switch01{

	public static void main (String[] args){
		/*
		请编写一个程序,该程序可以接收一个字符,比如:a,b,c,d,e,f,g
		a 表示星期一,b 表示星期二 …
		根据用户的输入显示相应的信息.要求使用 switch 语句完成
		
		思路分析
		1. 接收一个字符 , 创建 Scanner 对象
		2. 使用 switch 来完成匹配,并输出对应信息
		代码
		*/
		Scanner scan = new Scanner (System.in);
		System.out.println("请输入字母");
		char word = scan.next().charAt(0);

		switch (word) {
			case 'a':
				System.out.println("星期一");
				break;
			case 'b':
				System.out.println("星期二");
				break;
			//......
			default:
				System.out.println("输入的字符不正确");
				break;
		}
	}
}
  • switch细节
    • 表达式数据类型,应和case后的常量类型一致,或者是可以自动转成可以相互比较的类型,比如输入的是字符,而常量是int

    • switch表达式中的表达式返回值必须是:(byte, short, int, char, enum [枚举], String)
      在这里插入图片描述

    • case子句中的值必须是常量或者常量表达式,而不能是变量

    • default子句是可选的,当没有匹配的case时,执行default(可以没有default)

    • break语句用来在执行完一个case分支后使程序跳出switch语句块;如果没有写break,程序会顺序执行到switch结尾

    • switch和if的比较

      • 如果判断的具体值不多,而且符合byte, short, int, char, enum, String这六种类型。建议使用switch语句
      • 区间判断,对结果为boolean类型判断,使用if ,if-else的使用范围更广

三、循环控制( for, while, do while, 多重循环)

1. for

  • 语法
    • for 关键字,表示循环控制
    • for 有四个要素:循环变量初始化;循环条件;循环操作;循环变量迭代
    • 循环操作:可以有多条语句,也就是我们要循环执行的代码
    • 如果循环操作(语句) 只有一条语句,可以省略{},建议不要省略
    • 流程分析
for(循环变量初始化;循环条件;循环变量迭代){
	循环操作(语句);
}
  • 流程图
    在这里插入图片描述
  • 细节
    • 循环条件是返回一个布尔值的表达式
    • for( ; 循环判断条件;) 中的初始化和条件变量迭代可以写到其他地方,但是两边的分号不能省略
int i = 1; //循环变量初始化 在for循环结束后还想使用i
for (; i <= 10; ){
	System.out.println("xx" + i);
	i++
}
for (;;){
	System.out.println("xx"); //无限循环,死循环
}
  • 循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开
  • 循环变量迭代也可以有多条语句,中间用逗号隔开
int count = 3;
for(int i = 0, j = 0; i < count; i++, j += 2){
	System.out.println("i=" + i + "j=" + j); //i = 2; j = 6
}

2. while

  • 基本语法
    说明:while循环也有四要素,只是四要素的位置不一样
循环变量初始化;
while(循环条件){
	循环体(语句);
	循环变量迭代;
}
  • 流程图
  • 案例练习:打印 1—100 之间所有能被 3 整除的数
public class Test11{
	//打印 1—100 之间所有能被 3 整除的数
	public static void main(String[] args){
		int a = 1;
		while (a <= 100){
			if(a % 3 == 0){
				System.out.println(a);
			}
			a++;
		}
	}
}
  • 细节
    • 循环条件是返回一个布尔值的表达式
    • while循环是先判断再执行语句

3. do while

  • 基本语法
    • do while是关键字
    • 也有循环四要素,只是位置不同
    • 先执行,在判断,一定会执行一次
    • 最后有一个分号(while结束后)
    • while 和do…while 的区别
      • while:要账的时候,先问还不还,如果还,就走人,不打(先判断,再执行)
      • do…while:要账的时候,先打一顿,再问还不还(先执行,再判断)
循环变量初始化;
do{
	循环体(语句);
	循环变量迭代;
}while(循环条件);
  • 流程图
    在这里插入图片描述
  • 细节
    • 循环条件是返回一个布尔值的表达式
    • do…while 循环是先执行,再判断,因此它至少执行一次
  • 案例练习:统计1-200之间能被5整除但不能被3整除的数的个数
public class Test11{

	public static void main(String[] args){

		int i = 1;
		int num = 0;

		do{
			if((i % 5 == 0) && (i % 3 != 0)){
				num++;
			}
			i++;

		}while(i <= 200);
		System.out.println(num);
	}
}

4. 多重循环(重难点,很重要)

  • 介绍

    • 将一个循环放在另外一个循环体内,形成嵌套循环,其中,for, while, do…while均可以作为外层循环和内层循环
      • 建议一般使用两层,三层以上可读性很差
    • 实际上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环
  • 案例1:统计三个班成绩情况,每个班有五个同学,求出每个班的平均分和所有班级的平均分,统计及格人数
    在这里插入图片描述

  • 案例2:空心金字塔
    在这里插入图片描述
    我这里并没有把案例放完整,完整的案例可以看老韩视频

四、break、continue、return

1. break跳转语句

  • 需求
    • 随机生成1-100的一个数,直到生成了97这个数,看看一共用了几次?
      使用(int)(Math.random() * 100) + 1
      在这里插入图片描述
    • 思路分析:循环,但是循环的次数不知道。 -> break,当某个条件满足时,终止循环,通过该需求可以说明其他流程控制的必要性
  • 基本介绍
    • break语句用于终止某个语句块的执行,一般使用在switch或者循环[for, while, do-while]中
  • 基本语法
{   ...
	break;
	...
}
  • 细节
    • break语句出现在多层嵌套语句块中时,可以通过标签指明要终止的是哪一层语句块
    • 标签的基本使用 & 案例
      • break语句可以指定退出哪层
      • label 1 是标签,名字由程序员指定
      • break 后指定到哪个label就退出到哪里
      • 在实际开发中,尽量不要使用标签
      • 如果每日有指定的break,默认退出最近的循环体
label 1:{ ... 
label 2:	{ ...
label 3:		{ 	 ...
					break label 2;
                      ...
				}
			}
		}
public class Asgd{
	public static void main(String[] args){
		
		label1:
		for(int i = 0; i < 4; i++) {

		label2:
			for(int j = 0; j < 10; j++) {
				if (j == 2){
					break label1;
				}
				System.out.println(j); //只输出0,1
			}
		}
	}
}

老韩break的课堂练习

2. continue

  • 基本介绍
    • 用于结束本次循环,继续执行下一次循环
    • continue语句出现在多层嵌套语句体中时,可以通过标签指明要跳过的是哪一层循环,规则同上
  • 基本语法
{	...
	continue;
	...
}
  • 快速入门
public class Asgd{
	public static void main(String[] args){
		int i = 1;
		while( i <= 4 ){
			i++;
			if (i == 2){
				continue;
			}
			System.out.println(i); //3 4 5
		}
	}
}

3. return

  • 介绍
    • return使用在方法,表示跳出所在的方法,在讲解方法的时候会详细介绍。 如果return用在main方法,退出程序

老韩视频中的本章作业和梳理我放在这里,一定要认真看着视频敲代码哦。


总结

本篇文章是韩顺平老师课程P103-P153(第五章:程序控制结构)重点内容的详细总结,包含以下内容:

  1. 顺序控制
  2. 分支控制(if, else, switch)
  3. 循环控制( for, while, do while, 多重循环)
  4. break、continue、return

从这一章开始,我们会逐步接触编程思想,正式开始敲代码实践,建议大家多练习,常写常新。

;