顧 明
(深圳職業技術學院 人工智能學院,廣東 深圳 518055)
C語言是很多國內高職院校開設的一門編程類的基礎課,把C語言編程作為學生的第一門編程課,對于基本沒有接觸過計算機編程的大部分高職學生來講,C語言編程課程對學生的學習和教師的講授都有一定難度.C語言教學目前的主要現狀和問題可以歸納為 3個方面[1-2].首先,C語言知識體系本身有一定的復雜度和難度,C語言知識體系的信息容量較大,如語言概念和語法規則、程序結構和用戶界面、數據結構和數學算法等等.其次,作為教學對象的高職學生,他們的基礎理論知識相對薄弱,同時抽象能力和邏輯思維能力相對缺乏,學習的主動性和積極性不高.這些自身因素導致他們缺乏對學到的知識進行深入探究,不能融會貫通.最后,就是C語言的高職教學模式,目前大部分高職院校針對計算機編程課程設立了多媒體實訓室,多媒體實訓室的主要功能是承擔計算機公共課和專業課的訓練,這種模式雖然為學生們上機操作創造了條件,但上機實訓并不是隨時可以的,只是在規定的上課時間或課外時間.而且,在教學實施上并沒有擺脫教師講授為主的教學過程,缺乏真正的以學生為主體的教學模式,也沒有給學生發揮主觀能動性的時空保障和任務牽引,同時又缺乏有效的教學手段,充分調動起學生的學習主動性的積極性.因此,對高職C語言編程課程教學模式的探討[3-6],一直都是一個受到關注的研究課題.
本文對C語言的知識點進行了分解[7-8],從多個方面對 C語言編程能力進行了分析.在此基礎上,提出了項目牽引的C語言教學模式,選擇了一個既能覆蓋C語言知識點又能體現C語言編程能力,同時又能像游戲軟件一樣,能引起學生學習興趣的迷宮項目,以該項目作為學習C語言知識體系的任務牽引,結合課中和課后的學習,線上和線下的時空保障,充分調動學生的學習熱情,在完成項目的同時,掌握C語言的編程知識點.
根據高職教育的培養目標和企業崗位對程序員及其相關專業人員的就業需求,再結合計算機C語言編程課程的教學要求,我們對C語言的知識點進行了分類的歸納總結,把C語言的知識點分解成5個方面,見表1.

表1 C語言知識點分解
1.2.1 抽象的能力
計算機在任何情況下都是人類勞動,包括思維、活動、控制等的一種替代工具.因此計算機編程的目的是獲取原來人工系統的方案,然后計算機化,按用戶指定的工作方式來實現在計算機上工作.因此,抽象來自3個方面,首先要抽象仿真現實人工系統以構成抽象的人工系統,例如,C語言中的函數就是客觀系統中一種行為或動作的抽象.其次,從抽象的人工系統映射到計算機軟件系統也是一種抽象,再后,根據計算機軟件系統的復雜性,確定是否需要進行架構設計等,最后用計算機編程語言實現計算機軟件系統.如圖1所示.

圖1 抽象的體現
C語言是實現計算機軟件系統中常用的一種語言,可以直接使用C語言編寫計算機軟件系統.首先,需要分析人工系統解決問題的步驟,再映射到C語言編程解決問題的處理流程,最后找出對應關系.如圖2所示.

圖2 人工系統和C語言編程系統的操作步驟分解和映射關系
1.2.2 邏輯思維的能力
邏輯思維的能力是采用科學的思維方式,對事物進行觀察、比較、分析、綜合、抽象、概括、判斷和推理等后,準確而有條理地表達自己的思維過程的能力.
邏輯思維能力是表現在C語言編程的整個過程中的,即:從抽象、需求獲取和分析,到算法設計、數據和操作設計和用戶界面設計.對沒有接觸過計算機編程思維訓練的學生來講,可以優先選擇C語言來訓練計算機編程的邏輯思維能力.
在 C語言中,數據處理流程有三種基本結構,即:順序、條件和循環.人工系統的邏輯思維過程需要被映射成為C語言中的三種基本控制結構,如圖3所示.因此,在學習C語言3種基本結構時,我們要注重培養學生將人的邏輯思維過程用C語言3種基本結構表現的編程方法.

圖3 邏輯思維過程在C語言中的體現
例如,在C語言中劃分條件語句的判斷范圍,就需要一定的邏輯思維合理性,否則,程序的語法沒有錯,但運行結果在某些條件下就達不到用戶的預期結果.
假設希望成績80分以上是B,90分以上是A,C語言程序代碼片段如下:

某同學有分數 95,按照以上程序,mark取值是‘B’,并不是我們希望的‘A’.這是因為兩個區間的劃分沒有互斥,是有重疊的.這屬于編程邏輯思維能力培養的范疇.
再例如,對于循環語句,在設計循環初值、終值、步長值時,要注意循環初值在步長值的作用下,一定要達到并超過循環終值,這樣才能保證循環的出口.這也是編程邏輯思維的一種體現,否則,就會形成死循環.當然,也可以設計成永真循環,用break語句跳出循環,這也是循環語句另一種邏輯思維方式的體現.
1.2.3 需求獲取和分析的能力
計算機編程的目的是發揮計算機運算速度快,重復工作不會疲勞出錯等優點,來替代現有的人工系統.因此,先要獲取人工系統是如何完成任務的模型,哪些需求是需要的,哪些是不需要的,這主要是涉及到計算機編程需要的數據篩選和提取.如圖4所示.

圖4 編程需求的獲取和分析
例如,要計算機編程實現學生成績信息統計系統,我們需要學生的學號、姓名、班級、課程名稱等信息,但并不需要學生的視力、體重、身高等健康數據.我們除了要確定現實世界的某個對象自身有關的屬性,在編程時的取舍信息外,還要分析需要的信息在計算機編程時,用該語言的哪種數據組織方式表示.如在C語言中,學號是表示成整數類型,還是字符串類型,經過分析后發現,還是字符串類型比較好,因為學號中也可能出現數字以外的其它字符.
1.2.4 算法設計的能力
算法是為解決一個問題而采取的方法和步驟,算法具有:有窮性、確切性、輸入項、輸出項和可行性.用C語言編程,算法設計的能力培養是很重要的,人工系統中的思考問題方式不同于計算機中的算法設計.例如:要實現在一群人中找到身高最高的人,人工系統可以讓所有人站在一排,用眼睛一看就知道誰最高.但計算機編程就需要設計一個算法來解決這個問題,首先,測量每個人的身高數據,然后,按照如圖5所示的算法,依據1,2,3的有窮步驟,找出最高的人.

圖5 尋找最高身高的算法設計
算法設計的是否合理和優秀,直接關系到C語言程序能否正確執行和執行的效率.
1.2.5 數據和操作設計的能力
在C語言的編程中,首先要區分數據和在數據上的操作,要考慮需要哪些數據,每種數據用C語言中的什么數據組織方式來表示,對數據的操作要設計多少個函數,函數之間的調用關系如何安排等.例如,延續以上尋找最高身高的例子,可以按照如圖6設計數據和操作的函數關系.

圖6 尋找最高身高的數據和操作設計
1.2.6 用戶界面設計能力
用戶界面的設計方法和工具有很多,僅僅用C語言還不能設計出可視化 windows的用戶界面,但C語言編程也是需要設計用戶界面的,在C編程中,要考慮用C語言可以直接實現的方式,設計比較友好和實用的用戶界面.
輸入數據的用戶界面方式:
● 從文件讀入數據;
● C語言標準庫函數直接從鍵盤交互獲取數據;
● 設計菜單選擇方式.
輸出數據的用戶界面方式:
● 把程序運行結果放入磁盤文件;
● 用C語言的標準庫函數直接打印運行結果到屏幕上,這種方式比較常用;
● 設計菜單選擇,然后打印該菜單對應的運行結果到屏幕上.
項目需求的自然語言描述如下:該項目是一個正方形的二維平面的迷宮,可以指定起點,出口點在迷宮二維平面圖最右邊的一條邊上,最右邊的一條邊上可以有多個出口點,但出口點必須是在迷宮圖最右邊的一條邊上.迷宮內有通路,也有墻等各類障礙物,有障礙物就意味著不能通過.經過每一段路都要有一定的花費,花費可以是錢和體力消耗等.從入口到出口,只要有一段路遇到墻或障礙物,就不算是通路.只有從起點到出口的所有的路上都沒有墻或障礙物,就算是找到了一條通路.從起點到出口,如果找到的2條通路,只要有一段路不同,就算是不同的通路.起點可以由用戶指定.當指定在起點后,有可能沒有找到一條從該起點到出口的通路,這時的通路數量就是0.
該項目需要在迷宮中找到如下的信息:
● 從入口到出口的所有通路,即從指定的起點到任何一個出口沒有遇到墻或障礙物的路徑;
● 迷宮的通路數量,即不同的通路個數;
● 最短的通路,即從起點到出口的路徑總長度最短的通路;
● 最便宜的通路,即從起點到出口點路徑總長度上花費(錢或體力)最小的通路;
● 最便宜的通路的花費總數.
根據用自然語言描述的迷宮需求,我們經過需求的獲取和分析,需要抽象出一個能用計算機編程語言實現的數學模型.把一段路徑用一個點表示,點上的數字表示經過這一段路徑的花費,我們把花費用0-9的數字等級表示,數字越大,花費越多,最小花費是0,最大花費是9.點上有*表示是墻或障礙物,意味著該段路徑不能通過.因為迷宮是正方形,該數學模型表示成(n*n)方陣,該方陣是由數字和*組成,共n行,每行n列.給定一個起點,如果能找到一條從起點到最右邊列的某個數字組成的數字串,就是存在一條通路.不同的數字串組成不同的通路.統計迷宮的通路數量時,只需統計不同的數字串的個數即可.最短的通路表示數字串中的數字個數最少,最便宜的路徑表示某通路的數字串上數字的總和最小,最便宜的路徑的花費總數就是最便宜的路徑上的數字總和.例如:圖7表示由5*5組成的迷宮方陣,如果起點選擇為左上角的1,出口是在最右邊的列上,共有4個出口點,每個點上都是1.

圖7 迷宮5*5方陣
在迷宮項目需求轉換為n*n的數學模型點方陣過程中,體現了對抽象能力和邏輯思維能力的需求.
迷宮的算法設計思想如圖8所示.

圖8 迷宮項目的算法設計
迷宮項目的程序覆蓋了C語言編程的數據組織方式.
例如,把迷宮點方陣存貯在一個雙指針的自定義類型結構中.迷宮項目的操作設計是一個主函數和在主函數中調用的7個子函數,其中有一個是復雜情況下的遞歸函數,該函數是迷宮項目的核心函數,這個遞歸函數中又調用了一個打印迷宮通路的函數.為了判斷迷宮中的墻和障礙物,還有迷宮中的其他退出方式,該遞歸函數很多地方都體現了計算機編程中的邏輯思維能力需求.
該項目的操作設計如圖9所示.

圖9 迷宮項目的操作設計
直接打印迷宮的有關重要提示信息,然后顯示迷宮點方陣的表示圖,提示用戶輸入起點,用戶輸了迷宮的起點后,屏幕紅綠交替閃爍2次,閃爍顯示的內容是指定了起點的迷宮二維抽象的點方陣表示圖.閃爍后,程序經過運行,打印顯示迷宮通路的各類信息.
迷宮項目的C語言編程實現程序運行的用戶界面和運行結果如圖10所示.

圖10 迷宮項目C語言編程實現的用戶界面和運行界面
迷宮項目模塊(函數)分解和C語言知識點的具體覆蓋關系見表2,每個函數就是一個模塊.全覆蓋:表示覆蓋了C語言中這個知識點的所有細節內容;部分覆蓋:表示覆蓋了C語言中這個知識點的一部分細節內容,還有一部分細節沒有覆蓋到;無覆蓋:表示沒有覆蓋到C語言中這個知識點的任何細節內容.

表2 迷宮項目和C語言知識點的對應關系
由表2可以看出:主函數覆蓋了C語言的所有知識點,可以用該項目作為一個牽引,綜合練習和訓練培養學生的編程能力.C語言的“語言符號和規則集”這個知識點,被迷宮項目的所有子模塊所覆蓋;C語言的“用戶界面”這個知識點,只是在主函數中被覆蓋;C語言的“數據組織方式”這個知識點,只是在主函數中被全覆蓋,而在其他模塊中都是部分覆蓋的.
迷宮項目和編程能力的對應關系見表3,全體現:表示完成迷宮項目中的這個模塊需要具備這個能力,同時也可以在完成項目中培養、訓練、鞏固和加深這個能力;部分體現:表示迷宮項目中的這個模塊需要部分具備這個能力,即意味著對這個能力的要求程度可以相對弱一點,但可以在項目中進一步培養和加深這個能力;無體現:表示迷宮項目中的這個模塊沒有用到這個能力.

表3 迷宮項目和編程能力的對應關系
由表3可以看出:迷宮項目的主函數體現了對所有編程能力的需要,這說明了C語言主函數的設計是個關鍵點,要設計和實現迷宮項目的C語言主函數,需要所有與編程有關的能力.編程的“抽象能力”、“邏輯思維能力”和“算法設計能力”在迷宮項目的所有模塊中都需要,這也同時說明這3個能力在計算機編程的重要性和需求程度.“用戶界面設計能力”只是在主函數中有體現,其他函數中沒有體現對這個能力的需求,這又一次說明了主函數的重要性.“需求獲取和分析能力”和“數據和操作設計能力”在迷宮項目的主函數和通路遞歸函數(遞歸尋找所有通路)中是全部體現的,但在其他模塊中只是部分體現,這也說明了這兩個模塊也是整個迷宮項目的關鍵函數.
由表3得到的結論是:迷宮項目體現了對所有C語言編程能力的需要,越是關鍵和重要的函數(模塊),對編程能力的需求就越多.
選擇了迷宮項目后,我們的目的要是要把它應用在高職計算機編程C語言的教學中,這才是我們分析C語言知識點和編程能力同迷宮項目對應關系的意義所在.
針對疫情期間采用的網絡授課現狀,考慮到迷宮項目覆蓋了C語言的所有知識點,同時又體現了對C語言所有編程能力的需求,再結合高職學生的特點和迷宮項目的難度,我們設計并實踐了如圖11的迷宮項目牽引C語言網絡課程的教學模式.

圖11 迷宮項目牽引的C語言網絡課程教學模式
1)設置項目牽引問題(教師課前完成):按照表1和2分解項目和C語言知識點和編程能力后,教師在網絡授課前要準備好與迷宮項目相關的多個牽引問題,設置項目牽引問題的目的是為了快速吸引學生的注意力,提高學生的學習興趣,讓學生帶著問題學習.例如:如何分析和安排主函數的應該完成的功能,用戶界面設計都需要哪些具體細節等.
2)小案例講解 C語言知識點細節(教師課中完成):因為迷宮項目本身具有一定的難度,對于沒有計算機編程基礎的高職學生,再結合高職學生的特點,我們采用了先引導性講授,再自主學習相結合的方式.從C語言的基本知識點開始,每個細小知識點,用另外的小案例在網絡課堂上講解.例如:用圖5的尋找最高身高的小案例講解數據處理流程和算法設計.
3)自主學習課程網站資源(學生課中或課后完成):在項目牽引和小案例完成后,把自主權交給學生,學生利用C語言課程網站視頻等網絡課程資源,課后或課中自主學習,體會、鞏固和進一步理解小案例的細小知識點.例如:用網絡課程資源中的排序程序進一步鞏固和提高數據處理流程和算法設計.
4)用分解的迷宮項目模塊布置課堂課后作業(師生互動環節):以課堂或課后師生互動的方式,總結和答疑自主學習的問題,由于每個學生自主學習的深度和廣度是不同的,師生互動可以充分體現分層次教學的效果.用表1和表2分解的迷宮項目模塊,布置課堂課后作業,復習、鞏固、改進和提高學生的自主學習結果.通過這樣的反復學習,達到舉一反三的效果.但始終用迷宮項目作為學生的C語言編程最終目標,由這個目標牽引著,在完成迷宮項目的同時,也完成了學習C語言知識點和培養編程能力的目標.
5)迷宮項目中 C語言知識點和編程能力測試:如果項目模塊還沒有完成,則繼續以上1)- 4)的過程.如果項目的所有模塊都完成了,為了檢測學習效果,教師在網絡課堂上,總結迷宮項目知識點和編程能力體現,再根據項目涉及的知識點和編程能力,設計開放式綜合測試題目,上傳到網絡上,讓學生在指定的時間內在線完成.
從學生的評教反饋來看,學生對于項目牽引的網絡授課教學模式是滿意的,一方面是對迷宮項目感覺同游戲類似了,激發了學生的興趣,項目的牽引也使得學生有了解決問題的成就感.
從教師的評學反饋來看,感覺學生的學習熱情提高了,自主學習有了目標.從測試結果看,項目化牽引的網絡授課,學生的測試成績普遍得到了提高.
用項目覆蓋知識點,體現編程能力的培養,是一種教學展開模式.通過我們的教學實踐,發現項目的選擇是重要的,首先項目要有一定的難度和復雜度,還要能覆蓋所有的知識點,同時又要體現編程能力的訓練和培養.其次,就像游戲總能引起學生的興趣一樣,項目一定要有能吸引學生注意力,引起學生興趣的作用,這種項目才能起到牽引作用.
項目牽引的教學模式在網絡課程中體現了它的重要性.這主要是同網絡化教學的優點相關,網絡化教學的優勢是可以充分發揮學生的自主學習能力、個性化的學習時空和個性化接受知識體系.把知識點全部融入到項目中,可以快速吸引學生的注意力,提高學生的學習興趣,讓學生感覺到是項目牽引著學習,并能使學生盡快掌握項目所涉及到的知識點,在完成項目中找到學習的樂趣和自己解決問題的成就感.