本次循环结构练习选取了最后一个图案进行打印,因为感觉是这些图形中最难的。
目标图案:
分析:
如图所示:该图形可以分为6个部分,其中要使用3个for循环大的框架(蓝色区域);然后使用for语句在大的框架里面嵌套(蓝色区域的红色分界线)。
分析完毕,开始踏上不归路
一步步来,先打印出最上面那个三角形来再说:
1 #include2 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 #include2 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 #include2 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 #include2 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 #include2 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
可以看到上面使用了4个for框架
运行结果:
可以看出明显错误,无法拼接到上面去
此方法淘汰
第二种
在第三个for框架中嵌套3个for循环
代码如下:
1 #include2 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语言和其他学科的学习同样至关重要。