摘要:C++語言是學(xué)生未來科研或工作中一種實(shí)用的工具,也可以成為學(xué)習(xí)其他語言的基礎(chǔ)。本文從對(duì)學(xué)生綜合能力培養(yǎng)的角度出發(fā),提出在工科領(lǐng)域,C++的教學(xué)應(yīng)注重其實(shí)用性,不拘泥于語法,學(xué)生要學(xué)會(huì)寫程序,學(xué)會(huì)對(duì)復(fù)雜問題的分解,并能寫出規(guī)范化的程序。教師在教學(xué)實(shí)踐中,可以利用實(shí)例教學(xué)、現(xiàn)場編程等各種方法,引導(dǎo)學(xué)生寫好程序,鼓勵(lì)學(xué)生克服困難。
關(guān)鍵字:計(jì)算機(jī)語言教學(xué);C++教學(xué);程序設(shè)計(jì)
中圖分類號(hào):G642文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1672-5913(2007)16-0016-03
1引言
長期以來,C++語言被認(rèn)為是較難學(xué)習(xí)的開發(fā)語言。在教學(xué)過程中,筆者逐步發(fā)現(xiàn),C++是一門實(shí)踐性很強(qiáng)的課程,有些教師在教學(xué)中注重各個(gè)知識(shí)點(diǎn),卻忽略了對(duì)學(xué)生綜合能力的培養(yǎng)。筆者從軟件開發(fā)實(shí)踐和對(duì)學(xué)生綜合能力培養(yǎng)的角度出發(fā),對(duì)C++的教學(xué)目標(biāo)和方法作了一些分析和研究,并在教學(xué)實(shí)踐中取得了較好的效果。
2教學(xué)中遇到的困難
2.1C++課程特點(diǎn)
C++課程在我校作為一門公共基礎(chǔ)課程開設(shè),安排在大學(xué)本科一年級(jí)學(xué)習(xí)。C++是一門特殊的課程,編寫程序的思維方式和學(xué)生在高中時(shí)期所學(xué)習(xí)數(shù)學(xué)物理完全不同,這可能是學(xué)生學(xué)習(xí)C++語言遇到的第一個(gè)難題。
C++是一門實(shí)踐的課程。如果與C++同時(shí)開設(shè)的課程,如果高等數(shù)學(xué),大學(xué)物理等都是理論教學(xué)為主,那么C++幾乎可以說是學(xué)生進(jìn)入大學(xué)最早遇到的以實(shí)踐為主的課程。我們?cè)诮虒W(xué)中,應(yīng)該把C++作為一門實(shí)踐課程,而非理論課程來對(duì)待。
2.2C++語言的特點(diǎn)
目前,比較流行的開發(fā)語言有:C++、Java、VB、Delphi、VB.NET、C# 等,比較這些語言,雖然C++關(guān)鍵字的個(gè)數(shù)并不算多,但是C++的語法靈活,這些靈活性往往帶來一些負(fù)面效應(yīng)。例如,C++中的case語句中不一定需要break,而C# 中,break是必須的,除非多個(gè)case直接連用。這些情況會(huì)導(dǎo)致很多難以覺察的陷阱,即使熟練的程序員也未必能夠幸免。
C++雖然運(yùn)行效率高,但是很多商用應(yīng)用程序卻不會(huì)選擇C++來開發(fā),因?yàn)镃++對(duì)數(shù)據(jù)庫以及其他組件拼接過于繁瑣,頭文件的存在也使得C++不適合作為腳本。目前,C++語言被主要使用在硬件驅(qū)動(dòng)的開發(fā),或者對(duì)運(yùn)算效率非常敏感的場合(如實(shí)時(shí)圖像處理)。
2.3C++學(xué)習(xí)的困難和誤區(qū)
C++語言自身的特點(diǎn)給學(xué)生的學(xué)習(xí)帶來一定的難度,在編程和運(yùn)行過程中容易出現(xiàn)許多難以察覺的錯(cuò)誤,這些挫折也使得學(xué)生感到學(xué)習(xí)C++的難度倍增。
也由于語法靈活,有些教師在教學(xué)中往往過多的注重語法,似乎只有完全掌握語法才能寫出好的程序,于是,C++題目中常常出現(xiàn)復(fù)雜的表達(dá)式分析,沒有實(shí)際功能的程序分析。這些缺乏可讀性的程序不僅沒有實(shí)際意義,還會(huì)大大降低學(xué)生對(duì)C++課程的認(rèn)同感。當(dāng)授課的重心偏向于語法,就會(huì)導(dǎo)致忽略對(duì)實(shí)際編程能力的培養(yǎng),使學(xué)生失去學(xué)習(xí)C++的興趣和信心。
3學(xué)習(xí)的目標(biāo)
3.1語法的學(xué)習(xí)
我們學(xué)習(xí)自然語言時(shí),語法是基礎(chǔ),目標(biāo)是和別人進(jìn)行交流。同樣的,在學(xué)習(xí)計(jì)算機(jī)語言時(shí),語法也也是基礎(chǔ),并使用計(jì)算機(jī)語言類編寫出程序。對(duì)于大多數(shù)理工科專業(yè)的學(xué)生來說,計(jì)算機(jī)語言和英語一樣,是將來研究工作中的一個(gè)工具(有別于研究的對(duì)象),所以我們應(yīng)當(dāng)把計(jì)算機(jī)語言當(dāng)作一個(gè)工具去學(xué)習(xí),要注重其實(shí)用性,而不是工具內(nèi)部實(shí)現(xiàn)細(xì)節(jié),或者繁瑣的語法現(xiàn)象。在語法之外,我們還應(yīng)當(dāng)學(xué)習(xí)怎么寫程序,如何寫好程序,以及學(xué)習(xí)如何去學(xué)習(xí)新的領(lǐng)域。語法不是全部,一位熟練的程序員學(xué)習(xí)一門新的計(jì)算機(jī)語言的語法,也許只要2個(gè)小時(shí),但是要熟練掌握這門語言,特別是當(dāng)這門語言有獨(dú)特的類庫,那么就必須閱讀類庫參考和例程,并進(jìn)行大量的練習(xí)。所以,在C++教學(xué)過程中,要讓學(xué)生了解常用的語法現(xiàn)象,但不拘泥于語法。
3.2算法的學(xué)習(xí)
學(xué)生應(yīng)當(dāng)掌握一些基本的算法。雖然其他的課程(如數(shù)據(jù)結(jié)構(gòu))中會(huì)詳細(xì)探討各類算法,但算法是編寫程序中必須的。通過C++的學(xué)習(xí),學(xué)生們應(yīng)該掌握最常用的經(jīng)典算法。但是僅掌握這些經(jīng)典算法是不夠的。我們還是希望通過C++的學(xué)習(xí),使學(xué)生掌握從算法到程序代碼的轉(zhuǎn)化,能夠?qū)⒁粋€(gè)陌生的,描述詳細(xì)的算法轉(zhuǎn)化為切實(shí)可行的代碼。
3.3對(duì)復(fù)雜問題的分析能力
無論是一個(gè)陌生的算法,還是一個(gè)新的用戶需求,學(xué)生在將其變成可以運(yùn)行之前,都必須對(duì)其進(jìn)行分析。這種分析包含兩層含義:算法的分析和程序結(jié)構(gòu)的分析。
一個(gè)看似復(fù)雜的算法,都是由一系列簡單的算法問題的邏輯組合。例如,雙向鏈表的操作對(duì)于很多學(xué)生來說,似乎是一個(gè)復(fù)雜的問題。圖3.1描述了在雙向列表中插入新節(jié)點(diǎn)的過程,該過程被分解為若干的步驟,其中每個(gè)步驟都不復(fù)雜。圖中的每一個(gè)步驟都可以進(jìn)一步分解。如步驟4,在鏈表中插入新節(jié)點(diǎn),該問題又可以由以下幾個(gè)基本步驟組成:找到插入點(diǎn)左邊的節(jié)點(diǎn)P1;找到插入點(diǎn)右邊的節(jié)點(diǎn)P2;通過四個(gè)賦值語句建立和新節(jié)點(diǎn)P的連接。

在程序結(jié)構(gòu)上,學(xué)生也應(yīng)當(dāng)具有一定的分析能力。C++的思想在于面向?qū)ο蟆5且寣W(xué)生真正的了解面向?qū)ο髤s是不容易的。要理解面向?qū)ο蟮膬?nèi)涵,不僅需要了解封裝、繼承、多態(tài)的概念,還需要具有將這些概念運(yùn)用到程序中去的能力,這些能力體現(xiàn)在對(duì)類的結(jié)構(gòu)、繼承關(guān)系的分析,以及對(duì)類的成員的設(shè)置、如何使用虛函數(shù)的分析。
例如,一段描述樹結(jié)構(gòu)的程序,其至少具有以下幾個(gè)類:CTree表示整個(gè)樹,CNode表示節(jié)點(diǎn),CNodeCollection表示節(jié)點(diǎn)的集合,用雙向鏈表實(shí)現(xiàn)。考慮個(gè)各類的公有成員,各個(gè)類的靜態(tài)結(jié)構(gòu)如下:

然后考慮個(gè)各類內(nèi)部的實(shí)現(xiàn)方式。比如,上圖中,比較復(fù)雜的結(jié)構(gòu)是CNodeCollection。可以采用一個(gè)鏈表來實(shí)現(xiàn)。它既可以從一個(gè)現(xiàn)有的鏈表類派生,也可以將一個(gè)鏈表作為其私有成員。
3.4工程化思想的融入
如果將一個(gè)學(xué)生寫的作業(yè)和一位專業(yè)程序員編寫的代碼放在一起,就不難看出其中的差別。從代碼上來看,學(xué)生的作業(yè)普遍缺乏注解,變量或函數(shù)名混亂,吝惜空格和換行;從結(jié)構(gòu)上講,由于程序缺乏良好的分析過程,類的類成員的結(jié)構(gòu)混亂;從功能上講,程序功能簡單,缺乏異常處理。
所以,我們應(yīng)當(dāng)引導(dǎo)學(xué)生,在編寫程序的過程中,注重程序風(fēng)格,使程序規(guī)范化,工程化,這需要學(xué)生在編寫程序的過程中注意很多細(xì)節(jié)問題。這些問題包括:良好的程序結(jié)構(gòu),統(tǒng)一的程序風(fēng)格,清晰的程序注解,周全的特殊情況處理,精確的異常處理,方便快捷且美觀的用戶界面等等。
4教學(xué)方法
4.1案例與實(shí)例分析
案例和實(shí)例是有所區(qū)別的。案例應(yīng)當(dāng)貼近現(xiàn)實(shí),有較為完整的需求,程序必須具有一定的容錯(cuò)性和良好的用戶界面,案例教學(xué)需要學(xué)生充分的發(fā)表自己的觀點(diǎn),而不僅僅是教師的灌輸。但是,限于學(xué)生知識(shí)的能力和教學(xué)任務(wù),真正的案例教學(xué)在目前的環(huán)境下是很難實(shí)現(xiàn)的。而實(shí)例更接近于普通的例題,但是這類例題更貼近于現(xiàn)實(shí)需求,是案例的簡化。筆者在實(shí)際授課中,主要采用實(shí)例教學(xué),并借鑒案例教學(xué)中的一些方法。
在實(shí)例的選擇上,應(yīng)選擇更貼近現(xiàn)實(shí)需求,或者帶有趣味性的問題。有的實(shí)例講究算法,有的實(shí)例沒有很復(fù)雜的算法,但是有比較復(fù)雜的功能,講究對(duì)程序整體結(jié)構(gòu)的把握。在實(shí)例講解的過程中,首先進(jìn)行需求和核心算法分析,程序的總體框架設(shè)計(jì),類靜態(tài)結(jié)構(gòu)設(shè)計(jì),最后,依據(jù)教學(xué)要求有選擇的分段實(shí)現(xiàn)程序。
4.2現(xiàn)場編程
作者在近幾年的C++教學(xué)中,一直堅(jiān)持在課堂上直接編寫示例程序,并取得了非常好的教學(xué)效果。
現(xiàn)場編可以讓學(xué)生了解編寫程序過程中所出現(xiàn)的各種困難和陷阱,著重講解編程時(shí)需要注意的細(xì)節(jié)問題。在講解完主要的語法和算法時(shí),教師給出例題,分析例題的核心算法、類的靜態(tài)結(jié)構(gòu)等或函數(shù)構(gòu)造等。然后開始編寫程序,整個(gè)程序的編寫時(shí)間不宜超過15分鐘。教師一邊編寫,一邊講解,控制編程節(jié)奏,讓學(xué)生緊跟教師的思維;在編程的過程中,時(shí)而發(fā)問,與學(xué)生互動(dòng)。
教師在編寫程序的過程中,可以讓學(xué)生直觀的看到編譯環(huán)境是如何工作的。教師應(yīng)當(dāng)教會(huì)學(xué)生熟練的使用編譯環(huán)境,如File View和Class View視圖,Work Space和Project的含義與兩者的區(qū)別等等。
教師應(yīng)該具有良好的編寫風(fēng)格,如標(biāo)識(shí)符的命名、注解、甚至換行。與書本、試卷上的題目相比較,教師寫的程序具有更強(qiáng)的示范作用,教師自身良好的編程習(xí)慣對(duì)學(xué)生編程習(xí)慣的培養(yǎng)具有重要意義。
教師必須具有良好的編程功底,能現(xiàn)場解決大多數(shù)編程時(shí)遇到的問題,并現(xiàn)場調(diào)試運(yùn)行。在容易犯錯(cuò)的環(huán)節(jié),可以采用試錯(cuò)法,讓學(xué)生分析錯(cuò)誤的原因;講解編譯器常見的錯(cuò)誤和警告信息的原因和處理方法,教會(huì)學(xué)生如何調(diào)試。
4.3調(diào)試技術(shù)
C++學(xué)習(xí)中,學(xué)生遇到的較大的困難之一,就是在調(diào)試過程中經(jīng)常遇到各種錯(cuò)誤,例如編譯器報(bào)告了上百個(gè)錯(cuò)誤,運(yùn)行時(shí)死循環(huán),或者運(yùn)行時(shí)彈出內(nèi)存只讀的對(duì)話框。這些挫折會(huì)使學(xué)生失去學(xué)習(xí)的動(dòng)力和信心。所以,應(yīng)當(dāng)讓學(xué)生學(xué)會(huì)一些調(diào)試方法,并且更多的鼓勵(lì)學(xué)生,克服困難。
要解決程序運(yùn)行中的各種錯(cuò)誤,調(diào)試技術(shù)是非常必要的。恰當(dāng)?shù)恼{(diào)試可以讓學(xué)生在最短的時(shí)間內(nèi)找到錯(cuò)誤的原因。僅僅是一行一行的看程序是很難找到問題的。在VC6的環(huán)境下,工科的學(xué)生應(yīng)當(dāng)學(xué)會(huì)使用F10、F11、Shift+F11等快捷鍵來進(jìn)行單步跟蹤,使用F9來設(shè)置斷點(diǎn),使用“Watch”和“Variables”工具來查看變量的值。此外,對(duì)于能力較強(qiáng)的學(xué)生,學(xué)會(huì)使用“Call Stack”和“Memory”工具也是相當(dāng)必要的。
4.4鼓勵(lì)和戰(zhàn)勝困難
對(duì)于初學(xué)C++語言者,尤其是對(duì)那些沒有其他計(jì)算機(jī)語言基礎(chǔ)的學(xué)生來說,C++的入門是比較一個(gè)艱難的過程。所以,盡可能多地鼓勵(lì)也是相當(dāng)?shù)谋匾.?dāng)學(xué)生在調(diào)試過程中遇到困難時(shí),需要耐心的調(diào)試,教導(dǎo)學(xué)生,編寫程序所遇到的挫折是不可避免的,也是他們所必須經(jīng)歷的。學(xué)習(xí)C++應(yīng)當(dāng)具有耐心、細(xì)心和堅(jiān)持不懈百折不撓的精神。
4.5MSDN和各類參考
授之以魚,不如授之以漁。在學(xué)習(xí)過程中,掌握如何從網(wǎng)絡(luò)上獲得幫助,如何查閱MSDN,學(xué)會(huì)閱讀各類Reference文檔,掌握如何學(xué)習(xí)的能力,對(duì)學(xué)生將來的發(fā)展具有重要的意義。
5結(jié)束語
筆者認(rèn)為,C++本身是一個(gè)開發(fā)工具,將C++作為一個(gè)工具來對(duì)待,在教學(xué)中注重其實(shí)用性,注重學(xué)生的編程能力、分析能力、學(xué)習(xí)能力等綜合素質(zhì)的培養(yǎng)。
Exploration on the Orentation and Technics of teaching C++ in Technology Major
Li Junyang, Chen Hanwu
Abstract: C++ is the pratical tool for students in their future career and research, and it is the basis of learning other programming languages as well. This paper is written in the perspective ofconstructing comprehensive ability for students of technology major, proposing that the C++ teaching should pay more attention to practical application, while with less emphysis on the syntatic of C++. Students should learn how to programme, decompose complex problems and finally develop formalized programs. Teachers may use technics such as introducing real example and instant programming when teaching so as to help students master the right programming technic and encourage them to get over problems.
Keywords: Computer Language Teaching, C++ Teaching, Programming
參考文獻(xiàn)
[1] 劉建華. 計(jì)算機(jī)語言類課程教學(xué)模式初探[J]. 高教論壇,2005,2(1).
[2] 劉傳平.“C++語言程序設(shè)計(jì)”課程教學(xué)改革的探討[J]. 中國科技信息,2005,(11).
[3] 趙志升,李靜羅,德林. “問題解決”教學(xué)模式及其在計(jì)算機(jī)教學(xué)中的應(yīng)用[J]. 教育與職業(yè),2006,11(32).
作者介紹:
李駿揚(yáng),男,東南大學(xué)自動(dòng)化學(xué)院,jupiter@seu.edu.cn,13357701017
陳漢武,男,東南大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院,教授,博士生導(dǎo)師,hw_chen@seu.edu.cn
通信地址:南京市玄武區(qū)四牌樓2號(hào) 郵編:210096