第五章 循环结构课后反思
本次循环结构练习选取了最后一个图案进行打印,因为感觉是这些图形中最难的。
目标图案:
分析:
如图所示:该图形可以分为6个部分,其中要使用3个for循环大的框架(蓝色区域);然后使用for语句在大的框架里面嵌套(蓝色区域的红色分界线)。
分析完毕,开始踏上不归路
一步步来,先打印出最上面那个三角形来再说:
1 #include<stdio.h> 2 int main() 3 { 4 int i,j,k,m; 5 for(i=1;i<=5;i++) 6 { 7 for(j=i;j<=5;j++) 8 printf(" "); 9 for(k=1;k<=(2*i-1);k++) 10 printf(" *"); 11 printf("\n"); 12 }
都不带喘气的打完了上面的代码,瞬间感觉自己好牛逼啊哈哈哈
当我按下
出现了这个:
哎?怎么这个图形离左边界这么远啊?感觉好像有点不对劲,,,emmmmm不管了,反正图案的形状是对的。 (依旧挺起了高傲的胸膛)
继续进行下一步,打印中间两条星号组成的图案
这怎么能难倒我这个小天才呢?仍然是飞快的打完了代码:
1 #include<stdio.h> 2 int main() 3 { 4 int i,j,k,m; 5 for(i=1;i<=5;i++) 6 { 7 for(j=i;j<=5;j++) 8 printf(" "); 9 for(k=1;k<=(2*i-1);k++) 10 printf(" *"); 11 printf("\n"); 12 } 13 for(i=1;i<=2;i++) 14 { 15 for(j=1;j<=9;j++) 16 { 17 printf(" *"); 18 printf("\n"); 19 } 20 } 21 }
然而当我按下了
出现了这个结果:
啊仔细一看,原来是换行那里出现了问题啊,吓死我了,改一下就行了,把第二个printf("\n");移动至大括号外面即可。
1 #include<stdio.h> 2 int main() 3 { 4 int i,j,k,m; 5 for(i=1;i<=5;i++) 6 { 7 for(j=i;j<=5;j++) 8 printf(" "); 9 for(k=1;k<=(2*i-1);k++) 10 printf(" *"); 11 printf("\n"); 12 } 13 for(i=1;i<=2;i++) 14 { 15 for(j=1;j<=9;j++) 16 { 17 printf(" *"); 18 19 } 20 printf("\n"); 21 } 22 }
机智如我,一下子就发现了问题所在
再次霸气的按下
出现了:
咦?怎么歪了?不应该啊,设置的数字也没错啊,上下几个for语句的循环次数都是和星号的个数一样啊。 (好气啊)
经过一番缜密的推论🤨,我发现了一个错误:
可以看出,这个for循环是批量输出“ ”(三个空格)的循环,联系外层的for循环,
当i=5的循环:因为j<=5,所以还要执行一次循环,即在第五层再输出一个“ ”,实际上第五层已经不需要再输出“ ”了,所以出现了上文中提出的 与左边界距离有点远的问题。
将j<=5改为j<5;按下
输出正确,继续
接下来,貌似是进入了最难的部分啊
再看一下分区:
分析:三个区域,中间的空格部分正好是三角形,左边是一个倒三角,和之前的很相似:
只是“ ”和“ *”的位置完全反了过来而已
在代码中按照这个把“ ”和“ *”的位置反过来:
1 #include<stdio.h> 2 int main() 3 { 4 int i,j,k,m; 5 for(i=1;i<=5;i++) 6 { 7 for(j=i;j<5;j++) 8 printf(" "); 9 for(k=1;k<=(2*i-1);k++) 10 printf(" *"); 11 printf("\n"); 12 } 13 for(i=1;i<=2;i++) 14 { 15 for(j=1;j<=9;j++) 16 printf(" *"); 17 printf("\n"); 18 } 19 for(i=1;i<=4;i++) 20 { 21 22 for(j=i;j<5;j++) 23 printf(" *"); 24 for(k=1;k<=2*i-1;k++) 25 printf(" "); 26 printf("\n"); 27 } 28 }
运行一下试试:
可以,得出了答案
但是剩下的一半倒三角怎么办呢?
这时又两种选择:
-
再创建一个for语句,打印出倒三角,试试看能不能拼到上图从而形成完整图形;
-
在上一个for语句框架中再嵌套一个for循环,一共嵌套三个for循环;
第一种
代码:
1 #include<stdio.h> 2 int main() 3 { 4 int i,j,k,m; 5 for(i=1;i<=5;i++) 6 { 7 for(j=i;j<5;j++) 8 printf(" "); 9 for(k=1;k<=(2*i-1);k++) 10 printf(" *"); 11 printf("\n"); 12 } 13 for(i=1;i<=2;i++) 14 { 15 for(j=1;j<=9;j++) 16 printf(" *"); 17 printf("\n"); 18 } 19 for(i=1;i<=4;i++) 20 { 21 22 for(j=i;j<5;j++) 23 printf(" *"); 24 for(k=1;k<=2*i-1;k++) 25 printf(" "); 26 printf("\n"); 27 } 28 for(i=1;i<=4;i++) 29 { 30 for(j=1;j<i;j++) 31 printf(" "); 32 for(k=i;k<=4;k++) 33 printf(" *"); 34 printf("\n"); 35 } 36 }
可以看到上面使用了4个for框架
运行结果:
可以看出明显错误,无法拼接到上面去
此方法淘汰
第二种
在第三个for框架中嵌套3个for循环
代码如下:
1 #include<stdio.h> 2 int main() 3 { 4 int i,j,k,m; 5 for(i=1;i<=5;i++) 6 { 7 for(j=i;j<5;j++) 8 printf(" "); 9 for(k=1;k<=(2*i-1);k++) 10 printf(" *"); 11 printf("\n"); 12 } 13 for(i=1;i<=2;i++) 14 { 15 for(j=1;j<=9;j++) 16 printf(" *"); 17 printf("\n"); 18 } 19 for(i=1;i<=4;i++) 20 { 21 22 for(j=1;j<=5-i;j++) 23 printf(" *"); 24 for(k=1;k<=2*i-1;k++) 25 printf(" "); 26 for(m=1;m<=5-i;m++) 27 printf(" *"); 28 printf("\n"); 29 } 30 31 }
输出结果如下:
此方法可行
啊啊啊啊啊啊!终于输出正确了! (我可真是个小机灵鬼)
代码分析:
在第一个和第三个for语句的嵌套中,使用了j<=5-i和m<=5-i这样的判定条件,即每换行一次,输出的星号减少一,正好符合目标图的结果。
反思
对于循环结构的嵌套不是很清楚,经常打错代码,出现一些奇奇怪怪的图形,练习时间少。
重难点我觉得都是对于for语句的嵌套结构,经常搞混,尤其是画图部分。
不是很麻烦,但也出现了几次错误,尤其需要锻炼在短时间内找出来并正确改正问题的能力,这对C语言和其他学科的学习同样至关重要。