


摘要:C語言由于應用面廣,因此很多高校都會選擇C語言作為基礎程序設計開發語言,但由于C語言學習難點較多,因此學習效果不太好。本文主要針對其中難點之一多重循環的教學,提出自己的見解和解決方法。
關鍵詞:C語言;教學難點;多重循環
中圖分類號:TP3 文獻標識碼:A
文章編號:1009-3044(2019)34-0153-03
C語言由于它既能直接進行面向高層的應用開發也可進行面向底層的系統開發,因此應用面廣,是非常受歡迎的主流語言之一,因此很多高校在進行程序設計基礎語言教學時都選擇了C語言。但由于它的語法規則繁多,內容抽象,知識點多,所以存在很多知識點學生很難掌握,學習效果不太理想。本文主要針對其中的多重循環教學中的難點問題提出個人的見解和解決問題的思路。希望對同行或學習C語言的人有所啟發和幫助。
1 多重循環教學中存在的問題
因為循環結構是構成結構化程序設計的基本結構之一,在實際求解問題的過程中也常常遇到,比如輸入全班同學的信息,求若干個數之和,求最大公約數,排序等等,因此循環結構是一個非常重要的知識點,必須掌握。通常對于一重循環(也就是只包含一個完整循環結構的循環),只要把3個基本語句:while,dowhile和for語句的基本語法結構、流程講清楚,然后通過典型案例加以分析、現場編程演示實現,最后再講清楚while和dow-hile之間的區別,while語句、dowhile語句和for語句之間如何轉換,用特例轉換演示一編,讓他們徹底弄懂。那么一重循環的知識點差不多就講解完了,因為比較簡單學生們通常都比較好掌握。不會存在很大問題,如個別有問題就單獨有針對性講解就可以了。
但是一遇到多重循環,也就是含有二重或二重以上循環的問題,學生就很容易犯糊涂了。比如:面對具體問題時,他們不知道該如何嵌套,內外層循環的次數如何控制,循環判斷條件特別是內層的循環判斷條件該如何設置,流程如何走等等。
2 多重循環問題的解決辦法
多重循環也就是如果在一個循環體內又包含另一個完整的循環結構,則稱為多重循環,也稱嵌套循環。內嵌的循環中還可以繼續嵌套。
通常對于學生在學習多重循環過程中遇到的難點,本人會通過選擇有一定內在關聯但看起來又比較簡單直觀的一系列案例逐層遞進,循序漸進的來講,讓學生弄懂是如何由一重循環可以逐漸演變成多重循環,同時如何來實現這樣的多重循環的編程。多重循環中通常重點講解二重循環,因為二重循環弄懂了,二重以上也可用類似的思路處理。為了程序看起來簡潔,案例中的循環語句均用for語句來實現。至于其他的循環語句,只需按相互之間的語法轉換關系進行變換就可以了。
案例1:讓學生輸出一行單個的*號,目的是復習下c語言程序的基本結構及輸出語句的寫法,特別是換行的實現。
編程輸出如圖1所示的圖形!
圖1單%號圖形
代碼如下:
#include
int main0
{
printf(”*\n”);
return 0:
)
很顯然在上例中就是簡單的輸出一個“*”號然后回車,同學們在以前學習的基礎上輕易可以實現程序!然后在案例1的基礎上進行變化,變化出案例2和案例3,此時代碼部分都讓學生自行當場完成!
案例2:讓學生復習簡單的多列重復輸出
請輸出如圖2所示的圖形!
********
圖2單行8個連續的*號圖形
現在可能學生的結果大致上會有以下2種不同的代碼會出現,第一種:
#include
int main0
{
printf(”********\n”);//直接連續輸出8個*
return 0:
)
第二種,結合前面講的單層循環寫出的語句
#include
int main0
{
inti:
for(i=1;i<=8;i++)
printf(”*”);
printf(”\n”);
return 0:
)
很顯然第2種代碼是我們在講了單層循環后希望看到的結果,但如果出現第1種代碼說明部分學生對單層循環還沒掌握,此時正好再次復習強調何時使用循環語句:就是在滿足一定的條件時,如果反復做某種事情就采用循環語句;上面的圖形是一行輸出8個*,當然既可以用字符串的形式一次性輸出,但也可以把它分解為單獨的8個*,每次輸出一個*,則重復輸出8次即可!剛好滿足循環的概念。于是定義循環變量i,起點若設為1,則一共要循環8次,所以終點置為8,步長為1;在輸出*完畢后還要注意輸出換行符。用for語句實現就是上面的程序段。此處還可以強調i的初值不一定非要為1,而只要保證起始點的值及步長的控制使得輸出的結果剛好滿足題目要求即可,比如改為:i_2;i<=9;i++同樣可以實現相應的功能。這樣使得學生對循環次數的控制更清楚了。但通常使用1作為起點很頻繁,是因為方便計數。
此處小結時可提醒同學們注意:可以把非循環的語句:printf(“********”);替換成一層循環語句:
for(i=1;i<=8;i++)
printf(”*”);
案例3:讓學生實現簡單的多行重復輸出
請輸出如圖3所示的圖形!
此時依然由學生寫出代碼,但很多同學會出現以下類似的錯誤,代碼如下:
#include
int main0
{
inti:
for(i=1;i<=8;i++)
printf(”*”);
printf(”*);
return 0:
)
先讀代碼分析執行結果與案例2的結果相同,然后應著重分析他們寫法上的錯誤:只在書寫形式上讓printf(''*”);和printf(”*”);處于同一層次,但在邏輯上并不屬于同一個層次;因為沒有用大括號將這2個語句括起來組成復合語句塊一起構成for的循環體,因此for的循環體只包含輸出*的語句,而不包含輸出換行語句;于是實質與案例2的代碼結果相同。讓學生注意分清循環體的內容及包含多個語句的循環體的寫法,避免以后出現類似錯誤。
因此對應圖3的正確代碼為:
#include
int main0
{
inti:
for(i=1;i<=8;i++)
{
printf(”*”);
printf(”\n”);
)
return 0:
)
當然也可以將2個輸出語句合并為一個寫出,寫作:printf(”*\n”);上面的寫法是為了后面的案例作鋪墊。
到目前為止所有圖形看起來都還很簡單,要不就是單行,要不就是單列,所以通過一重循環就可以實現了。從這里也可以總結出單行或單列的圖形也就是線性圖形可以通過一重循環來實現;如果演變為一個平面圖形的話呢?
案例4輸出多行多列的圖形
請輸出如圖4所示的圖形!
此時不直接講二重循環的代碼,而還是先用一重循環的代碼來實現;
為了直觀首先將上面圖4稍加變形,因為每行都含8個連續的*,即每行的內容是相同的,假設現在每行的具體內容都由一個長方形的框覆蓋了,則圖4變成了圖5:
對于圖5圖形的輸出,完全可以參考案例3的方法進行編程,與案例3比較,只是行數由8變成了4,“*”變成了長方形的框,所以循環變量的i的起點設為1,終點設為4,步長為l,因此可輕易寫出對應的一重循環的重點代碼如下(其他代碼部分同上,省略):
for(i=1;i<=4;i++)
f
printf(”廣———1”);//輸出長方形框
printf(”\n”);
)
現再將長方形框揭開,恢復為8個*;也就是需一行連續輸出8個*,剛好可以借助案例2的思路,替換printf(“□□”);為:for(i=l;i<=8;i++) printf(”*”);為另一個一重循環,但變量i已經用過,所以把i換成J;現在替換后的重點代碼如下(為了突出第二重循環,專門在外面加了一對大括號):
for(i_1;i<=4;i++)
{
{
for(j=1;j<=8;j++)
printf(”*f).
}
printf(”\n”);
)
由上面代碼可以顯式地看出,在一個for循環體中完整的嵌套了另外一個for循環語句,已是一個兩重循環了。這樣讓學生很輕松自然的就過渡到多重循環,并且很好定位內外層循環變量的起始點及步長等。同時通過這個題目還要提醒學生注意,一個平面圖形通常需要一個兩重循環來實現。再總結通常外層循環控制行數,內層循環控制列數。外層循環變量改變1次,內層循環的變量值從頭至尾改變一趟等重要知識點。
如果上面不采用這種方式,而是講完多重循環的概念和基本嵌套結構后,就直接講解案例4,以及案例4對應的代碼,學生就會感覺很難,很不好懂。
有了以上基礎后,可以在此基礎上繼續加深,比如輸出案例5等腰直角三角形的圖案。
案例5:請輸出圖6所示的圖形
分析:首先因為是一個平面圖形,所以要采用兩重循環.外層循環控制行數,如果行變量用i表示,一共有5行,則i從1變到5;內層循環控制列數,列變量用j來表示;現在主要分析列變量的取值范圍,從1到多少?引導學生思考當前行標和當前行的總列數之間的關系。因為是等腰直角三角形,所以在對角線上行標和列標之間剛好j=i,故在此之前均有j
在以上分析的基礎上畫出流程圖(流程圖省),然后依照流程圖寫出二重循環核心的代碼如下:
for(i=1;i<=5;i++)
{
{
for(j=1j<=ij++)
printf(”*”);
)
printf(”\n”);
)
隨著學生掌握越來越熟練,此時再讓他們注意外層循環的循環體中,里面的for循環體只有一個語句所以有無大括號含義完全相同,因此可以省去大括號,讓代碼看起來更簡潔。改后代碼如下:
for(i=1;i<=5;i++)
{
for(j=1;j<=ij++)
printf(”*”);
printf(”\n”);
)
)
在案例5的基礎上,可以讓學生自己思考如何編程實現九九乘法表和楊輝三角形的輸出,只在重點地方稍加提醒即可。此外還要講一些典型的數學上的問題,比如判斷某個范圍內有哪些數是素數并全部輸出等這些問題,這里就不再詳述。
3 結束語
總之,講解多重循環根據本人多年的教學經驗感覺這種選定特殊案例循序漸進的方式會讓學生學起來很容易上手,并且畏難情緒很少,學習效果更好。當然循序漸進的案例每個老師可以結合自己的經驗和學生的實際情況去進行設計,只要是有助于改善他們學習效果的就可以。
參考文獻:
[1]譚浩強.C程序設計教程(第3版)[M].北京:清華大學出版社.2018.
[2]張莉.C程序設計案例教程(第3版)[M].北京:清華大學出版社.2019.
[3]厲蘭潔,廖雪花,譚良,等.基于SPOC的C語言程序設計課程教學改革研究[J].計算機教育,2016(1):74-76.
【通聯編輯:張薇】
收稿日期:2019-08-25
作者簡介:裴大容(1974-),女,湖北荊州人,碩士研究生,講師,研究方向為圖像處理、數據挖掘等。