摘要:對(duì)通信工程專(zhuān)業(yè)“C++高級(jí)程序設(shè)計(jì)”課程教學(xué)過(guò)程作了介紹,對(duì)教學(xué)中遇到的一些問(wèn)題做了探討;從概念的角度回答了同學(xué)們學(xué)習(xí)過(guò)程中經(jīng)常提問(wèn)的幾個(gè)問(wèn)題,從而激發(fā)了學(xué)生的學(xué)習(xí)興趣。
關(guān)鍵詞:C++高級(jí)程序設(shè)計(jì);平臺(tái)SDK;MFC;托管C++
作者簡(jiǎn)介:楊榮根(1979-),男,江蘇海安人,淮陰工學(xué)院計(jì)算機(jī)學(xué)院,講師;龔樂(lè)君(1978-),女,江西臨川人,淮陰工學(xué)院計(jì)算機(jī)學(xué)院,講師。(江蘇淮安223003)
中圖分類(lèi)號(hào):G642#8195;#8195;#8195;#8195;#8195;文獻(xiàn)標(biāo)識(shí)碼:A#8195;#8195;#8195;#8195;#8195;文章編號(hào):1007-0079(2012)11-0057-02
一、“C++高級(jí)程序設(shè)計(jì)”課程概述
C++高級(jí)程序設(shè)計(jì)是計(jì)算機(jī)科學(xué)與技術(shù)和通信工程專(zhuān)業(yè)繼“C++程序設(shè)計(jì)”課程之后的又一門(mén)專(zhuān)業(yè)基礎(chǔ)課。學(xué)生在一年級(jí)的“C++程序設(shè)計(jì)”課程中已經(jīng)學(xué)習(xí)了C++語(yǔ)言的基本數(shù)據(jù)類(lèi)型、基本語(yǔ)法和簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)以及基本的面向?qū)ο蟮母拍?。?yīng)該說(shuō)學(xué)生對(duì)程序和計(jì)算已經(jīng)有了一些基本認(rèn)知。但是學(xué)生的基礎(chǔ)還不扎實(shí),原因是多方面的,大學(xué)一年級(jí)基礎(chǔ)和重要的課程比較多,像高等數(shù)學(xué)、英語(yǔ)等等;加之這種程序設(shè)計(jì)的概念作為專(zhuān)業(yè)的一部分,不像其他傳統(tǒng)的基礎(chǔ)課程那樣早就有個(gè)概念在腦海中,只是深度和廣度上的擴(kuò)展。程序設(shè)計(jì)對(duì)學(xué)生來(lái)說(shuō)是從無(wú)到有的一個(gè)全新的概念。
筆者所在學(xué)校的計(jì)算機(jī)學(xué)院將該課程安排在大學(xué)二年級(jí)上學(xué)期學(xué)習(xí),面向的是通信工程專(zhuān)業(yè)。教學(xué)大綱規(guī)定,該門(mén)課程主要講授Win32窗體應(yīng)用程序設(shè)計(jì)、MFC窗體應(yīng)用程序、文檔視圖結(jié)構(gòu)、對(duì)話(huà)框設(shè)計(jì)、數(shù)據(jù)庫(kù)編程、多媒體應(yīng)用程序設(shè)計(jì)、網(wǎng)絡(luò)編程以及托管應(yīng)用程序設(shè)計(jì)等。總共48學(xué)時(shí),理論課其中24節(jié),實(shí)驗(yàn)課24節(jié)。
二、教學(xué)過(guò)程設(shè)計(jì)及問(wèn)題
課程采用清華大學(xué)出版社曾憲權(quán)老師編著的《Visual C++.NET 程序設(shè)計(jì)實(shí)用教程》。該教材中所使用的開(kāi)發(fā)平臺(tái)是Visual C++.NET 2003平臺(tái),在教學(xué)過(guò)程中筆者使用的是Visual C++.NET 2008,因此書(shū)中的代碼會(huì)出現(xiàn)一些因?yàn)殚_(kāi)發(fā)平臺(tái)的版本不同而不兼容的情形,這在實(shí)驗(yàn)前就已經(jīng)做了交代和修正。教學(xué)每周安排4節(jié)課,講授兩節(jié)理論之后再做兩節(jié)實(shí)驗(yàn)。大多數(shù)學(xué)生雖然在技術(shù)掌握程度上還不是很深刻,但能夠模仿教材中的例子做一些簡(jiǎn)單的窗體應(yīng)用程序。其中有些學(xué)生經(jīng)過(guò)思考之后還提出了一些具有普遍性的問(wèn)題。
1.有了MFC為什么還要做Win32應(yīng)用程序
在這個(gè)功利、講究效率的社會(huì)學(xué)生有這種想法也算正常,大家都想花最少的時(shí)間學(xué)最有用的知識(shí),學(xué)生覺(jué)得Win32應(yīng)用程序太麻煩,MFC雖然內(nèi)容比較多,但是只要使用熟練,編程就很方便,因此產(chǎn)生Win32應(yīng)用程序編程無(wú)用論。
在回答這個(gè)問(wèn)題時(shí),筆者也講了自己的一段親身經(jīng)歷。在大學(xué)期間每個(gè)人都要學(xué)習(xí)數(shù)理統(tǒng)計(jì),其中就講到各種分布,不同的分布形式對(duì)應(yīng)不同的分布函數(shù)。數(shù)學(xué)老師上課往往是先抖出一包數(shù)學(xué)公式,然后交代這是什么分布。老師講得眉飛色舞,學(xué)生卻聽(tīng)得稀里糊涂,不知有什么用。直到后來(lái)做實(shí)驗(yàn)要處理數(shù)據(jù)的時(shí)候才在別人的幫助下弄清楚這些統(tǒng)計(jì)公式的用處,于是又重新把大學(xué)統(tǒng)計(jì)教材翻出來(lái)研習(xí)一遍。學(xué)生以此為鑒就應(yīng)該意識(shí)到,不能因?yàn)閃in32應(yīng)用程序現(xiàn)在暫時(shí)沒(méi)有遇到應(yīng)用的場(chǎng)合或是它本身的編程復(fù)雜就斷定無(wú)用。
(1)Win32應(yīng)用程序確是有其應(yīng)用之處。學(xué)生剛剛學(xué)完Win32窗體應(yīng)用程序編寫(xiě)技術(shù),還沒(méi)有在實(shí)際項(xiàng)目實(shí)施中遇到具體的應(yīng)用,自然會(huì)在MFC技術(shù)面前懷疑Win32的有用性。只要列舉一些實(shí)際應(yīng)用的例子就可以打消學(xué)生的這種念頭。MFC技術(shù)的方便性是建立在Microsoft公司提供的框架類(lèi)庫(kù)基礎(chǔ)之上的,沒(méi)有它自然就無(wú)方便性可言。這種框架類(lèi)庫(kù)對(duì)一些全局函數(shù)進(jìn)行了類(lèi)的封裝,程序執(zhí)行的效率無(wú)疑也會(huì)略輸一籌,況且這種類(lèi)庫(kù)本身也需要一些存儲(chǔ)空間??梢?jiàn),程序員所希望的編寫(xiě)方便性是以犧牲一部分時(shí)空為代價(jià)的。當(dāng)然,這在一般的桌面計(jì)算中是可以忍受的。若是沒(méi)有這個(gè)框架類(lèi)庫(kù)的應(yīng)用場(chǎng)合該怎么辦。在對(duì)實(shí)時(shí)性和存儲(chǔ)空間都有一定要求的嵌入式系統(tǒng)應(yīng)用中,這種場(chǎng)合是很常見(jiàn)的。
下面圖1是某電廠電能質(zhì)量監(jiān)控的嵌入式應(yīng)用演示系統(tǒng)。在WinCE模擬器中能夠運(yùn)行的MFC應(yīng)用程序在硬件設(shè)備上卻不能運(yùn)行。主要原因就是,硬件設(shè)備上定制的操作系統(tǒng)包含MFC DLL庫(kù)。一些有經(jīng)驗(yàn)的程序員也許會(huì)說(shuō),在編譯生成可執(zhí)行文件的時(shí)候選擇靜態(tài)包含MFC庫(kù),而不是選擇共享的MFC DLL庫(kù)。這當(dāng)然能夠解決問(wèn)題,但是從應(yīng)用環(huán)境對(duì)實(shí)時(shí)和存儲(chǔ)空間的要求,首選當(dāng)然是Win32應(yīng)用程序。因此,Win32應(yīng)用程序大有可用之處。
(2)Win32應(yīng)用程序編程并不復(fù)雜。Win32應(yīng)用程序也并非如想象中的那么麻煩,只是對(duì)于初學(xué)者而言短暫的不適應(yīng)是很正常的。隨著編程的深入,學(xué)生自然就知道就是那么幾個(gè)步驟。首先從最簡(jiǎn)單的窗體應(yīng)用程序著手,循序漸進(jìn)。下面分別給出利用一條語(yǔ)句顯示提示框窗體和對(duì)話(huà)框的程序和界面,圖2是彈出一個(gè)消息框的程序和界面,圖3是彈出一個(gè)對(duì)話(huà)框的程序和界面。
對(duì)于消息框只需要一條函數(shù)調(diào)用的語(yǔ)句就可以顯示,對(duì)話(huà)框則需要先定義一個(gè)叫作“IDD_DIALOG1”的對(duì)話(huà)框資源,然后利用函數(shù)顯示該對(duì)話(huà)框。由于沒(méi)有設(shè)置該對(duì)話(huà)框的消息響應(yīng)函數(shù),所以該對(duì)話(huà)框什么都不能做,甚至關(guān)閉退出也不能做出響應(yīng)。這只是利用這兩個(gè)簡(jiǎn)單的程序說(shuō)明窗體的從無(wú)到有的生成過(guò)程,先建立一個(gè)直觀的窗體應(yīng)用程序的概念印象。
要?jiǎng)?chuàng)建現(xiàn)實(shí)中比較復(fù)雜的窗體應(yīng)用程序,可以按照教材中的步驟,先定義窗口類(lèi)結(jié)構(gòu)體,然后注冊(cè)這個(gè)窗口類(lèi)結(jié)構(gòu)體,接著顯示更新窗體,消息循環(huán),寫(xiě)消息響應(yīng)函數(shù)等等。有了這樣的套路,窗口應(yīng)用程序就不顯復(fù)雜了。
2.有了托管C++為什么還要標(biāo)準(zhǔn)C++
由于托管C++是運(yùn)行在.Net框架上的,因此,能夠充分享受.Net框架所帶來(lái)的一些好處。例如與托管代碼密切相關(guān)的托管數(shù)據(jù)是由公共語(yǔ)言運(yùn)行時(shí)負(fù)責(zé)分配和回收,公共語(yǔ)言運(yùn)行時(shí)通過(guò)垃圾收集功能自動(dòng)回收不再使用的資源,開(kāi)發(fā)人員不需要再處理特別復(fù)雜的資源引用。
同第一個(gè)問(wèn)題類(lèi)似,學(xué)完了MFC懷疑Win32;當(dāng)學(xué)完托管代碼編程,學(xué)生開(kāi)始懷疑MFC。標(biāo)準(zhǔn)C++也就是非托管的C++,在.Net框架上運(yùn)行的C++代碼叫做托管C++代碼,是隨著.Net技術(shù)發(fā)展而出現(xiàn)的。同學(xué)們的計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言學(xué)到一定的程度都會(huì)有一種體會(huì),語(yǔ)言的發(fā)展越來(lái)越高級(jí),終極目標(biāo)就是利用自然語(yǔ)言像來(lái)編寫(xiě)能夠在計(jì)算機(jī)上運(yùn)行的程序日常生活中的交流一樣簡(jiǎn)單。圖4梳理了一下程序設(shè)計(jì)語(yǔ)言的發(fā)展的奇經(jīng)八脈。從最初的0,1這樣的機(jī)器語(yǔ)言,到匯編語(yǔ)言,再到C語(yǔ)言,再到C++語(yǔ)言,到現(xiàn)在的托管C++語(yǔ)言,其發(fā)展越來(lái)越高級(jí),離程序員越來(lái)越近,但是離機(jī)器卻是越來(lái)越遠(yuǎn),對(duì)時(shí)空資源的依賴(lài)程度也越來(lái)越高,程序運(yùn)行的效率也越來(lái)越低。但是隨著硬件技術(shù)的發(fā)展,部分滿(mǎn)足了高級(jí)程序設(shè)計(jì)語(yǔ)言對(duì)硬件的要求,也抵消了部分運(yùn)行效率的問(wèn)題。在有些應(yīng)用場(chǎng)合,對(duì)軟件使用效率要求比較高,像圖像處理、文字處理等工具軟件,非托管C++還是首選,并且顯示出其強(qiáng)大生命力。因此即使在托管C++帶來(lái)程序開(kāi)發(fā)工作的簡(jiǎn)便性,也不能輕言放棄標(biāo)準(zhǔn)C++。
3.文檔視圖結(jié)構(gòu)中文檔是什么,視圖是什么
說(shuō)到文檔視圖結(jié)構(gòu),同學(xué)們不勝其煩,MFC Wizard生成了應(yīng)用程序的框架。如果Win32應(yīng)用程序能勉強(qiáng)理清楚程序的來(lái)龍去脈,那么MFC應(yīng)用程序純?nèi)徊恢^,甚至不知道程序從哪開(kāi)始執(zhí)行的。要想弄清楚這些,可以采取單步調(diào)試的方法,而這在教材中剖析的比較少,需要學(xué)生看更加專(zhuān)業(yè)的書(shū)籍。通過(guò)單步調(diào)試,就可以看出MFC程序運(yùn)行的起點(diǎn),AfxWinMain函數(shù)。實(shí)際上在程序執(zhí)行之前就已經(jīng)存在一個(gè)CWinApp類(lèi)的theApp全局對(duì)象,主要完成類(lèi)似Win32程序中的一些窗口相關(guān)的初始化工作。
從概念上講,微軟公司所推的產(chǎn)品中都講究層次化,即程序的結(jié)構(gòu)可以清晰地利用分層表達(dá)出來(lái),由不同層負(fù)責(zé)不同的任務(wù)。這與在網(wǎng)絡(luò)協(xié)議上講的分層概念以及今后還要繼續(xù)學(xué)習(xí)的MVC模型中模型和視圖的概念是類(lèi)似的。MFC應(yīng)用程序中將對(duì)數(shù)據(jù)的操作和數(shù)據(jù)的顯示界面分離,放在不同的類(lèi)對(duì)象中處理,這種思想使得程序模塊的劃分更加合理。文檔對(duì)象負(fù)責(zé)數(shù)據(jù)管理,不涉及用戶(hù)界面;視圖對(duì)象負(fù)責(zé)數(shù)據(jù)輸入輸出以及和用戶(hù)的交互,可以不考慮數(shù)據(jù)的具體組織結(jié)構(gòu)細(xì)節(jié)。
每個(gè)視圖類(lèi)都有一個(gè)指向文檔類(lèi)的指針,而每個(gè)文檔類(lèi)可以于一個(gè)或多個(gè)視圖類(lèi)相關(guān)聯(lián)。在文檔視圖結(jié)構(gòu)中,文檔視圖通過(guò)文檔模板CDocTemplate類(lèi)聯(lián)系在一起。一個(gè)應(yīng)用程序可以管理一個(gè)或多個(gè)文檔模板,每個(gè)文檔模板可以在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建和管理一個(gè)或多個(gè)文檔。本質(zhì)上,MFC程序最終都要落實(shí)到平臺(tái)SDK上,只是在這個(gè)基礎(chǔ)上做了一個(gè)類(lèi)的封裝而已??傊?,對(duì)文檔視圖結(jié)構(gòu)在宏觀上有個(gè)把握和理解,綱舉目張,對(duì)那些看似繁雜的類(lèi)來(lái)說(shuō)就能做到心中有數(shù),然后在指定的類(lèi)中添加自定義的代碼。
三、總結(jié)
C++高級(jí)程序設(shè)計(jì)課程是通信工程專(zhuān)業(yè)在C++程序設(shè)計(jì)課程基礎(chǔ)上開(kāi)設(shè)的一門(mén)面向Windows窗體應(yīng)用程序的專(zhuān)業(yè)基礎(chǔ)課。該課程需要學(xué)生預(yù)先掌握C++面向過(guò)程的程序設(shè)計(jì)基本語(yǔ)法,面向?qū)ο蟪绦蛟O(shè)計(jì)的基本概念。而在現(xiàn)在高校課時(shí)壓縮的大背景下,這些原先安排兩個(gè)學(xué)期的基礎(chǔ)知識(shí)現(xiàn)在壓縮到一個(gè)學(xué)期完成,學(xué)生大多感覺(jué)吃力。因此在C++高級(jí)程序設(shè)計(jì)的課程學(xué)習(xí)中就會(huì)遇到一些問(wèn)題,這需要教師在有限課時(shí)的教學(xué)過(guò)程中要將技術(shù)發(fā)展的來(lái)龍去脈告訴學(xué)生,而不是就某一點(diǎn)講某一點(diǎn),讓學(xué)生有一個(gè)整體的把握,這樣更加會(huì)激發(fā)學(xué)生的興趣。
參考文獻(xiàn):
[1]曾憲權(quán).Visual C++.NET程序設(shè)計(jì)實(shí)用教程[M].北京:清華大學(xué)出版社,2009.
(責(zé)任編輯:宋秀麗)