摘要:C語言是一種應用廣泛又比較難學的計算機高級語言,它接近硬件和系統低層軟件資源,在教學上與其他語言有區別,本文結合教學實踐,探討了任務驅動法在本課程教學實踐中的應用。
關鍵詞:任務驅動法;C語言;教學;實踐
中圖分類號:G642.0 文獻標志碼:A 文章編號:1674-9324(2013)09-0087-03
隨著教學改革步伐的加快和后續課程的迫切要求,多數高校包括我們甘肅機電職業技術學院將C語言安排為第一計算機教學語言,且有些系部為了開設課程的需要在一年級就開始授課,這無疑給C的教學帶來了新的壓力和挑戰。本人擔任此課程的教學工作以來,在《C語言程序設計》課程中引入任務驅動教學方法,學生在任務中學習語法、算法和編程方法,教師著重引導,學生主動參與,很大的激發了學生的學習興趣和培養實踐動手能力。
一、任務驅動教學法的理論基礎
“任務驅動教學法”是一種建立在建構主義學習理論基礎上的教學法,它將以往以傳授知識為主的傳統教學理念,轉變為以解決問題、完成任務為主的多維互動式的教學理念。將再現式教學轉變為探究式學習,使每一位學生都能根據自己對當前問題的理解,運用共有的知識和自己特有的經驗提出方案、解決問題。在這個過程中,學生還會不斷地獲得成就感,可以更大地激發他們的求知欲望,逐步形成一個感知心智活動的良性循環,從而培養出獨立探索、勇于開拓進取的自學能力。在如何學習方面,構建主義提倡在教師指導下以學習者為中心的學習,也就是說強調學習者的認知主體作用,又不忽視教師的主導作用,教師是意義構建的幫助者、促進者。而不是知識的傳授者與灌輸者。學生是信息加工的主體,是意義的主動構建者,而不是外部刺激的被動接受者和被灌輸的對象。
二、任務驅動教學法在《C語言程序設計》課程中的實踐
1.確定問題(任務)。任務驅動教學法首先需要解決的是確定任務,選擇與當前學習主題密切相關的真實性事件或問題(任務)作為學習的中心內容,讓學生面臨一個需要立即去解決的現實問題。在授課開始,提出問題,指出該問題的難點,圍繞授課內容引導學生進行思考。例如,學習結構體一章時,可以讓學生思考如何才能存放全班同學的信息(姓名、年齡、成績等),以往的基本數據類型可以完成嗎?由此引入結構體數組的概念。以“選擇結構”一章為例,該單元的教學知識點是掌握關系表達式、邏輯表達式和條件表達式,會使用if語句和switch語句。在教學過程中,從簡單的問題著手,先要求學生自己編寫程序,引入條件語句,同時在程序中講解相關的語法知識點,提升高度。具體步驟:(1)任意輸入兩個數,求最大值,并輸出最大值。(以此為例講解if...else語句的用法及其執行過程。)(2)擴展第一步,任意輸入三個數,求最小值并輸出。(引入介紹六種基本關系運算符并給出優先順序,學習計算關系表達式的值,強調值為邏輯值。)(3)擴展第二步,任意輸入三個數,并按從小到大的順序輸出。(注意講解其中的算法,為循環語句打基礎。介紹三種邏輯運算符號及其優先順序,學習計算邏輯表達式的值。)(4)移植第三步,求解符號函數,強調else子句與if語句的匹配原則。(5)推進第四步,進行if語句的多重嵌套。從鍵盤上輸入成績并按原則輸出其等級為習題供學生練習。(6)改寫第五步程序,使用switch語句構成多分支結構。(引入switch語句和break語句。)(7)進行嵌套if語句與switch語句互換。同時,還要注重算法分析,培養學生以算法為中心解決問題的能力。這是程序設計課程的教學重點,也是教學難點。對于C語言所涉及的算法,在精講多練的同時還應注意這些算法之間的聯系,與課程的相關內容結合。如選擇法可以結合選擇程序設計結構,篩選法、起泡法等算法可以結合數組、函數部分進行教學。這樣,學生在任務訓練中熟練掌握這些算法的同時,也學習并掌握了相關課程內容,并逐漸養成在程序設計時進行觸類旁通的思維模式。我這里強調了確定任務的重要性,但同時也要注意在確定任務時應該控制任務的難度。在教學層次上,要根據學生基礎程度的不同,制定不同的任務標準,要求每一個層次的學生都要達到最低的標準的任務并向高一級標準努力。具體來說,一個課堂的練習要有多個層次的任務,第一個層次是基本的,體現課程主要內容,第二個層次略為擴充,體現一定的技巧和算法,第三個層次就是要求學生的設計無論從界面、風格、完整型還是算法、技巧、易用性等方面接近專業程序員的習慣和水平。舉一個簡單的例子,剛開始學生接觸C語言課程時,有這么一個任務:
例:計算并顯示2個數的和是多少?
任務遞進:①計算并顯示2個數的和,按任意鍵退出顯示屏幕?②計算并顯示2個數的和,以算術的形式顯示?③輸入兩個數求和,并以算術的形式顯示?問題(任務)的解決有使學生更主動、更廣泛地激活原有知識和經驗,來理解、分析并解決當前問題,問題的解決為新舊知識的銜接、拓展提供了理想的平臺,通過問題的解決來建構知識,正是探索性學習的主要特征。
2.任務實施。任務遞進中,通過新任務引出新的概念,新的語法,新的知識點。如:①按任意鍵退出顯示屏幕,可以用以下兩句來實現:printf(“Please press any key to exit!\n”);scanf(“%c”,&c);\*假設字符型變量c已經定義*\或:printf(“Please press any key to exit!\n”);getchar();\*這時不用定義字符型變量,節省了存儲空間*\進而引出Turbo C中的3個標準的輸入函數getchar()、scanf()和以后要學習的gets(),在這里我結合具體教學中談談這三個函數。①這3個函數都屬于標準輸入函數,它們在頭文件stdio.h中進行說明,其功能分別是:從標準輸入文件得到一個字符、按所給字符格式的要求從標準輸入文件得到若干項不同類型的數據、從標準輸入文件得到一個字符串。顯然,這3個函數在操作上存有共性。②我的處理是將3個函數捆在一起、硬著頭皮往深里講,所抱的指導思想是講十分可能會七分,如果講七分就只能會五分。這3個函數的操作對象都是標準輸入文件,該文件在系統啟動時自動打開,文件指針由系統定義為stdin。所謂標準輸入文件,實際上是在DOS的高層將鍵盤設備當作一個輸入文件,將鍵盤操作視為文件操作;由于鍵盤是計算機必備的輸入設備,所以又稱它為標準輸入設備或標準輸入文件。顯然,DOS的這一高層操作必然要依賴于DOS的低層功能,其具體機制是,系統為標準輸入文件配有一個文件緩沖區、并支持行編輯操作,即:用戶連續鍵入字符,只要用戶不按回車鍵('\r'),則前面鍵入的字符可退回任意修改;一旦回車,鍵入字符將進入文件緩沖區,包括最后鍵入的回車符也將轉變為換行符('\n')送入文件緩沖區,此后它們將不能再被修改。③這3個函數面對同一個設備對象,共享同一個文件緩沖區,在操作上均分成兩個環節。第一個環節,如果文件緩沖區空,它們等待用戶鍵入字符直到用回車結束本行操作;第二個環節,它們從文件緩沖區中提取字符,并進行各自的相應處理:getchar()函數將從文件緩沖區中截取一個任意字符(包括空格和換行符)返回。gets()函數將從文件緩沖區中截取若干字符(其中包括空格符),直到遇到換行符并將它轉變為控制字符NULL(' '),并以它作為串的結束標志。該函數返回串的首地址。函數將按格式的要求逐項截取字符,將它轉變為要求的數據類型后存入相應的地址。截取原則有3個:a.按格式要求的數據類型和域寬來截取。b.遇到空格符、制表符和換行符時截取告一段落。c.遇到與所要求的格式不匹配的字符時截取告一段落。注意被scanf()函數截取后,最后的換行符仍被遺留在文件緩沖區內,成為影響后續接收的垃圾。該函數返回成功匹配的數據項的個數。④scanf()函數有諸多的操作細節,在教材上已經展開,但當scanf()函數連續使用時情況就不太正常。(已經有好多學生在上機時向我問過此類問題了。)
在連續使用scanf()函數時,可用getchar()、fflush(stdin)或其他函數清除前次遺留在文件緩沖區中的垃圾字符。
通過引出Turbo C中的3個標準的輸入函數getchar()、scanf()和gets(),就可以總結出相對應的輸出函數putchar()、printf()和puts()了,這里就不再重復了。
通過任務:①引入知識點的學習,就可以輕松的解決任務遞進;②計算并顯示2個數的和,以算術的形式顯示;③輸入兩個數求和,并以算術的形式顯示。這些無非就是輸入輸出函數的靈活應用而已,在具體教學中我采取了讓學生自己在原有的程序中改動來實現。
問題(任務)的解決有使學生更主動、更廣泛地激活原有知識和經驗,來理解、分析并解決當前問題,問題的解決為新舊知識的銜接、拓展提供了理想的平臺,通過問題的解決來建構知識,正是探索性學習的主要特征。
3.評價與反饋。評價和反饋可與讓教師實時了解學生任務實施的進展和效果,促進學生的學習興趣,達到以評促學的目的。如在任務實施階段過程中(如在學生上機的過程中)發現問題及時糾正,任務實施結束后,提問幾位學生匯報任務進展情況,匯報過程中我采取了將他們的程序通過大屏幕給大家演示,有錯誤的地方提問若干個學生錯在哪里了、為什么錯了、怎么去改動、是哪個語法現象的問題等,回過頭再講講這個語法現象。評價和改動后結合幾位學生的程序,給予點評與鼓勵。
實踐證明,評價與反饋可以極大的調動學生的學習興趣,激發斗志,使學生在今后的學習中更加有動力,是任務驅動法不可或缺的一個步驟。
三、任務驅動教學法在《C語言程序設計》課程教學中的整體把握
上面談到的是具體章節中怎樣利用任務驅動來教學,實際上對整個課程也可以從宏觀上進行任務設計。
如完成學生成績管理信息系統,必須學習以下知識:掌握文件的建立、打開、讀、寫等操作;系統的組織包含數據輸入、修改、查詢、統計、輸出等功能,必須掌握函數的調用;數據內容的組織涉及數組、結構體、鏈表,必須掌握數組、結構體、鏈表等數據對象的操作;功能的實現必須設計算法控制流程,掌握不同的流程圖表示方法;功能算法的實現必須根據算法描述進行符號化語句表示;根據編寫程序的源代碼進行程序調試。
該任務難度適中,囊括了C語言課程的大綱要求,而且與學生聯系密切,使學生不必進行復雜的項目背景分析就可以進行不同程度的功能擴展。同時項目的實現能夠突出程序設計“以算法為中心”求解問題的方法,是一個比較合適的項目。學生從開始模仿單一的記錄添加、排序、查詢、統計和記錄瀏覽等簡單程序,到利用函數、結構和指針等知識對模仿期開發的各功能模塊進行擴充和完善,逐步組建學生的管理系統。
通過在《C語言程序設計》課程中引入任務驅動的教學方法,相比傳統的教學方法,學生的興趣提高,積極主動,大大的提高了教學效率。以實際的軟件開發項目為載體,學生通過各個任務的訓練,基本上可以掌握一個C語言程序設計的軟件的開發過程。
參考文獻:
[1]譚浩強.C語言程序設計[M].北京:清華大學出版社,2008:64,70,296.
[2]鄭英.任務驅動教學模式探索[J].考試周刊,2007,(7).
[3]龍志強,施曉紅,謝云德.任務驅動法在單片機系統設計教學中的實踐[J].實驗室研究與探索,2008,(3).
[4]萊斯利·P·斯特弗,杰里·蓋爾.教育中的構建主義[M].高文,徐斌艷,程克拉,等,譯.上海:華東師范大學出版社,2003.
作者簡介:許玉煥(1982-),男,甘肅秦安人,2005年7月畢業于西北師范大學電子信息工程系(計算機方向),大學本科,工學學士,講師,主要研究方向計算機程序設計。