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