博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第五章 循环结构课后反思
阅读量:5918 次
发布时间:2019-06-19

本文共 3833 字,大约阅读时间需要 12 分钟。

第五章 循环结构课后反思

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

 

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

目标图案:

 

分析:

 

如图所示:该图形可以分为6个部分,其中要使用3个for循环大的框架(蓝色区域);然后使用for语句在大的框架里面嵌套(蓝色区域的红色分界线)。

 

 分析完毕,开始踏上不归路

 

一步步来,先打印出最上面那个三角形来再说:

1 #include
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
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
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
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
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

 

可以看到上面使用了4个for框架

运行结果:

可以看出明显错误,无法拼接到上面去

 此方法淘汰 


 

 

第二种

在第三个for框架中嵌套3个for循环

代码如下:

1 #include
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语言和其他学科的学习同样至关重要。

 

转载于:https://www.cnblogs.com/AwakenZed/p/10691322.html

你可能感兴趣的文章
159.3. salt 命令
查看>>
UWP 统一平台开发介绍
查看>>
15.25. Search
查看>>
互联网风控技术SaaS服务平台聚信立获1亿元B轮融资
查看>>
低碳城市建设市场大 索泰能源切中分布式光伏需求
查看>>
工业物联网设备投资 从这三个地方可回收成本
查看>>
Windows 10隐私设置被用户狂吐槽:微软无力回应
查看>>
爱立信股价持续下跌 股东欲撤换CEO
查看>>
ARM免预付授权费用计划增加Cortex-M3架构设计 加速物联网发展
查看>>
大数据影响人类认知和行为习惯
查看>>
最受合作伙伴瞩目的5大新品和10大解决方案 | 科达2016巡展盘点
查看>>
数据中心里云应用部署的尴尬现状
查看>>
诺基亚支持韩国铁路移动宽带网络
查看>>
意法半导体嘴硬:我们有三大业务 苹果砍订单影响不大
查看>>
涨价停不下来?最主要的元凶还是闪存
查看>>
MySQL Group Replication 学习笔记
查看>>
并发性能测试程序编写
查看>>
Oracle Database 12c - Global Data Services
查看>>
全球微型逆变器霸主Enphase要夺回失地
查看>>
【MySQL】磁盘写满之后,数据库show status受到阻塞的原因
查看>>