顧 明
(深圳職業(yè)技術(shù)學院 人工智能學院,廣東 深圳 518055)
C語言是很多國內(nèi)高職院校開設的一門編程類的基礎課,把C語言編程作為學生的第一門編程課,對于基本沒有接觸過計算機編程的大部分高職學生來講,C語言編程課程對學生的學習和教師的講授都有一定難度.C語言教學目前的主要現(xiàn)狀和問題可以歸納為 3個方面[1-2].首先,C語言知識體系本身有一定的復雜度和難度,C語言知識體系的信息容量較大,如語言概念和語法規(guī)則、程序結(jié)構(gòu)和用戶界面、數(shù)據(jù)結(jié)構(gòu)和數(shù)學算法等等.其次,作為教學對象的高職學生,他們的基礎理論知識相對薄弱,同時抽象能力和邏輯思維能力相對缺乏,學習的主動性和積極性不高.這些自身因素導致他們?nèi)狈W到的知識進行深入探究,不能融會貫通.最后,就是C語言的高職教學模式,目前大部分高職院校針對計算機編程課程設立了多媒體實訓室,多媒體實訓室的主要功能是承擔計算機公共課和專業(yè)課的訓練,這種模式雖然為學生們上機操作創(chuàng)造了條件,但上機實訓并不是隨時可以的,只是在規(guī)定的上課時間或課外時間.而且,在教學實施上并沒有擺脫教師講授為主的教學過程,缺乏真正的以學生為主體的教學模式,也沒有給學生發(fā)揮主觀能動性的時空保障和任務牽引,同時又缺乏有效的教學手段,充分調(diào)動起學生的學習主動性的積極性.因此,對高職C語言編程課程教學模式的探討[3-6],一直都是一個受到關注的研究課題.
本文對C語言的知識點進行了分解[7-8],從多個方面對 C語言編程能力進行了分析.在此基礎上,提出了項目牽引的C語言教學模式,選擇了一個既能覆蓋C語言知識點又能體現(xiàn)C語言編程能力,同時又能像游戲軟件一樣,能引起學生學習興趣的迷宮項目,以該項目作為學習C語言知識體系的任務牽引,結(jié)合課中和課后的學習,線上和線下的時空保障,充分調(diào)動學生的學習熱情,在完成項目的同時,掌握C語言的編程知識點.
根據(jù)高職教育的培養(yǎng)目標和企業(yè)崗位對程序員及其相關專業(yè)人員的就業(yè)需求,再結(jié)合計算機C語言編程課程的教學要求,我們對C語言的知識點進行了分類的歸納總結(jié),把C語言的知識點分解成5個方面,見表1.
表1 C語言知識點分解
1.2.1 抽象的能力
計算機在任何情況下都是人類勞動,包括思維、活動、控制等的一種替代工具.因此計算機編程的目的是獲取原來人工系統(tǒng)的方案,然后計算機化,按用戶指定的工作方式來實現(xiàn)在計算機上工作.因此,抽象來自3個方面,首先要抽象仿真現(xiàn)實人工系統(tǒng)以構(gòu)成抽象的人工系統(tǒng),例如,C語言中的函數(shù)就是客觀系統(tǒng)中一種行為或動作的抽象.其次,從抽象的人工系統(tǒng)映射到計算機軟件系統(tǒng)也是一種抽象,再后,根據(jù)計算機軟件系統(tǒng)的復雜性,確定是否需要進行架構(gòu)設計等,最后用計算機編程語言實現(xiàn)計算機軟件系統(tǒng).如圖1所示.
圖1 抽象的體現(xiàn)
C語言是實現(xiàn)計算機軟件系統(tǒng)中常用的一種語言,可以直接使用C語言編寫計算機軟件系統(tǒng).首先,需要分析人工系統(tǒng)解決問題的步驟,再映射到C語言編程解決問題的處理流程,最后找出對應關系.如圖2所示.
圖2 人工系統(tǒng)和C語言編程系統(tǒng)的操作步驟分解和映射關系
1.2.2 邏輯思維的能力
邏輯思維的能力是采用科學的思維方式,對事物進行觀察、比較、分析、綜合、抽象、概括、判斷和推理等后,準確而有條理地表達自己的思維過程的能力.
邏輯思維能力是表現(xiàn)在C語言編程的整個過程中的,即:從抽象、需求獲取和分析,到算法設計、數(shù)據(jù)和操作設計和用戶界面設計.對沒有接觸過計算機編程思維訓練的學生來講,可以優(yōu)先選擇C語言來訓練計算機編程的邏輯思維能力.
在 C語言中,數(shù)據(jù)處理流程有三種基本結(jié)構(gòu),即:順序、條件和循環(huán).人工系統(tǒng)的邏輯思維過程需要被映射成為C語言中的三種基本控制結(jié)構(gòu),如圖3所示.因此,在學習C語言3種基本結(jié)構(gòu)時,我們要注重培養(yǎng)學生將人的邏輯思維過程用C語言3種基本結(jié)構(gòu)表現(xiàn)的編程方法.
圖3 邏輯思維過程在C語言中的體現(xiàn)
例如,在C語言中劃分條件語句的判斷范圍,就需要一定的邏輯思維合理性,否則,程序的語法沒有錯,但運行結(jié)果在某些條件下就達不到用戶的預期結(jié)果.
假設希望成績80分以上是B,90分以上是A,C語言程序代碼片段如下:
某同學有分數(shù) 95,按照以上程序,mark取值是‘B’,并不是我們希望的‘A’.這是因為兩個區(qū)間的劃分沒有互斥,是有重疊的.這屬于編程邏輯思維能力培養(yǎng)的范疇.
再例如,對于循環(huán)語句,在設計循環(huán)初值、終值、步長值時,要注意循環(huán)初值在步長值的作用下,一定要達到并超過循環(huán)終值,這樣才能保證循環(huán)的出口.這也是編程邏輯思維的一種體現(xiàn),否則,就會形成死循環(huán).當然,也可以設計成永真循環(huán),用break語句跳出循環(huán),這也是循環(huán)語句另一種邏輯思維方式的體現(xiàn).
1.2.3 需求獲取和分析的能力
計算機編程的目的是發(fā)揮計算機運算速度快,重復工作不會疲勞出錯等優(yōu)點,來替代現(xiàn)有的人工系統(tǒng).因此,先要獲取人工系統(tǒng)是如何完成任務的模型,哪些需求是需要的,哪些是不需要的,這主要是涉及到計算機編程需要的數(shù)據(jù)篩選和提?。鐖D4所示.
圖4 編程需求的獲取和分析
例如,要計算機編程實現(xiàn)學生成績信息統(tǒng)計系統(tǒng),我們需要學生的學號、姓名、班級、課程名稱等信息,但并不需要學生的視力、體重、身高等健康數(shù)據(jù).我們除了要確定現(xiàn)實世界的某個對象自身有關的屬性,在編程時的取舍信息外,還要分析需要的信息在計算機編程時,用該語言的哪種數(shù)據(jù)組織方式表示.如在C語言中,學號是表示成整數(shù)類型,還是字符串類型,經(jīng)過分析后發(fā)現(xiàn),還是字符串類型比較好,因為學號中也可能出現(xiàn)數(shù)字以外的其它字符.
1.2.4 算法設計的能力
算法是為解決一個問題而采取的方法和步驟,算法具有:有窮性、確切性、輸入項、輸出項和可行性.用C語言編程,算法設計的能力培養(yǎng)是很重要的,人工系統(tǒng)中的思考問題方式不同于計算機中的算法設計.例如:要實現(xiàn)在一群人中找到身高最高的人,人工系統(tǒng)可以讓所有人站在一排,用眼睛一看就知道誰最高.但計算機編程就需要設計一個算法來解決這個問題,首先,測量每個人的身高數(shù)據(jù),然后,按照如圖5所示的算法,依據(jù)1,2,3的有窮步驟,找出最高的人.
圖5 尋找最高身高的算法設計
算法設計的是否合理和優(yōu)秀,直接關系到C語言程序能否正確執(zhí)行和執(zhí)行的效率.
1.2.5 數(shù)據(jù)和操作設計的能力
在C語言的編程中,首先要區(qū)分數(shù)據(jù)和在數(shù)據(jù)上的操作,要考慮需要哪些數(shù)據(jù),每種數(shù)據(jù)用C語言中的什么數(shù)據(jù)組織方式來表示,對數(shù)據(jù)的操作要設計多少個函數(shù),函數(shù)之間的調(diào)用關系如何安排等.例如,延續(xù)以上尋找最高身高的例子,可以按照如圖6設計數(shù)據(jù)和操作的函數(shù)關系.
圖6 尋找最高身高的數(shù)據(jù)和操作設計
1.2.6 用戶界面設計能力
用戶界面的設計方法和工具有很多,僅僅用C語言還不能設計出可視化 windows的用戶界面,但C語言編程也是需要設計用戶界面的,在C編程中,要考慮用C語言可以直接實現(xiàn)的方式,設計比較友好和實用的用戶界面.
輸入數(shù)據(jù)的用戶界面方式:
● 從文件讀入數(shù)據(jù);
● C語言標準庫函數(shù)直接從鍵盤交互獲取數(shù)據(jù);
● 設計菜單選擇方式.
輸出數(shù)據(jù)的用戶界面方式:
● 把程序運行結(jié)果放入磁盤文件;
● 用C語言的標準庫函數(shù)直接打印運行結(jié)果到屏幕上,這種方式比較常用;
● 設計菜單選擇,然后打印該菜單對應的運行結(jié)果到屏幕上.
項目需求的自然語言描述如下:該項目是一個正方形的二維平面的迷宮,可以指定起點,出口點在迷宮二維平面圖最右邊的一條邊上,最右邊的一條邊上可以有多個出口點,但出口點必須是在迷宮圖最右邊的一條邊上.迷宮內(nèi)有通路,也有墻等各類障礙物,有障礙物就意味著不能通過.經(jīng)過每一段路都要有一定的花費,花費可以是錢和體力消耗等.從入口到出口,只要有一段路遇到墻或障礙物,就不算是通路.只有從起點到出口的所有的路上都沒有墻或障礙物,就算是找到了一條通路.從起點到出口,如果找到的2條通路,只要有一段路不同,就算是不同的通路.起點可以由用戶指定.當指定在起點后,有可能沒有找到一條從該起點到出口的通路,這時的通路數(shù)量就是0.
該項目需要在迷宮中找到如下的信息:
● 從入口到出口的所有通路,即從指定的起點到任何一個出口沒有遇到墻或障礙物的路徑;
● 迷宮的通路數(shù)量,即不同的通路個數(shù);
● 最短的通路,即從起點到出口的路徑總長度最短的通路;
● 最便宜的通路,即從起點到出口點路徑總長度上花費(錢或體力)最小的通路;
● 最便宜的通路的花費總數(shù).
根據(jù)用自然語言描述的迷宮需求,我們經(jīng)過需求的獲取和分析,需要抽象出一個能用計算機編程語言實現(xiàn)的數(shù)學模型.把一段路徑用一個點表示,點上的數(shù)字表示經(jīng)過這一段路徑的花費,我們把花費用0-9的數(shù)字等級表示,數(shù)字越大,花費越多,最小花費是0,最大花費是9.點上有*表示是墻或障礙物,意味著該段路徑不能通過.因為迷宮是正方形,該數(shù)學模型表示成(n*n)方陣,該方陣是由數(shù)字和*組成,共n行,每行n列.給定一個起點,如果能找到一條從起點到最右邊列的某個數(shù)字組成的數(shù)字串,就是存在一條通路.不同的數(shù)字串組成不同的通路.統(tǒng)計迷宮的通路數(shù)量時,只需統(tǒng)計不同的數(shù)字串的個數(shù)即可.最短的通路表示數(shù)字串中的數(shù)字個數(shù)最少,最便宜的路徑表示某通路的數(shù)字串上數(shù)字的總和最小,最便宜的路徑的花費總數(shù)就是最便宜的路徑上的數(shù)字總和.例如:圖7表示由5*5組成的迷宮方陣,如果起點選擇為左上角的1,出口是在最右邊的列上,共有4個出口點,每個點上都是1.
圖7 迷宮5*5方陣
在迷宮項目需求轉(zhuǎn)換為n*n的數(shù)學模型點方陣過程中,體現(xiàn)了對抽象能力和邏輯思維能力的需求.
迷宮的算法設計思想如圖8所示.
圖8 迷宮項目的算法設計
迷宮項目的程序覆蓋了C語言編程的數(shù)據(jù)組織方式.
例如,把迷宮點方陣存貯在一個雙指針的自定義類型結(jié)構(gòu)中.迷宮項目的操作設計是一個主函數(shù)和在主函數(shù)中調(diào)用的7個子函數(shù),其中有一個是復雜情況下的遞歸函數(shù),該函數(shù)是迷宮項目的核心函數(shù),這個遞歸函數(shù)中又調(diào)用了一個打印迷宮通路的函數(shù).為了判斷迷宮中的墻和障礙物,還有迷宮中的其他退出方式,該遞歸函數(shù)很多地方都體現(xiàn)了計算機編程中的邏輯思維能力需求.
該項目的操作設計如圖9所示.
圖9 迷宮項目的操作設計
直接打印迷宮的有關重要提示信息,然后顯示迷宮點方陣的表示圖,提示用戶輸入起點,用戶輸了迷宮的起點后,屏幕紅綠交替閃爍2次,閃爍顯示的內(nèi)容是指定了起點的迷宮二維抽象的點方陣表示圖.閃爍后,程序經(jīng)過運行,打印顯示迷宮通路的各類信息.
迷宮項目的C語言編程實現(xiàn)程序運行的用戶界面和運行結(jié)果如圖10所示.
圖10 迷宮項目C語言編程實現(xiàn)的用戶界面和運行界面
迷宮項目模塊(函數(shù))分解和C語言知識點的具體覆蓋關系見表2,每個函數(shù)就是一個模塊.全覆蓋:表示覆蓋了C語言中這個知識點的所有細節(jié)內(nèi)容;部分覆蓋:表示覆蓋了C語言中這個知識點的一部分細節(jié)內(nèi)容,還有一部分細節(jié)沒有覆蓋到;無覆蓋:表示沒有覆蓋到C語言中這個知識點的任何細節(jié)內(nèi)容.
表2 迷宮項目和C語言知識點的對應關系
由表2可以看出:主函數(shù)覆蓋了C語言的所有知識點,可以用該項目作為一個牽引,綜合練習和訓練培養(yǎng)學生的編程能力.C語言的“語言符號和規(guī)則集”這個知識點,被迷宮項目的所有子模塊所覆蓋;C語言的“用戶界面”這個知識點,只是在主函數(shù)中被覆蓋;C語言的“數(shù)據(jù)組織方式”這個知識點,只是在主函數(shù)中被全覆蓋,而在其他模塊中都是部分覆蓋的.
迷宮項目和編程能力的對應關系見表3,全體現(xiàn):表示完成迷宮項目中的這個模塊需要具備這個能力,同時也可以在完成項目中培養(yǎng)、訓練、鞏固和加深這個能力;部分體現(xiàn):表示迷宮項目中的這個模塊需要部分具備這個能力,即意味著對這個能力的要求程度可以相對弱一點,但可以在項目中進一步培養(yǎng)和加深這個能力;無體現(xiàn):表示迷宮項目中的這個模塊沒有用到這個能力.
表3 迷宮項目和編程能力的對應關系
由表3可以看出:迷宮項目的主函數(shù)體現(xiàn)了對所有編程能力的需要,這說明了C語言主函數(shù)的設計是個關鍵點,要設計和實現(xiàn)迷宮項目的C語言主函數(shù),需要所有與編程有關的能力.編程的“抽象能力”、“邏輯思維能力”和“算法設計能力”在迷宮項目的所有模塊中都需要,這也同時說明這3個能力在計算機編程的重要性和需求程度.“用戶界面設計能力”只是在主函數(shù)中有體現(xiàn),其他函數(shù)中沒有體現(xiàn)對這個能力的需求,這又一次說明了主函數(shù)的重要性.“需求獲取和分析能力”和“數(shù)據(jù)和操作設計能力”在迷宮項目的主函數(shù)和通路遞歸函數(shù)(遞歸尋找所有通路)中是全部體現(xiàn)的,但在其他模塊中只是部分體現(xiàn),這也說明了這兩個模塊也是整個迷宮項目的關鍵函數(shù).
由表3得到的結(jié)論是:迷宮項目體現(xiàn)了對所有C語言編程能力的需要,越是關鍵和重要的函數(shù)(模塊),對編程能力的需求就越多.
選擇了迷宮項目后,我們的目的要是要把它應用在高職計算機編程C語言的教學中,這才是我們分析C語言知識點和編程能力同迷宮項目對應關系的意義所在.
針對疫情期間采用的網(wǎng)絡授課現(xiàn)狀,考慮到迷宮項目覆蓋了C語言的所有知識點,同時又體現(xiàn)了對C語言所有編程能力的需求,再結(jié)合高職學生的特點和迷宮項目的難度,我們設計并實踐了如圖11的迷宮項目牽引C語言網(wǎng)絡課程的教學模式.
圖11 迷宮項目牽引的C語言網(wǎng)絡課程教學模式
1)設置項目牽引問題(教師課前完成):按照表1和2分解項目和C語言知識點和編程能力后,教師在網(wǎng)絡授課前要準備好與迷宮項目相關的多個牽引問題,設置項目牽引問題的目的是為了快速吸引學生的注意力,提高學生的學習興趣,讓學生帶著問題學習.例如:如何分析和安排主函數(shù)的應該完成的功能,用戶界面設計都需要哪些具體細節(jié)等.
2)小案例講解 C語言知識點細節(jié)(教師課中完成):因為迷宮項目本身具有一定的難度,對于沒有計算機編程基礎的高職學生,再結(jié)合高職學生的特點,我們采用了先引導性講授,再自主學習相結(jié)合的方式.從C語言的基本知識點開始,每個細小知識點,用另外的小案例在網(wǎng)絡課堂上講解.例如:用圖5的尋找最高身高的小案例講解數(shù)據(jù)處理流程和算法設計.
3)自主學習課程網(wǎng)站資源(學生課中或課后完成):在項目牽引和小案例完成后,把自主權(quán)交給學生,學生利用C語言課程網(wǎng)站視頻等網(wǎng)絡課程資源,課后或課中自主學習,體會、鞏固和進一步理解小案例的細小知識點.例如:用網(wǎng)絡課程資源中的排序程序進一步鞏固和提高數(shù)據(jù)處理流程和算法設計.
4)用分解的迷宮項目模塊布置課堂課后作業(yè)(師生互動環(huán)節(jié)):以課堂或課后師生互動的方式,總結(jié)和答疑自主學習的問題,由于每個學生自主學習的深度和廣度是不同的,師生互動可以充分體現(xiàn)分層次教學的效果.用表1和表2分解的迷宮項目模塊,布置課堂課后作業(yè),復習、鞏固、改進和提高學生的自主學習結(jié)果.通過這樣的反復學習,達到舉一反三的效果.但始終用迷宮項目作為學生的C語言編程最終目標,由這個目標牽引著,在完成迷宮項目的同時,也完成了學習C語言知識點和培養(yǎng)編程能力的目標.
5)迷宮項目中 C語言知識點和編程能力測試:如果項目模塊還沒有完成,則繼續(xù)以上1)- 4)的過程.如果項目的所有模塊都完成了,為了檢測學習效果,教師在網(wǎng)絡課堂上,總結(jié)迷宮項目知識點和編程能力體現(xiàn),再根據(jù)項目涉及的知識點和編程能力,設計開放式綜合測試題目,上傳到網(wǎng)絡上,讓學生在指定的時間內(nèi)在線完成.
從學生的評教反饋來看,學生對于項目牽引的網(wǎng)絡授課教學模式是滿意的,一方面是對迷宮項目感覺同游戲類似了,激發(fā)了學生的興趣,項目的牽引也使得學生有了解決問題的成就感.
從教師的評學反饋來看,感覺學生的學習熱情提高了,自主學習有了目標.從測試結(jié)果看,項目化牽引的網(wǎng)絡授課,學生的測試成績普遍得到了提高.
用項目覆蓋知識點,體現(xiàn)編程能力的培養(yǎng),是一種教學展開模式.通過我們的教學實踐,發(fā)現(xiàn)項目的選擇是重要的,首先項目要有一定的難度和復雜度,還要能覆蓋所有的知識點,同時又要體現(xiàn)編程能力的訓練和培養(yǎng).其次,就像游戲總能引起學生的興趣一樣,項目一定要有能吸引學生注意力,引起學生興趣的作用,這種項目才能起到牽引作用.
項目牽引的教學模式在網(wǎng)絡課程中體現(xiàn)了它的重要性.這主要是同網(wǎng)絡化教學的優(yōu)點相關,網(wǎng)絡化教學的優(yōu)勢是可以充分發(fā)揮學生的自主學習能力、個性化的學習時空和個性化接受知識體系.把知識點全部融入到項目中,可以快速吸引學生的注意力,提高學生的學習興趣,讓學生感覺到是項目牽引著學習,并能使學生盡快掌握項目所涉及到的知識點,在完成項目中找到學習的樂趣和自己解決問題的成就感.