从单片机基础到程序框架(全集 2019pdf版).pdf - 第216页

根据此顺序 ,再看一个具 体的程序例子 : a=0; b=0; for(i=0;i< 2;i++) //大循 环 { a=a+1; //被执 行了 2 次 for(k=0; k<3;k++) // 内嵌的小循 环 { b= b+1; //被执 行了 6 次 } } 上述例子中 , 执行 完程序后,a 的值 变成了 2,b 的值 变成了 6。重点分析 b 的变化, “b= b+1” 在内嵌循 环体 里被执 行了 6 次 ,6 …

100%1 / 836
第五十一节: for while 的循环嵌套。
【51.1 循环的嵌套。
大循环的内部又包含了小循环,称为循环嵌套。生活中,循环嵌套的现象很常见,一 12 月,假设
每个月都是 30 天(仅仅假设而已),1 月份 30 天,2 月份 30 天......11 月份 30 天,12 月份 30,这里的年
就是大循环,年内部的月就是小循环。一年 12 个月,大循环就是 12 次。一个月 30 天,小循环就是 30
for 语句来表达,大意如下
for(m=1;m<=12;m++) //大循环。一 12 个月。这里 m 看作月,代表一年 12 个月的大循环。
{
for(d=1;d<=30;d++) //内嵌小循环。一月 30 天。这里的 d 看作天,代表一个 30 天的小循环。
{
}
}
【51.2 循环嵌套的执行顺序。
例子如下:
for(i=0;i<2;i++) //大循
{
语句 1;
for(k=0;k<3;k++) //内嵌的小循
{
语句 2;
}
语句 3;
}
上述例子中 i for 称为大循环 k for 称为小循环单片机从大循环入口进来由上往下执
行,执行第 1 次大循环,先执行 1 “语句 1”,接着进入小循环,小循环要连续循环执行 3 “语句 2”
跳出小循环,之后执行 1 “语句 3”然后再返回到大循环入口判断 i 条件是否满足此时条件满足,继续
执行第 2 次大循环,1 “语句 1”,3 “语句 2”1 次“语句 3”,第 2 次循环结束后又返回到大循环入口
判断 i 条件,此时 i 已经等于 2 不再小于 2 因此条件不满足结束整个循环嵌套上述执行的语句顺
如下:
语句 1; //第 1 次大循环开始
语句 2;
语句 2;
语句 2;
语句 3;
语句 1; //第 2 次大循环开始
语句 2;
语句 2;
语句 2;
语句 3;
根据此顺序,再看一个具体的程序例子
a=0;
b=0;
for(i=0;i<2;i++) //大循
{
a=a+1; //被执行了 2
for(k=0;k<3;k++) //内嵌的小循
{
b= b+1; //被执行了 6
}
}
上述例子中执行完程序后,a 的值变成了 2,b 的值变成了 6。重点分析 b 的变化,“b=b+1”在内嵌循
环体里被执行了 6 ,6 从何而来?就是 i 乘以 k 6。这个乘法次数是循环嵌套一个很重要的特性。
上述程序如果用 while 语句来实现,等效如下:
a=0;
b=0;
i=0; //控制大循环的变量初始化
while(i<2) //大循环
{
a=a+1; //被执行了 2
k=0; //控制小循环的变量初始化
while(k<3) //内嵌的小循环
{
b= b+1; //被执行了 6
k=k+1;
}
i=i+1;
}
【51.3 循环嵌套的常见用途---二维数组的应用。
二维数组 a[2][3],它有 6 个变量,在没有 for 语句之前,如果要依次把每个元素单独赋值清零真不
容易,要写 6 次赋值语句如下:
a[0][0]=0;
a[0][1]=0;
a[0][2]=0;
a[1][0]=0;
a[1][1]=0;
a[1][2]=0;
自从懂了 for 嵌套语句之后,可以让同样功能的代码简洁许多。上述代码等效于如下:
for(i=0;i<2;i++) //大循
{
for(k=0;k<3;k++) //内嵌的小循
{
a[i][k]=0;
}
}
【51.4 循环嵌套的常见用途---大延时。
单片机项目会经常会用到 delay 这个延时函数,大部分都是利用 for 循环来实现,小延时的函数往往
用嵌套,直接如下编写:
for(k=0;k<N;k++);
上述的 N 是控制循环次数,每次循环都要消耗单片机一点时间,如果 N 越大需要消耗的时间就越多,
到延时的作用。但是 N 所能取的最大值受它所定义的类型所限制,比如 unsigned char 类型最大范围是 255,
unsigned int 类型最大范围是 65535,unsigned long 类型最大范围是 4294967295。如果要实现更大的延时
怎么办?就可以用 for 的循环嵌套,利用循环嵌套可以使得循环总次数进行乘法翻倍的放大,很容易编写
延时的函数。比如:
for(i=0;i<M;i++) //大循
{
for(k=0;k<N;k++); //内嵌的小循环
}
此时 N 乘以 M N M unsigned long 类型
4294967295 的平方,次数大到惊人。
【51.5 例程练习和分析。
现在编写一个循环嵌套的练习程序。
程序代码如下:
/*---C 语言学习区域的开始。-----------------------------------------------*/
unsigned char a=0; //观察这个数最后的变化
unsigned char b=0; //观察这个数最后的变化
unsigned char c=0; //观察这个数最后的变化
unsigned char i; //控制大循环体的条件判断变量
unsigned char k; //控制内嵌小循环体的条件判断变
void main() //主函数
{
for(i=0;i<2;i++) //大循
{
a=a+1; //被执行了 2
for(k=0;k<3;k++) //内嵌小循环
{
b=b+1; //被执行了 6 次,也就是 i 乘以 k,2 3 等于 6.
}