□任仲晟
計算思維與實例相結合為導向的C語言公共課教學研究
□任仲晟
C語言程序設計是一門重要的公共基礎課,傳統的教學過程存在一些弊端,諸如過多地強調語法規則,簡單乏味的程序示例等。本文倡導在教學過程中引入計算思維和實例相結合為導向的實例教學法,讓學生從現實逐步過渡到抽象的C語言程序世界,掌握用計算機來求解生活中的問題的方法。通過實例教學,培養學生對課程的興趣愛好,以及學習的主動性和創新性,并最終提高他們的計算思維能力。
計算思維;實例教學;公共課改革
近年來,有關計算思維在程序設計類課程中的研究層出不窮,大量文獻都對此進行了探討。所謂計算思維指的是運用計算機科學的基礎概念進行問題求解、系統設計以及人類行為理解等涵蓋計算機科學之廣度的一系列思維活動。
作為一門重要的公共課,C語言程序設計課程面向的是廣大非計算機類專業的學生。與計算機本專業的學生相比,這些學生無論在知識背景還是在認知程度上,層次差異更加明顯。這些學生中的大多數學習C語言的目的并不是成為一名程序員,而是掌握程序設計的基本思想和方法,學習利用計算機解決問題,提高自身邏輯思維能力,一定程度上為學習自己本專業的課程打下良好的基礎。此外,自身的學科背景差異,導致很大一部分非計算機專業的學生對C語言課程的興趣程度不高。
根據周以真教授的論述,計算思維的本質應該是問題的抽象、計算機的映射和自動化的求解。用C語言的觀點看:面對一個現實生活中的復雜問題,采用分而治之的思想對其進行劃分,亦即將一個現實問題做抽象化的同時進行子問題的分解,利用函數求解子問題,通過程序的邏輯跳轉和控制來實現原問題的求解。數據類型、函數、遞歸等等都是C語言里面的常見概念,故而計算思維與C語言程序設計有著一種天然的聯系。但由于計算思維強調的是抽象和自動化,對前文曾經分析過的學生來說,存在一定的距離,故而需要依托另外一種理念來幫助,這種理念就是下文提到的實例導向。
盡管計算思維強調了C語言課程的教學本質和重點難點,但是結合教學對象的實際情況,我們認為,在把握計算思維的同時,更應該堅持面向實例化的教學思路。實例教學更加側重具體的示例(案例、樣例)在教學過程中的應用,它能充分彌補計算思維的不足,將抽象變成具體,由具體到抽象,讓學生在具體和抽象之間游刃有余,融會貫通。近年來關于實例教學的研究也有很多,有興趣的讀者可以查閱相關文獻。
結合上述分析,我們選取一個具體的例子來描述這二者相結合的C語言公共課的教學。作為教學的實例,題目應當是學生相對熟悉的,這樣才能充分調動學生的學習興趣,激發學生的求知欲望,避免學生由于程序語言枯燥、煩瑣的語法規則而失去對學習興趣。
基于上述考慮,本次選擇的實例是“石頭剪刀布”小游戲的設計與實現。該實例覆蓋的知識點有:數據類型的使用,輸入輸出函數的應用,某一特定區間范圍隨機數的產生與使用,循環結構的使用,指針數組的定義與使用,函數的定義與調用等等。這些知識點都是C語言程序設計中必備且重要的,是學習的重點與難點。如果對這些知識點進行單一的講解,則容易給人支離破碎的感覺,并陷入程序語言語法漩渦的怪圈。我們應該站在全局的高度,通過實例融合各知識點,并引導學生對程序設計的全過程有一個全面的感性認知。
首先,根據馮諾依曼體系結構計算機的要求,程序的數據和指令都必須放置于內存,而后才能逐條指令地分析和執行。我們就可以這么告訴學生:現在我們用C語言和計算機交流,讓計算機幫我們做一件事情(能夠和人類玩石頭剪刀布的游戲)。所以在交流的時候,首先要注意交流的語法規范,才能保證對方能夠聽得懂,其次既然是讓計算機做一件事情(執行一系列的計算),就得先提供數據給它。為了提供數據,我們又該先在內存開辟足夠的空間,用于存儲數據。那么這個空間該開辟多大呢?為了給不同的數據量身定做一個空間,數據類型的概念和變量的定義就引入了。
其次,平時在玩這個游戲時,我們是用手勢來表示不同的對象(石頭、剪刀、布),那么在計算機內部,又該如何處理呢?計算機可無法用“手”來表示。計算思維的抽象化在這個時候可以得到體現。我們可以引導學生,對于不同的手勢,我們可以利用不同的整數來表達,例如0,1,2分別表示石頭、剪刀和布。所以出手勢的過程,就相當于產生數字0,1,2的過程。人的手勢就用輸入來實現,讓用戶輸入一個整數來表達自己的手勢。而計算機如何產生一個整數呢?這不就是生成一個0~2區間隨機整數嘛!rand()函數就引入了。不僅在手勢表示的時候有一個抽象的過程,更重要的游戲規則又該如何表示呢?此時,我們可以進一步引導學生。為了描述游戲過程中的游戲規則,我們可以先在稿紙上畫出一張二維表格,如表1所示(輸贏從玩家角度描述)。

表1 實例游戲規則表
面對這么一張由行列構成的二維表格,學生便會發現,這不就是一個二維矩陣嘛!既然講到了二維數組,我們又可以借勢引導學生,這個用于描述游戲規則的二維數組又該定義成什么類型呢?觀察發現,這個二維數組的每個元素就是玩家與電腦PK的輸贏結果。進一步地,我們還可以在表1的基礎上做個改進,將“平”“輸”“贏”這些字眼改造成“打成平手”“Sorry,你輸了”“恭喜你,贏啦”,如此一來,將游戲規則二維數組每個元素看成是一個字符串就是水到渠成的事情了。綜上,類似 char*gameRule[]={“打成平手”“Sorry,你輸了”“恭喜你,贏啦”}這樣的二維指針數組就產生了。
再次,如何描述整個游戲的過程呢?如果照本宣科地念課本,一般就是介紹順序、循環和選擇三種結構,而學生則會陷入它們的語法結構,例如if和else的配對關系,for表達式的描述等等,而忽略了這些結構背后的內在要素。結合“石頭剪刀布”游戲,我們可以先讓學生回憶并感受一下平時的游戲過程。通常游戲的雙方會進行多輪的PK,甚至還會在輸贏的基礎上弄個獎懲措施。每次PK的過程,都是雙方出手勢、比輸贏、獎懲這三部曲,結合C語言,容易得到這就是一個循環結構的結論。一旦介入到循環結構,又會自然地引導學生思考循環的條件,引入break等機制的描述。這樣若干知識點的教學就串在了一起,給人一種天衣無縫的感覺,而不是突兀的語法規則的堆砌。
囿于文章篇幅的關系,本文不再一一列舉游戲的其他方面。我們只是希望在此能夠拋磚引玉,展示一下計算思維與實例教學二者的結合。這種教學理念有其合理的一面,在未來的教學實踐過程中,我們將進一步予以研究,并跟蹤學生的學習效果。
[1]朱世敏,孫桂芳,張重陽等.C語言程序設計教學中計算思維的培養[J].Proceedings of Conference on Creative Education(CCE 2014)
[2]李妮.基于計算思維能力培養的C語言程序設計課程改革[J].運城學院學報,2014,32(5):72-74.
[3]劉紅霞.基于計算思維的C語言程序設計教學模式改革[J].大學教育,2015,(8):116-117.
[4]潘亞平,徐燕.基于計算思維的計算機程序設計課程的教學改革與實踐[J].淮海工學院學報(人文社會科學版),2012,10(23):76-78.
(編輯:王春蘭)
G642.4
A
1671-0568(2016)26-0094-02
任仲晟,碩士,福建師范大學講師。研究方向:數據庫理論與應用、數據倉庫、數據挖掘、計算機公共課教學改革等。