摘要:文章以C語言程序設計課程教學過程中的一堂課“循環結構”為例,詳細講解課堂內容的設計、教學方法和教學工具的運用技巧等。對如何組織一堂課中教學內容的引入、開展和延伸以及在相應教學環節中融入關鍵詞法、圖解法等多種教學方法提出建設性的意見,并強調課堂上師生互動以及理論聯系實際的重要性。總之,此文旨在幫助提高學生的邏輯思維素養和解決實際問題的能力。
關鍵詞:C語言程序設計;循環結構;算法;案例
C語言程序設計既是各高校計算機類專業的一門重要專業基礎課程,也是很多其他理工類專業的公共基礎課[1]。C語言功能強大,但由于其語法簡潔緊湊、控制靈活,初學者很難盡快掌握和應用。此外,盡管目前有關程序設計教學方法的理論探討很多,教學資源包括大綱、課件、教案以及習題等也很豐富[2-4],但缺少實際教學環節的方法應用的講解、解題過程的分析和引導。為了彌補這一缺陷,筆者在文中以“循環結構”一章的第一堂課為例,探討在程序設計教學過程中所運用的教學方法和內容設計。
1教學內容的引入
1.1承上啟下引入新內容
如果將一個學科專業涵蓋的所有課程的地位以及相互之間的聯系畫成一張網絡結構圖的話,每一門課程便是這張圖上的一個點。同理,對于一門課程而言,其中所有知識點或者各個教學單元可以視為此門課程網絡圖上的節點,它們彼此之間也存在著前提后續、整體部分、抽象具體等各種聯系。所以在每一堂課的開始,教師有必要以承上啟下的方式引入新的內容,簡單扼要地回顧前面的內容,若能有對比和延伸的闡述更佳。筆者在上“循環結構”第一堂課的時候,就簡單回顧了之前學過的順學結構和選擇結構,并在黑板上以圖示的方式展示它們的特點,對比它們的區別。如圖1所示,順序結構所組織的步驟是自上而下,依次執行,每個步驟執行一次;選擇結構中根據條件的判斷選擇執行,如果條件滿足,執行左邊的的步驟,否則執行右邊的步驟;而循環結構則是滿足條件下的多次執行,由此也可直觀感受循環兩字的含義。教師在畫圖的時候可以同時解釋,直觀展示三種結構的區別和聯系。

1.2為什么要學該堂課的內容
知道為什么學一堂課、一門課乃至一個專業是增強學生學習自主性和目標性的最直接方法。程序設計這門課程的最終目標是讓學習者掌握編程,懂得用程序解決現實中的若干問題。教師要善于將每一堂課的內容和它對應所能解決的實際問題中的點結合起來,以通俗易懂的實例、平實簡練的語言闡述所講知識點的重要性和應用價值,讓學生知道“學有所用”,而不能讓學生學了一大堆語法之后,不知道用在什么場合。對于“循環結構”這一知識點,筆者上課時列舉了大家熟知的銀行取錢的例子,譬如當用戶將密碼輸入錯誤時,銀行系統允許用戶重復輸入三次,從而引入用戶輸入密碼這一過程是由循環結構所組織的原理。例子無需太多,也不必過于復雜,只要能讓學生聯系所學知識的實際用處就行。如果要舉多個例子,可以側重于不同的應用,如數據處理、數值計算等。
2教學內容的開展
2.1根據教學內容運用不同教學方法
筆者認為,所有的方法或者技巧都是為了更好地服務教學內容的傳授而設計的,所以沒有絕對的一成不變的好方法。教師只有在研究教學內容特點和學生認知規律的基礎上,才可能設計出最能表現知識內涵和最適合學生接受的教學方法。譬如,筆者在“循環結構”第一堂課期間的不同階段用到了以下方法。
2.1.1善用關鍵詞幫助記憶重點難點
在一章內容講解之初,老師通常會展示這一章中所包含的各個知識點,并介紹其中的重點難點,但問題是學生在沒有真正學習之前很難體會并記住。筆者在展示一章知識點時,通常會使用部分關鍵詞幫助學生建立對一章內容和重點難點的初步認識,例如在循環結構一章學習中需解決的重點問題概括為三個關鍵單詞,縮寫在一起便成簡寫形式“2W+H”:
1) 什么是循環?(What)
2)為什么要使用循環?(Why)
3) 如何實現循環?(How)
“What”表示學生需要了解循環是什么,它的定義以及與其他結構的區別;“Why”指為什么要使用循環,它有何用處;“How”是實現循環的方式,即C語言提供給編程者實現循環的手段。三者各有側重,又相互聯系,教材中小節6.1對What、Why進行了概述,而6.2至6.5則是對How——循環實現方式即控制語句的介紹。而在這些知識點中,了解循環的重要性又是一個難點,即在解決具體問題的過程中,學生能自覺地想到使用循環并了解它所帶來的好處。
2.1.2巧用圖示法能事半功倍
俗話說,一圖勝千言,采用視覺圖形展示知識結構或者知識推理過程,具有直觀、形象生動、簡潔易懂等優點[5]。尤其在程序設計語言的學習過程中,許多知識點都適合用圖形方式展示,如用算法流程圖展示一個問題的解決過程。在講解什么是循環結構時,筆者除了用文字解釋外,還舉了一個大家熟知的例子加以說明:國際奧委會是如何通過投票決定奧林匹克運動會主辦權城市的,將投票的過程用流程圖方式加以說明,如圖2所示。值得注意的是,教師在展示算法的時候,應該采取動態展現各個步驟的方式,以體現算法步驟之間的次序關系,而不是一張靜態的圖。許多專家倡議教師教學時不要偷懶,多用黑板少依賴多媒體課件,我想大部分原因是老師在用黑板書寫的時候更容易展示知識內部的邏輯關系,老師對一個問題的解題思路也更容易通過他手中互動的粉筆得以更直觀的展現。

算法流程圖可以展示一個問題的解題過程,一組圖則可以達到對不同問題進行比較的目的,如圖1展示出來的三種基本結構的區別,善用圖文結合是一個值得推薦的教學方法。
2.2讓呆板的語法“活”起來
盡管C語言語法簡潔緊湊、一共只有32個關鍵字,9種控制語句,但由于C語言對語法限制不太嚴格、程序設計自由度大,程序書寫自由,所以學生要真正掌握這些語法并能靈活運用它們還是有相當的難度。但語法這個表面的形式是為了完成某種功能而設置的,脫離了它的功用就會變得枯燥,沒有生命力。如同國內很多學生學習英語的誤區:學生往往花了很大的功夫背英語單詞,包括英文的拼寫、讀音、中文含義、不同詞態等等,卻很少在實際交流中用它們來表達某種意思,或者把它們放在一個句子或者一篇文章中的合適位置,發揮它們應有的作用,可想而知這樣的學習方法會得到什么樣的結果。讀了十幾年英語的同學往往會讀會寫幾千個單詞,卻不能靈活運用其中的幾十個來進行一些最日常的對話;抑或一個句子中的每個單詞都認識卻不理解這句話表達的意思。筆者認為語言的功用都是相通的,英語或者中文是人與人交流的工具,程序設計語言是人與機器交流的工具,換言之,程序語言是人要計算機完成某項任務而提供給人使用的工具。如果要靈活運用這個工具,除了熟悉各種語法和它們的含義即語義外,還一定要熟悉它們的用途即語用。例如,筆者在介紹關鍵詞goto的時候,不僅告訴學生它的語法形式為:goto <語句標號>,它的語義功能為將程序流程無條件轉向標號所指語句,還特別強調它的語用,即在實際應用中通常與if語句配合完成在一定條件滿足之下的程序流程轉向,如圖3中所示程序是利用if…goto語句的配合實現循環控制。

2.3如何讓一個問題變成答案
學習程序設計語言最重要的目的之一是讓學習者拿到需要解決的問題后,能獨立自主地想到解決的辦法并用程序把問題變成解決它的答案。但如何從問題變成答案,這一過程一般的教材涉及的很少,而一般老師講解的時候也側重于講程序本身的語句和含義,而對程序如何來的解釋不多,這種教學導致的一個不良結果是:學生雖然學習了很多程序,但當他們面對一個類似甚至更簡單的問題并要求獨立編程的時候卻不知如何下手。古人云:“授人以魚不如授人以漁”,說的是傳授給人既有知識,不如傳授給人學習知識的方法。教師傳授的知識是有限的,但學生掌握方法就可以獲取無限的未知的知識,所以筆者認為程序設計教學過程中教會學生如何對一個問題進行分析設計到最后編程這一過程非常重要。
如何編程來解決一個問題呢?我們要經過先分析,再設計,后編碼測試幾個環節,在分析環節,通常需要提取問題中的關鍵信息并采用合適的數據類型變量或常量來表示已知和待求的信息,同時發現問題的求解規律。例如在循環結構這一堂課中,有一個實例是要求求1到100的累加和。這一問題中,可以明顯看出該問題是一個求重復了99次的加法運算的結果,而且被加的量從1開始,每次以1遞增直到100。所以可以設置兩個變量i和sum,其中i 表示被加的量,sum表示累加和的結果。有了對問題的基本分析后,第二步需要考慮的是如何設計實現的步驟即算法,對于算法,無論簡單復雜,我們都可以將其所有的步驟初步分割成為三段:程序的初始化;中間處理;結果輸出。初始化部分包括程序已知信息的輸入、變量的初始化等,上例中不涉及運行時人機交互的輸入,因為被加的量從1開始,只需對被加的變量i初始化為1,累加和變量sum在累加之前應當為0;中間的處理最為關鍵,是將已知信息經過若干步驟處理變為所需結果的關鍵環節。以上例子經過分析是一個重復了99次且有規律的加法,我們可以用學到的if…goto 循環結構來組織這個運算過程,如圖3所示,當1<=i<=100的時候,就把i值累加到sum中去,每次i值都以1遞增,直到大于100便脫離循環;最后一步相對簡單,將所計算的結果sum進行輸出。
2.4實踐是硬道理
幾乎計算機的所有課程都有相關的實驗,程序設計更是如此,所有的分析設計、所有的語法算法最終需要化為能運行的程序才能體現它們的價值,教師在教學過程中能盡量將理論與實踐結合起來,用現場的實驗來驗證程序的運行結果,會給學生更深更直觀的感受。同時,在演示過程中,教師還可以對程序作適量的修改以展示不同的結果,從而說明某些注意事項。例如,在圖3的程序中,為了說明循環結構的注意事項,采用以下方法:
1) 循環體如果為一條以上的語句,應使用復合語句。筆者在演示時將表示復合句的大括號去掉,運行時候出現死循環,通過要求學生分析原因更深刻了解編程規范化的重要性。
2) 循環前,應給循環變量賦初值;循環體中,一般應該有改變循環控制變量值的語句,從而使得循環條件有變為假的時候,否則容易出現無限循環–––“死”循環。為了說明,筆者將循環體中的i++去掉后運行出現死循環。
3教學內容的延伸
一堂課的教學內容無論多么豐富,教師必須掌握時間的分配,留下一些師生互動和獨立思考的空間給學生,也許課堂上他們無法完全回答出教師的提問,但提問無疑有助于他們獨立思維能力的培養。多問幾個為什么可以讓學生自己意識到對問題認識的局限性從而自動修正和完善。大學決不能“灌輸式”教學,通過對已學內容的延伸和舉一反三,學生可以更好地理解理論知識以達到靈活運用的目的。筆者在講完循環控制語句if…goto語法與應用后,要求學生用它解決以下問題:輸入一個班學生的成績,求全班的平均成績。待學生獨立思考后,引導他們對其進行分析和設計。
4結語
總之,作為一名程序設計課程的教師,上好一堂課看似簡單實則不易,在上課前教師需要仔細思考上課所需要的教學內容、教學環節的安排以及其中教學方法和工具的運用。在此引用湖南省精品課程評審組專家對筆者這一堂課的評價作為結論:為了使同學們能較好掌握將要學習的新內容,回顧了已經學過的“順序結構”、“選擇結構”的概念,并通過引例使學生理解“循環結構”,提出了“2W+1H”的概念。幻燈片具體詳實,學生易于理解和接受。在講解中還有VC實驗環境現場實驗,使理論教學與實驗指導相結合。同事和學生觀看后,一致認為授課教師儀態端莊、聲音清晰,充分采用多媒體的教學方式進行教學,內容豐富,反映了老師個性化的教學特點[6]。
注:我校C語言程序設計課程已經成功申請成為湖南省2010省級建設精品課程,筆者為主講教師之一,此堂課視頻內容可以通過以下鏈接獲取:http://218.75.216.182/sp/c/c3/content.htm。
參考文獻:
[1] 譚浩強. C程序設計[M]. 3版. 北京:清華大學