练手篇:
刚刚开始练手循环结构,肯定柿子要挑软的捏。于是我拿了第一个,开始练手之旅。
按照老师开始讲的例题,我一开始先想的是这个图形应该可以分成两部分来考虑比较简单。第一部分为i<=4,第二部分为i<=5。然后考虑的是行,列之间的关系第一部分分成空格和*,所以先考虑输出空格的数量关系,空格数为4,3,2,1,所以for应该写j=1;j<=5-i;j++,其次考虑*的数量关系1,3,5,7所以for应该写k=1;k<=2*i-1;k++。然后考虑第二部分的for就很简单了空格为j=1;j<=i;j++,*应该写j=1;j<=11-2*i;j++。
#includemain(){ int i,j,k; for (i=1;i<=4;i++) { for (j=1;j<=5-i;j++)//这一段出了问题 printf(" "); for (k=1;k<=2*i-1;k++) printf("*"); printf("\n"); } for (i=1;i<=5;i++) { for (j=1;j<=i;j++) //空格的起始值应该是0 printf(" "); for (j=1;j<=11-2*i;j++) printf("*"); printf("\n"); } }
待我仔细一看,不对啊,出了问题,第四行的代码上了一个空格,所以我灵机一动,把空格的代码改了,由j=1;j<=5-i;j++改成了j=1;j<=6-i;j++。
果然没错,要让第四行输出一个空格。感觉应该没错了,但是我发现了一个硬伤,好像第5行又多了一个空格所以图形显得如此相像。我才感觉我的图片有点怪怪的。所以问题应该不仅是那个应该是第二次的代码空格的起始值应该是0。所以最终代码应该为
#includemain(){ int i,j,k; for (i=1;i<=4;i++) { for (j=1;j<=5-i;j++) printf(" "); for (k=1;k<=2*i-1;k++) printf("*"); printf("\n"); } for (i=1;i<=5;i++) { for (j=0;j<=i-2;j++) printf(" "); for (j=1;j<=11-2*i;j++) printf("*"); printf("\n"); } }
总结
重难点:
for语句、while语句和do while语句和if语句和goto语句组合的循环。
1.for语句一般形式:
for(<初始表达式>;<条件表达式>;<循环变量表达式>)
{ <循环体语句>}2.while语句的一般形式:
while(<条件表达式>)
{ 循环语句循环变量表达式}3.do-while语句的一般形式:
do
{ <循环体语句>}while(<条件表达式>);4.break与continue的作用与区别:
break语句既可用于switch语句结构,又可用于循环语句结构,其作用是跳出控制结构语句。而continue语句不会中止循环,而是在<循环语句体>没有执行完的情况下,结束当前循环,提前进入下一个循环。
break语句和continue语句都会破坏程序的结构化,使程序变成非结构化的程序,在解决问题时应该尽量避免使用这两种语句。5.循环结构的嵌套:一种循环结构里包含另一种循环结构。使用嵌套结构时要注意嵌套的层次,不能交叉,嵌套的内外循环不能使用同名的循环变量,并列结构的内外循环允许使用同名的循环变量。
感觉自己还是太年轻了,开始以为解决了第一个错误,却在错误的道路上越走越远。for语句中的起始值很重要,你要想好到底是从0开始还是从1开始,从1开始和从0开始是两种不同的写法,比如我的错误改法有两种,第一种是i=0;j<=i-2;j++第二种是i=1;j<=i-1;j++。然后是行列关系表达式,最后是循环语句规范书写。我觉得这是我循环结构中的总结的反思,保持对c的敬畏,好好学c,好好学循环。