【C语言】选择结构和循环结构的进阶

本篇目录

  • [1. 选择结构的嵌套](#1. 选择结构的嵌套)
    • [1.1 if-else的嵌套:多层级判断](#1.1 if-else的嵌套:多层级判断)
    • [1.2 switch-case的嵌套](#1.2 switch-case的嵌套)
    • [1.3 选择结构与逻辑运算符的结合](#1.3 选择结构与逻辑运算符的结合)
  • [2. 循环结构的嵌套](#2. 循环结构的嵌套)
    • [2.1 嵌套循环:多层重复执行](#2.1 嵌套循环:多层重复执行)
    • [2.2 循环控制的技巧](#2.2 循环控制的技巧)
  • [3. 其他](#3. 其他)
    • [3.1 本篇参考/来源](#3.1 本篇参考/来源)

在学习本篇之前,请巩固上节的知识点📖

1. 选择结构的嵌套

在很多问题的处理上,单层的选择或者是不断堆积的else会显得格外的低效,这时候我们可以用到嵌套,将复杂的步骤进行简化。

1.1 if-else的嵌套:多层级判断

当需要在一个条件分支中再做细分判断时,可以使用 if-else 的嵌套结构。

其中的逻辑是先判断大条件,再在大条件下判断小条件。
真 真 假 假 外层条件 内层条件1 执行内层if代码块 执行内层else代码块 执行外层else代码块

语法架构为

c 复制代码
if(外层条件){
	//外层为真时执行的代码
	if(内层条件1){
		//内层条件1为真时执行的代码
	}else{
		//内层条件1位假时执行的代码
	}
}else{
	//外层为假时执行的代码
}

其实很好理解,类似一个病人在医院挂号。

医院会先判断"是否为急诊"(外层条件),若为急诊再判断"是否危及生命"(内层条件1);若不是急诊,则按照普通看病流程处理。


例1. 判断一个数是否为能被3整除的偶数

c 复制代码
int num = 6;
if(num%2 == 0){	//可以被2整除就是偶数
	if(num%3 == 0){ //能否被3整除
		printf("%d是能被3整除的偶数\n",num);
	}else{
		printf("%d是偶数,但不能被3整除\n",num);
	}
}else{
	printf("%d不是偶数\n",num);
}

注意事项

  • 嵌套层级建议不超过3层,因为过多的层级会降低代码的可读性,让人难以理解
  • 内层的 if-else 需要严格缩进,明确与外层之间的关系

1.2 switch-case的嵌套

不只是常见的 if-else 支持嵌套, switch-case 也支持嵌套。

而且具有"穿透性",体现在:省略break时继续执行下一个case。

c 复制代码
int a;
switch(a/b){ //将a以b为一组,进行不同层级的划分
	case 1:
		switch(a){	//根据a的值进行判断
			case 1 :printf("..");break;
			...
		}
	case 2:
	...
}

当多个case需要执行相同逻辑时,可省略中间case的break,实现"区间批量处理"。

例2.按分数段进行评级(90-100为A,80-89位B...)

c 复制代码
int score = 85;
switch(score/10){ // 整除10后,可以划分分数段
	case 10:
	case 9:printf("等级A\n"); //10和9共享逻辑
	case 8:printf("等级B\n");
	case 7:printf("等级C\n");
	case 6:printf("等级D\n");
	default:printf("等级E\n");
}
  • 在电梯的内部,如果我们按下"10楼"和"9楼"都需要停在9楼以上区域,电梯可以连续停靠(穿透),直到触发"9楼"的停靠指令(break)。

1.3 选择结构与逻辑运算符的结合

在第一节基本语法结构中,我们学习了逻辑运算符&&(与)、||(或)、!(非)。

合理的使用这些逻辑运算符,可以代替部分嵌套结构。

如上节中5和7的最小公倍数中,我们使用了"i % 5 == 0 && i % 7 == 0"去代替了if( i%5==0 )中再嵌套if ( i %7 == 0)的情况。

同理,我们可以将例1的程序简化:

c 复制代码
int num = 6;
if(num%2 == 0 && num%3 == 0){	//同时可以被2和3整除的数
	printf("%d是能被3整除的偶数\n",num);
}else{
	printf("%d不是偶数\n",num);
}

优点

  • 相比较嵌套 if-else 或者 if 的多层嵌套,运用逻辑运算符组合的条件更直观,且执行效率更高。

2. 循环结构的嵌套

循环结构的嵌套是实现矩阵运算、排序算法等的基础。

·矩阵运算涉及到多维数组,在学习到数组的时候会进行讲解。

·排序算法:如对一串数字进行大小排序,诸多算法中常见的。

2.1 嵌套循环:多层重复执行

嵌套循环很好理解,就是一个循环里面中再嵌套另一个循环,外层循环控制着"轮次",内层循环控制"没轮的重复次数"。
真 真 假 假 外层初始化 外层条件 内层初始化 内层条件 执行内层循环体 内层更新 外层更新 退出循环

这个流程图可能有些许复杂,我来简单讲一下:

  1. 对一个数先进行判断是否满足外层条件,不满足直接退出外层循环,满足则进行到步骤2
  2. 对这个数再进行内层条件的判断,直到不满足内层条件后,退出内层的循环返回到外层循环
  3. 在外层更新后,判断是否满足外层条件,满足则直接退出外层循环,不满足则重复步骤2、3

只有外层条件不满足时,整个循环才结束,如上图所示⬆️

例3.打印5行5列的正方形星号

c 复制代码
for(int i=0; i<5; i++){	//5行
	for(int j=0; j<5; j++){	//每行5个
		printf("*");
	}
	printf("\n");	//每行结束后换行
}
plaintext 复制代码
 - * * * * 
 - * * * * 
 - * * * * 
 - * * * * 
 - * * * * 

同理,九九乘法表也可以按照这个逻辑进行打印。

2.2 循环控制的技巧

  • break与标志位
    在多层循环中,需要一次性跳出所有的循环时,仅用break是无法实现的(因为只能跳出当前层),我们可以使用标志位来进行跳出(在最外层循环中的条件判断里添加,常与逻辑运算符结合使用)。

标志位:一个记录循环状态的变量,可以是一个布尔值,为真时结束循环。后续会使用到。

  • continue与复杂条件
    continue可以结合逻辑判断,跳过循环中"不需要处理"的迭代,减少无效的计算
  • 减少重复计算
    循环内部的重复计算会降低效率,尤其在多层嵌套循环中,需将"与循环变量无关的计算"移到循环外。

3. 其他

3.1 本篇参考/来源

  • 图片由本人绘制而成
相关推荐
小白学大数据2 小时前
构建1688店铺商品数据集:Python爬虫数据采集与格式化实践
开发语言·爬虫·python
范纹杉想快点毕业2 小时前
12个月嵌入式进阶计划ZYNQ 系列芯片嵌入式与硬件系统知识学习全计划(基于国内视频资源)
c语言·arm开发·单片机·嵌入式硬件·学习·fpga开发·音视频
大邳草民2 小时前
深入理解 Python 的“左闭右开”设计哲学
开发语言·笔记·python
实心儿儿2 小时前
C++ —— list
开发语言·c++
Never_Satisfied2 小时前
在JavaScript中,将包含HTML实体字符的字符串转换为普通字符
开发语言·javascript·html
im_AMBER3 小时前
React 12
前端·javascript·笔记·学习·react.js·前端框架
开开心心就好3 小时前
电脑音质提升:杜比全景声安装详细教程
java·开发语言·前端·数据库·电脑·ruby·1024程序员节
清钟沁桐3 小时前
mlir 编译器学习笔记之四 -- 调度
笔记·学习·mlir
lijun_xiao20093 小时前
elasticsearch学习笔记-02
笔记·学习·elasticsearch