第五章 循环结构课后反思

第五章 循环结构课后反思

                                                         ------------周萌

 

本次循环结构练习选取了最后一个图案进行打印,因为感觉是这些图形中最难的。

目标图案:

 

分析:

 

如图所示:该图形可以分为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 }

 

运行一下试试:

可以,得出了答案

但是剩下的一半倒三角怎么办呢?

这时又两种选择:

  1. 再创建一个for语句,打印出倒三角,试试看能不能拼到上图从而形成完整图形;

  2. 在上一个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语言和其他学科的学习同样至关重要。

 

posted @ 2019-04-11 17:56  声微、饭否  阅读(226)  评论(0编辑  收藏  举报