内容正文:
5.5节:循环的嵌套
C语言程序设计
电子工业出版社
理解循环嵌套的概念、语法结构和执行流程,掌握不同类型循环的合法嵌套形式
能够运用循环嵌套解决实际问题,如打印图形等,并能排查常见错误
培养逻辑思维能力和编程调试能力,提高解决复杂问题的能力
知识目标
能力目标
素养目标
01
01
01
学习目标
目录
Part 01
教学导入
Part 02
知识讲授
Part 03
师生互动
Part 04
课堂练习
Part 05
课堂小结
教学导入:生活中的循环嵌套
情境创设:化身快递员
任务:打包3个包裹。
标准流程:放入2张防震膜+ 放入1张快递单。
思考与讨论
1. 如何高效地完成这个打包任务?
2. 请用语言描述你操作的整个过程。
核心概念引入:这种“重复打包包裹”中又包含“重复放入物料”的过程,就是编程中的“循环嵌套”。
教学导入:循环嵌套的概念
图:循环嵌套执行流程示意
流程图解析:打包快递的逻辑
•外层循环:控制包裹的数量(例如:需要打包3个包裹)。
•内层循环:控制单个包裹的具体操作(例如:放入防震膜、贴快递单)。
核心概念:循环嵌套
指一个循环语句的循环体内,包含另一个或多个完整的循环结构。这种结构能高效处理具有层级关系的重复性任务。
教学导入
本节课核心主题
循环的嵌套 (Nested Loops)
本节课学习目标
概念与语法
掌握嵌套循环的基本结构与书写规范
执行流程
理解内外层循环的执行逻辑与顺序
实际应用
运用嵌套循环解决复杂的编程问题
知识讲授
循环的嵌套
循环的嵌套
循环嵌套的应用
第一部分
循环的嵌套
知识讲授
知识讲授:循环嵌套的概念
时钟模型:时针与分针的关系
核心定义
循环嵌套是指在一个循环语句的循环体内包含另一个或多个完整的循环结构。
生活类比:时钟的时针与分针
外层循环(时针)每走一格,内层循环(分针)需要完整地走一圈。这形象地说明了外层控制大节奏,内层处理细节的执行逻辑。
知识讲授:循环嵌套的语法结构
// for循环嵌套的基本结构
for(初始化表达式1; 条件表达式1; 更新表达式1) {
// 外层循环体
for(初始化表达式2; 条件表达式2; 更新表达式2) {
// 内层循环体 (重点执行区域)
}
// 外层循环体的其他代码
}
外层循环:控制“大循环”次数
外层循环决定了整体的循环轮次,每执行一次外层循环,内部的逻辑就会被触发一次。
内层循环:完整执行的子任务
在每一次外层循环的迭代中,内层循环必须从头至尾完整地执行完毕,才会回到外层循环的下一次迭代。
外层循环开始
内层循环完整执行
外层循环继续/结束
知识讲授:循环嵌套的执行流程
外层循环开始
外层循环判断
真
假
内层循环开始
内层循环判断
真
执行内循环体
内循环结束,执行外循环体内其他语句
假
外层循环结束
核心逻辑:外层循环一次,内层循环一轮
知识讲授:合法的循环嵌套形式
while()
{
while()
{
……
}
}
01
内层循环
while()
{
do
{}
while();
}while();
02
内层循环
while( )
{
for( ; ; )
{
……
}
}
03
内层循环
知识讲授:合法的循环嵌套形式
do
{
while()
{
……
}
}while();
04
内层循环
do
{
do
{
……
}
while();
}while();
05
内层循环
do
{
for( ; ; )
{
……
}
}while();
06
内层循环
知识讲授:合法的循环嵌套形式
for( ; ; )
{
do
{
……
}while();
}
07
内层循环
for( ; ; )
{
while()
{
……
}
}
08
内层循环
for( ; ; )
{
for( ; ; )
{
……
}
}while();
09
内层循环
知识讲授:常见错误
错误代码示例 (C语言)
// 错误的循环嵌套形式(循环交叉)
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++);
// 注意此处的分号
printf("i=%d, j=%d
", i, j);
错误原因诊断
1. 语法陷阱:内层循环的循环体后面多了一个分号(;)。
2. 逻辑错位:这个分号代表内层循环体为空,导致后续的 printf 语句脱离了内层循环,实际上成为了外层循环的一部分。
3. 典型症状:这是一种典型的“循环交叉”错误,程序执行结果将与预期大相径庭。
核心启示:在编写嵌套循环时,务必注意循环体的范围界定,切勿在无意中点上多余的分号,这往往是导致逻辑错误的隐形杀手。
背诵记忆
定义
一个循环体内包含另一个完整的循环结构。外层是父循环,内层是子循环。
执行流程
外层循环执行一次,内层循环完整执行一遍。内层循环结束后,才会进入外层循环的下一次迭代。
语法
for、while、do-while 三种循环可相互嵌套,但必须保证结构完整包含,严禁交叉。
注意事项
内外层循环控制变量绝对不能同名;注意循环条件的边界,避免出现死循环。
请利用接下来的 1 分钟时间,快速记忆以上核心知识点
例题分析:输出九九乘法表
算法设计
外层循环控制被乘数 i(1-9);
内层循环控制乘数 j(1-i);
每次打印 j × i = j*i,用 \t 对齐;
每轮外层循环结束后换行。
int i,j;
开始
i=1;
i<=9
真
j=1;
j<=9
真
执行内循环语句
j++;
printf(“
”)
假
结束
i++;
假
for
for
例题分析:输出九九乘法表
程序文本【5.10】输出九九乘法表
#include <stdio.h>
main()
{ int i, j;
// 外层循环:被乘数i(1-9)
for (i = 1; i <= 9; i++) {
// 内层循环:乘数j(1-i)
for (j = 1; j <= 9; j++)
printf("%4d*%d=%-4d", i,j,j*i);
printf("
");
printf("
");
}
}
例题分析:输出九九乘法表
课堂问答
问题一
在循环嵌套中,内层循环和外层循环的执行顺序是怎样的?
外层循环执行一次,内层循环会完整地执行一遍。只有当内层循环全部执行完毕后,才会回到外层循环的下一次迭代。
问题二
如何避免循环嵌套中的死循环?
确保内层循环和外层循环都有明确的终止条件,并且循环变量能够朝着终止条件的方向变化。同时,避免在内层循环中修改外层循环的变量。
课堂练习(一)
编程任务
使用循环嵌套打印一个 5 行 5 列的正方形。
提示:思考外层循环控制行数,内层循环控制每行的列数。注意循环变量的范围。
请打开 编译软件,尝试独立编写代码实现该功能。
课堂练习(一)
程序文本:输出5 行 5 列的正方形
#include<stdio.h>
main()
{
int i,j;
for(i = 0; i < 5; i++)
{
for(j = 0; j < 5; j++)
printf("* ");
printf("
");
}
}
int i,j;
开始
i=0;
i<5
真
j=0;
j<5
真
printf(“* ”);
j++;
printf(“
”)
假
结束
i++;
假
for
for
课堂练习(一)
课堂练习(二)
题目要求:
使用循环嵌套打印一个倒直角三角形。
预期输出效果示例:
* * * *
* * *
* *
*
思考提示:外层循环控制行数,内层循环控制每行打印的星号数量。随着行数增加,星号数量递减。
课堂练习(二)
程序文本:一个倒直角三角形
#include<stdio.h>
main()
{ int i,j;
for(i =5; i >0; i--)
{
for(j =0; j < i; j++)
printf(" * ");
printf("
");
}
}
int i,j;
开始
i=5;
i>0
真
j=0;
j<i
真
printf(“ * ”);
j++;
printf(“
”)
假
结束
i- -;
假
for
for
课堂练习(二)
第二部分
知识讲授
循环嵌套的应用
知识讲授:打印图形
💡 代码逻辑分析
1.外层循环 (i):控制图形的行数,从 1 到 5,共打印 5 行。
2.内层循环 (j):控制每行打印的星号数量,范围是 1 到 i,实现每行星号数递增。
3.输出效果:最终形成一个直角三角形的星号图案。
题目要求:
使用循环嵌套打印一个直角三角形。
预期输出效果示例:
知识讲授:打印图形
程序文本【5.11】打印直角三角形
#include "stdio.h"
main()
{ int i,j;
for(i=1;i<=5;i++)
{
for(j=1;j<=i;j++)
printf(" * ");
printf("
");
}
}
int i,j;
开始
i=1;
i<=5
真
j=1;
j<=i
真
printf(“ * ”);
j++;
printf(“
”)
假
结束
i++;
假
for
for
知识讲授:打印图形
知识讲授:取球问题
问题描述
从3个红球、5个白球、6个黑球中任意取出8个球,且其中必须有白球,输出所有可能的方案。
解题思路
1.确定变量:设红球x,白球y,黑球z。
2.确定范围:0≤x≤3,1≤y≤5,0≤z≤6。
3.确定条件:x + y + z = 8。
4.遍历求解:双重循环遍历x,y,计算z并判断。
int x,y,z;
开始
x=0;
x<=3
真
y=1;
y<=5
真
z=8-x-y;
输出取球方案
假
结束
x++;
假
for
for
z>=0&&z<=6
真
假
y++;
知识讲授:取球问题
程序文本:取球问题
#include<stdio.h>
main()
{ int x, y, z;
// x:红球, y:白球, z:黑球
for(x = 0; x <= 3; x++)
{
for(y = 1; y <= 5; y++)
{
z = 8 - x - y;
if(z >= 0 && z <= 6)
printf("红球:%d,白球:%d,黑球:%d
",x,y,z);
}
}
}
知识讲授:取球问题
知识讲授:打印菱形
逻辑拆解:上下分治
上半部分:利用外层循环控制行数,内层循环控制空格和星号。星号数量2*i-1递增。
下半部分:逻辑与上半部分对称,行数递减,实现倒三角。
核心技巧:双重循环
空格控制:通过n-i计算前置空格,确保图形居中对齐。
星号控制:通过2*i-1公式,实现奇数增长的星号排列。
知识讲授:打印菱形
程序文本:打印菱形
#include<stdio.h>
main()
{ int n = 5,i,j,k;
// 打印上半部分:星号递增,空格递减
for(i = 1; i <= n; i++) {
for(j = 1; j <= n - i; j++)printf(" ");
for(k = 1; k <= 2*i-1; k++)printf("*");
printf("
"); }
// 打印下半部分:星号递减,空格递增
for(i = n-1; i >= 1; i--) {
for(j = 1; j <= n - i; j++)printf(" ");
for(k = 1; k <= 2*i-1; k++)printf("*");
printf("
"); }
}
知识讲授:打印菱形
知识讲授:百钱百鸡问题
问题描述
用100元钱买100只鸡,其中公鸡5元一只,母鸡3元一只,小鸡1元三只。问公鸡、母鸡、小鸡各买多少只?
解题思路与分析
利用两层嵌套循环分别遍历公鸡(x)和母鸡(y)的可能数量,计算出小鸡数量(z=100-x-y)。通过条件判断验证是否满足总金额限制和小鸡数量的整除特性。
知识讲授:百钱百鸡问题
程序文本:百钱百鸡问题
#include<stdio.h>
main()
{ int x,y,z;
for(x= 0; x <= 20; x++)
{
for(y= 0; y <= 33; y++)
{ z= 100 - x - y;
if(z%3==0&&5*x+3*y+z/3==100)
printf("公:%d,母:%d,小:%d
",x,y,z);
}
}
}
知识讲授:百钱百鸡问题
例题分析:寻找素数
遍历待检测数字 (i)
外层循环从 2 开始,一直遍历到 100,逐个检查每个数是否符合素数条件。
素数判定 (j)
内层循环用于检验。从 2 开始到 sqrt(i),若能被整除则标记为非素数并跳出。
输出结果
若内层循环结束未发现因子,则 isPrime 保持为 1,此时打印该素数。
例题分析:寻找素数
程序文本:寻找素数
#include <stdio.h>
main()
{ int i,j,isPrime;
for(i = 2; i <= 100; i++) {
isPrime = 1;
for(j = 2; j * j <= i; j++) {
if(i % j == 0)
{ isPrime = 0; break;}
}
if(isPrime) printf("%d ", i);
}
}
例题分析:寻找素数
课堂问答
思考问题
百钱百鸡问题中,如何优化循环以减少计算量?
优化策略
通过数学推导减少循环次数。例如,根据条件推导出小鸡数量必为3的倍数,从而将步长设为3,大幅减少内层循环次数。
核心思路:利用数学关系(如倍数)优化算法逻辑,避免无效的穷举,提升程序运行效率。
课堂练习
题目要求:
使用循环嵌套打印一个等腰三角形。
💡 解题思路提示
图形分析
观察三角形的行数、每行的空格数与星号数之间的数学关系。
循环结构
外层循环控制行数,内层循环分别控制空格和星号的打印次数。
关键逻辑
每行的星号数通常为奇数递增(1, 3, 5...),空格数随之递减。
“编程不仅是代码的堆砌,更是逻辑思维的艺术。”
课堂练习
程序文本
#include<stdio.h>
main()
{
int n = 5,i,j,k;
for(i = 1; i <= n; i++) {
for(j = 1; j <= n - i; j++)
printf(" ");
for(k = 1; k <= 2 * i - 1; k++)
printf("*");
printf("
");
}
}
课堂练习
课堂小结
核心概念
循环嵌套是指一个循环体内包含另一个完整的循环结构,形成层级关系。
语法规则
三种循环(for/while/do-while)可相互嵌套,但必须保证完整包含,严禁交叉。
执行流程
遵循“外一内全”原则:外层循环执行一次,内层循环必须完整执行一遍。
应用场景
广泛应用于二维数组遍历、图形图案打印、矩阵运算及复杂算法实现。
注意事项
内外层循环变量禁止同名;循环条件需设置合理,避免逻辑错误导致的死循环。
核心价值
循环嵌套是C语言处理复杂重复性任务的基石,掌握它是进阶编程的关键。
“ 掌握循环嵌套的执行逻辑,能让我们的代码更高效地解决实际问题。 ”
课堂小结
课后任务
编程题一:打印空心正方形
使用循环嵌套(例如 for 循环)打印一个空心的正方形。要求能够控制正方形的边长,并且只有边框由星号(*)组成,内部为空格。
编程题二:求解鸡兔同笼
经典数学建模问题。已知鸡和兔的总头数为 n,总脚数为 m,编写程序计算并输出笼子里鸡和兔分别有多少只。注意考虑输入数据的合法性。
请将代码保存为以学生名字命名的文件,下节课开始前提交至作业系统
谢谢观看
THANKS
$