35-程序控制结构

本文详细介绍了程序控制结构,包括顺序控制、分支控制(单分支、双分支、多分支)、嵌套分支、switch分支及其与if的比较,以及循环控制(for、while、do-while)和转跳语句(break、continue、return)。通过实例和流程图,阐述了各种结构的使用场景和语法要点,旨在帮助读者深入理解程序执行的逻辑控制。
摘要由CSDN通过智能技术生成

顺序控制

  • 介绍:程序从上到下的执行,中间没有任何判断和跳转
  • 顺序控制举例和注意事项
    java中定义成员变量时采用合法的向前引用
    请添加图片描述

分支控制

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

单分支

  • 基本语法:
if(条件表达式){
	执行代码块;
}
  • 说明:
    当条件表达式为ture时,就会执行{}的代码。如果为false,就不执行
  • 特别说明:
    如果{}中只有一条语句,则可以不用写{},但建议写上
  • 案例:
    请添加图片描述
    请添加图片描述
  • 单分支流程图
    请添加图片描述

双分支

  • 基本语法:
if(条件表达式){
	执行代码块一;
}else{
	执行代码块二;
}
  • 说明:
    当条件表达式成立,及执行代码块一,否则执行代码块二。如果执行代码块只有一条语句,则{}可以不用写,但建议写上。
    eg:
    请添加图片描述
  • 双分支流程图
    请添加图片描述

多分支

  • 基本语法:
if(条件表达式1){
	执行代码块1;
}else if(条件表达式2){
	执行代码块2;
//....
}else{
	执行代码块n;
}

  • 多分支流程图:
    请添加图片描述
  • 说明:
  1. 当条件表达式1成立时,即执行代码块一。
  2. 如果表达式1不成立,才去判断表达式2是否成立
  3. 如果表达式2成立,就执行代码块2
  4. 以此类推,如果所有的表达式都不成立
  5. 则执行else的代码块,注意:只能有一个执行入口
  • 特别说明:
  1. 多分支可以没有else,如果所有条件表达式都不成立,则一个执行入口都没有
  2. 如果有else,如果所有条件表达式都不成立,则默认为执行else代码块
  • 多分支案例
    请添加图片描述
    案例2:
    请添加图片描述
    主代码:
    请添加图片描述

嵌套分支

  • 基本介绍:
    在一个分支结构完整的嵌套了另一个完整的分支结构,里面的分支结构成为内层分支,外面的分支结构称为外层分支(最好不要超过三层)
  • 基本语法:
if(){
	if(){
		if-esle
	}else{
		if-else
	}
}
  • 案例1:
    请添加图片描述
    请添加图片描述
  • 案例2:
    请添加图片描述
import java.util.Scanner;

public class Homework06{
	public static void main(String[] args){
		Scanner myScanner = new Scanner(System.in);
		String season = myScanner.next();
		int age = myScanner.nextInt();
		if(season.equals("旺季")){   //这里注意字符串的比较(equals)的使用方法
			if(age < 18 ){
				System.out.println("票价为半价");
			}else if(age >=18 && age <= 60){
				System.out.println("票价为60");
			}else if(age >60 ){
				System.out.println("票价为20");
			}

		}else if(season.equals("淡季")){
			if(age >=18 & age <=60){
				System.out.println("票价为40");
			}else{
				System.out.println("票价为20");
			}

		}

	}
}

注意:
equals 比较两个字符串的形式是否一样而
== 比较两个字符串的地址是否相同

switch分支

  • 基本语法:
switch(表达式){
case 常量1 :
	语句块1break;
case 常量2 :
	语句块2break;
//...
case 常量n :
	语句块n;
	break;
default :
	default 语句块;
	break;
}
  • 解读:
  1. switch关键字,表示switch分支
  2. 表达式对应一个值
    3 .case常量1:当表达式的值等于常量1,就执行语句块1
  3. break:表示退出switch
  4. 如果和case常量1匹配,就执行语句块1,如果没有匹配,就继续匹配case常量2
  5. 如果一个都没有匹配上,执行default语句
  • switch细节
  1. 表达式数据类型,应和case后的常量类型一致,或者是可以自动转换成可以比较的类型,比如输入的是字符,而常量是 int
  2. switch(表达式)中的表达式的返回值必须是:(byte,short,int,enum,String)
    请添加图片描述
  3. case句子中的值必须是常量,而不能是变量
  4. default子句是可选的,当没有匹配的case时,执行default
  5. break语句用来在执行完一个case分支后使程序跳出switch语句块;如果没有写break程序会顺序执行到switch结尾
    请添加图片描述
  • 案例:
    请添加图片描述
import java.util.Scanner;

public class Homework09{
	public static void main(String[] args){
		Scanner myScanner = new Scanner(System.in);
		int month = myScanner.nextInt();
		switch(month){
			case 3 :
			case 4 :
			case 5 :
				System.out.println("春季");
				break;
			case 6 :
			case 7 :
			case 8 :
				System.out.println("夏季");
				break;
			case 9 :
			case 10 :
			case 11 :
				System.out.println("秋季");
				break;
			case 12 :
			case 1 :
			case 2 :
				System.out.println("冬季");
				break;

		}
	}
}

switch和if的比较

  1. 如果判断的具体数值不多,而且符合byte,short,int,char,enum,String这六种类型。虽然两个语句都可以用,建议使用switch语句。
  2. 其他情况:对区间判断,对结果为boolean类型判断,使用if,if的范围很广泛

for循环控制

  • 基本语法:
for(循环变量初始化;循环条件;循环变量迭代){
	循环操作(可以多条语句);
}
  • 说明:
  1. for关键字,表示循环控制
  2. for有四要素:(1)循环变量初始化(2)循环条件(3)循环操作(4)循环变量迭代
  3. 循环操作,这里可以有多条语句,也就是我们要循环的代码
  4. 如果循环操作(语句)只有一条语句,可以省略{},但建议不要省略
  • for循环流程图
    请添加图片描述

  • for循环细节

  1. 循环条件时返回一个布尔值的表达式
  2. for(;循环条件;)中的初始化和变量迭代可以写到其他地方,但是两边的分号不能省略
  3. 循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开
  4. 使用内存分析法:
    请添加图片描述
  • for循环练习
  1. 打印1~100之间所有时9的倍数的整数统计个数及总和【化繁为简,先死后活】
    请添加图片描述
    请添加图片描述

while 循环控制

  • 基本语法:
循环变量的初始化;
while(循环条件){
	循环体(语句);
	循环变量迭代;
}
  • 说明:
  1. while 循环也有四要素
  2. 只是四要素放的位置不一样
  • while循环流程图
    请添加图片描述
  • while 循环细节说明
  1. 循环条件是返回一个布尔值的表达式
  2. while 循环是先判断再执行语句
  • 案例
    请添加图片描述

do-while循环控制

  • 基本语法:
循环变量初始化;
do{
循环体(语句);
循环变量迭代;
}while(循环条件);   //注意这里的分号
  • 说明:
  1. do-while是关键字
  2. 也有循环四要素,只是位置不一样
  3. 限制性,再判断,也就是说,一定会执行一次
  4. 最后有一个分号;
  5. while和do-while区别,在于有没有执行
  • do-while流程图
    请添加图片描述

  • 案例:
    请添加图片描述

  • do-while循环控制细节:
    1.循环条件是返回一个布尔类型的表达式
    2.do-while循环是先执行,再判断,因此它至少执行一次

  • do-while练习
    请添加图片描述

多重控制

  • 介绍:
    1.将一个循环放在另一个循环体内,就形成了嵌套循环。其中for,while,do-while均可以作为外层循环和内层循环。【建议一般最多不要超过三层,否则代码的可读性很差】
    2.设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n次
  • 多重循环步骤分析(内存分析法)
    请添加图片描述
  • 案例:
    请添加图片描述
    下面是韩老师源代码(有编程思想):
import java.util.Scanner;
public class MulForExercise01 { 

	//编写一个main方法
	public static void main(String[] args) {
		//统计3个班成绩情况,每个班有5名同学,
		//求出各个班的平均分和所有班级的平均分[学生的成绩从键盘输入]。
		//统计三个班及格人数,每个班有5名同学。
		//
		//思路分析:
		//化繁为简
		//(1) 先计算一个班 , 5个学生的成绩和平均分 , 使用for
		//1.1 创建 Scanner 对象然后,接收用户输入
		//1.2 得到该班级的平均分 , 定义一个 doubel sum 把该班级5个学生的成绩累积 
		
		//(2) 统计3个班(每个班5个学生) 平均分
		//(3) 所有班级的平均分
		//3.1 定义一个变量,double totalScore 累积所有学生的成绩
		//3.2 当多重循环结束后,totalScore / (3 * 5) 
		//(4) 统计三个班及格人数
		//4.1 定义变量 int passNum = 0; 当有一个学生成绩>=60, passNum++
		//4.2 如果 >= 60 passNum++
		//(5) 可以优化[效率,可读性, 结构]
		
		//创建 Scanner 对象
		Scanner myScanner = new Scanner(System.in);
		double totalScore = 0; //累积所有学生的成绩
		int passNum = 0;//累积 及格人数
		int classNum = 3; //班级个数
		int stuNum = 5;//学生个数
		for( int i = 1; i <= classNum; i++) {//i 表示班级

			double sum = 0; //一个班级的总分
			for( int j = 1; j <= stuNum; j++) {//j 表示学生
				System.out.println("请数第"+i+"个班的第"+j+"个学生的成绩");
				double score = myScanner.nextDouble();
				//当有一个学生成绩>=60, passNum++
				if(score >= 60) {
					passNum++;
				}
				sum += score; //累积
				System.out.println("成绩为" + score);
			}
			//因为sum 是 5个学生的总成绩
			System.out.println("sum=" + sum + " 平均分=" + (sum / stuNum));
			//把 sum 累积到 totalScore
			totalScore += sum;

		}
		System.out.println("三个班总分="+ totalScore 
			+ " 平均分=" + totalScore / (classNum*stuNum));
		System.out.println("及格人数=" + passNum);

	}
}
  • 案例2:
    请添加图片描述

下面是韩老师源代码(有编程思想):

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("");
		}
	}
}

转跳控制语句

break

  • 基本介绍:
    break语句用于终止某个语句块的执行,一般使用在switch或者循环中
  • 基本语法
{ 
	....
	break;
	....
}
  • 以while使用break为例,流程图:
    请添加图片描述
  • 快速入门
    请添加图片描述
  • 案例(有random的使用):
    请添加图片描述
    请添加图片描述
    random返回的数在[0,1)内,要随机生成0~100的数要×100
  • brea语句细节:
    1.break语句出现在多重循环嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块
    2.标签的使用
    请添加图片描述

注:
1.break语句可以指定退出那一层
2.label1是标签,由程序员绝指定
3.break后指定到哪个label就是退出到哪里
4.在实际的开发中,尽量不要使用标签
5.如果没有指定break。默认退出最近的循环体
请添加图片描述

continue

  • 基本介绍:
    1.continue语句用于结束本次循环,继续执行下一次循环
    2.continue语句出现在多重嵌套循环的循环语句体中时,可以通过标签指明要跳过的时哪一层循环
  • 基本语法
{
	....
	continue;
	....
}
  • 以switch使用continue举例,画出流程图:
    请添加图片描述
  • 案例:
    请添加图片描述

return

  • 介绍:
    return使用在方法,表示跳出当前所在的方法,后面学习方法详细介绍。注:如果return写在main方法中,退出程序
    请添加图片描述

最后

附上韩顺平老师这节内容的章节总结原视频有助于知识梳理

进度153/910 ,学习永无止境!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值