第五章 循環結構課後反思
本次循環結構練習選取了最後一個圖案進行打印,因為感覺是這些圖形中最難的。
目標圖案:
分析:
如圖所示:該圖形可以分為6個部分,其中要使用3個for循環大的框架(藍色區域);然後使用for語句在大的框架裏面嵌套(藍色區域的紅色分界線)。
分析完畢,開始踏上不歸路
一步步來,先打印出最上面那個三角形來再說:
1 #include<stdio.h> 2 intmain() 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語言和其他學科的學習同樣至關重要。
第五章 循環結構課後反思