目录
引言:
在之前写过的程序里,循环这个东西的使用频率非常高,无论我们是实现基础C语言题目,例如打印一维数组、杨辉三角、打印九九乘法表还是实现种类繁多且适用场景不同的排序算法,例如,冒泡排序,选择排序,插入排序,希尔排序,这些程序都像一个树状的结构,我们先要梳理清楚程序的原理,然后再将原理转化为机器语言,这些程序的主干部分就是循环,然后再在循环里分出枝干并进行功能的完善,最终完成整个程序。在这篇文章里,我将对for循环进行详细的分析。
分析:
对双层for循环的分析:
我们写一个双层for循环来看看他的运行结果,并从运行结果对这个程序进行逻辑分析:
int main()
{
int i = 0,j = 0;
for(int i = 0;i <= 3;i++){
printf("外层for循环:%d",i);//每执行一次外部循环打印一次外部
for(int j = 0;j <= 3;j++){
printf("内层for循环:%d",j);每执行一次内部循环打印一次内部
}
printf("\n");
}
return 0;
}
运行结果:
从运行结果上来看, 一共有四行五列,有二十个运行结果,也就是说这个程序执行了20次。而且每一行都是以外层循环开始,以内层循环结束,也就是说每执行一次for循环的条件就是将外层for循环的内层for循环全部执行完成,然后外部循环变量加1,再将内层循环变量从初始值执行至最终值后跳出内层循环,继续执行外层循环,直至将外层循环变量从初始值执行至最终值。
总结:每执行一次外层循环,要将外层循环中的内层循环全部执行完成,再进行第二次外层循环的执行。
将双层for循环中的循环条件进行关联:
同样的,我们将原程序的双层循环中的语句进行变换,我们将第二层循环中的循环变量和第一层中的循环变量进行联系,再来看看输出结果:
int main()
{
int i = 0,j = 0;
for(int i = 0;i <= 3;i++){
printf("外层for循环:%d",i);//每执行一次外部循环打印一次外部
for(int j = 0;j <= i;j++){
printf("内层for循环:%d",j);每执行一次内部循环打印一次内部
}
printf("\n");
}
return 0;
}
运行结果:
我们看到内层for循环执行的次数和外层循环变量值是相同的,这个就是在99乘法表和冒泡排序中的方法,因为这两个程序的双层for循环中的外部循环变量和内部循环条件是具有关联性的。
对双层for循环的逻辑分析:
我们通过图示的方法对程序进行分析:
这张图可以对应上面我们对双层for循环的文字分析。
对多层for循环的分析:
我们写一个三层for循环的程序来看看它的运行结果并对这个结果进行分析:
#include<stdio.h>
int main()
{
int i = 0,j = 0;
for(int i = 1;i <= 3;i++){
printf("外层for循环:%d",i);
printf("\n");
for(int j = 1;j <= 3;j++){
printf("\n");
printf("中层for循环:%d",j);
printf("\n");
for(int k = 1;k <= 3;k++){
printf("内层for循环:%d",k);
printf("\n");
}
}
printf("\n");
}
return 0;
}
运行结果:
Last login: Mon Sep 5 11:25:49 on ttys002
pg.zeng@cengduodeMBP ~ % /Users/pg.zeng/Desktop/my_function/test ; exit;
外层for循环:1
中层for循环:1
内层for循环:1
内层for循环:2
内层for循环:3
中层for循环:2
内层for循环:1
内层for循环:2
内层for循环:3
中层for循环:3
内层for循环:1
内层for循环:2
内层for循环:3
外层for循环:2
中层for循环:1
内层for循环:1
内层for循环:2
内层for循环:3
中层for循环:2
内层for循环:1
内层for循环:2
内层for循环:3
中层for循环:3
内层for循环:1
内层for循环:2
内层for循环:3
外层for循环:3
中层for循环:1
内层for循环:1
内层for循环:2
内层for循环:3
中层for循环:2
内层for循环:1
内层for循环:2
内层for循环:3
中层for循环:3
内层for循环:1
内层for循环:2
内层for循环:3
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
[进程已完成]
从运行结果上来看,一共有39个结果,说明循环语句一共执行了39次。每一次执行完外层循环条件再转向中层循环条件,再将内层循环全部执行完,再跳转到中层循环,中层循环操作加一,在把内层循环全部执行一遍,跳转至中层循环,这样执行中层循环,知道中层循环条件从初始值执行至最终值,再跳转到外层循环操作加一,再次执行上述操作直至将外层循环全部执行完。
将多层循环中的循环条件进行关联:
此时我们再将外层、中层、内层的循环条件关联起来看看结果:
#include<stdio.h>
int main()
{
int i = 0,j = 0;
for(int i = 1;i <= 3;i++){
printf("外层for循环:%d",i);
printf("\n");
for(int j = 1;j <= i;j++){
printf("中层for循环:%d",j);
printf("\n");
for(int k = 1;k <= j;k++){
printf("内层for循环:%d",k);
printf("\n");
}
}
printf("\n");
}
return 0;
}
运行结果:
分析规律:
第一次外层循环:
i的值为1,中层循环限定条件为j <= i 所以中层循环执行一次,j的值为1,内层循环限定条件为k <= j,所以内层循环执行一次。
第二次外层循环:
此时外层循环操作加一,i的值变为2,中层循环条件变为j <= 2,所以中层循环需要执行两次,中层循环执行的第一次,内层循环条件变为k <= 1,此时内层循环也执行一次;中层循环执行的第二次,内层循环条件变为k <= 2,所以内层循环执行两次。
第三次外层循环:
此时外层循环操作加一,i的值变为3,中层循环条件表为j <= 3,所以中层循环需要执行三次,中层循环执行的第一次,内层循环的循环条件为k <= 1,所以内层循环执行一次,中层循环执行的第二次,内层循环的循环条件变为k <= 2,所以内存循环执行两次,中层执行的第三次,内层循环的循环条件变为k <= 3,所以内层循环执行三次。
至此,外层循环执行完毕,程序运行结束。
对多层for循环的逻辑分析:
这么看来,多层for循环的执行顺序是和双层for循环十分相似的,或者可以说是基于双层for循环的,只要彻底裂解了前面的双层for循环,后面的三层甚至是四层五层都是可以理解的。
练习:
题目一:通过程序打印正三角形、倒三角形、等腰三角形、菱形:
正三角形:
倒三角形:
等腰三角形:
菱形:
正三角形的程序代码:
#include<stdio.h>
int main()
{
int i = 0,j = 0;
printf("打印出的图形为:\n");
for(i = 1;i <= 5;i++){
for(j = 1;j <= i;j++){
printf("*");
}
printf("\n");
}
return 0;
}
运行结果:
倒三角形的程序代码:
#include<stdio.h>
int main()
{
int i = 0,j = 0;
printf("打印出的图形为:\n");
for(i = 1;i <= 5;i++){
for(j = 5;j >= i;j--){
printf("*");
}
printf("\n");
}
return 0;
}
运行结果:
对等腰三角形图形的分析:
在写这个代码之前我们先要对等腰三角形这个图形在控制台中的构造进行分析:
等腰三角形程序代码:
#include<stdio.h>
int main()
{
int i = 0,j = 0;
for(i = 1;i <= 5;i++){
for(j = 5;j >= i;j--){
printf(" ");
}
for(j = 1;j <= i;j++){
printf("* ");
}
printf("\n");
}
return 0;
}
运行结果:
对菱形的图形分析:
菱形的程序代码:
#include<stdio.h>
//把菱形分为两部分,上半部分五行,下半部分四行
int main()
{
int i = 0,j = 0;
for(i = 1;i <= 5;i++){//上半部分
for(j = 5;j >= i;j--){
printf(" ");
}
for(j = 1;j <= i;j++){
printf("* ");
}
printf("\n");
}
for(i = 1;i <= 4;i++){//下半部分
for(j = 1;j <= i;j++){
printf(" ");
}
for(j = 4;j >= i;j--){
printf(" *");
}
printf("\n");
}
return 0;
}
运行结果:
题目二:通过程序打印99乘法表
99乘法表程序代码:
#include<stdio.h>
int main()
{
int i = 0,j = 0;
printf("打印出的图形为:\n");
for(i = 1;i <= 9;i++){
for(j = 1;j <= i;j++){
printf("%d*%d=%d ",i,j,i*j);
}
printf("\n");
}
return 0;
}
运行结果:
对for循环的总结:在写for循环的程序时,对程序的逻辑一定要十分清楚,对一个程序的思路和分析是远远比敲代码要重要的,写一个程序首先要做的就是摸清楚这个程序的原理。