▲ 原全國政協副主席、國務委員、國家科委主任、
中國工程院院長宋健同志給譚浩強教授的題詞
▲ 原全國人民代表大會常務委員會副委員長、中
國科學院院長盧嘉錫給譚浩強教授的題詞從20世紀70年代末、80年代初開始,我國的高等院校開始面向各個專業的全體大學生開展計算機教育。特別是面向非計算機專業學生的計算機基礎教育,牽涉的專業面廣、人數眾多,影響深遠。高校開展計算機基礎教育的狀況將直接影響我國各行各業、各個領域中計算機應用的發展水平。這是一項意義重大而且大有可為的工作,應該引起各方面的充分重視。
30多年來,全國高等院校計算機基礎教育研究會和全國高校從事計算機基礎教育的老師始終不渝地辛勤工作,深入探索,努力開拓,積累了豐富的經驗,初步形成了一套行之有效的課程體系和教學理念。30年來高等院校計算機基礎教育的發展經歷了3個階段: 20世紀80年代是初創階段,帶有掃盲的性質,多數學校只開設一門入門課程;20世紀90年代是規范階段,在全國范圍內形成了按3個層次進行教學的課程體系,教學的廣度和深度都有所發展;進入21世紀,開始了深化提高的第3階段,需要在原有基礎上再上一個新臺階。
在計算機基礎教育的新階段,要充分認識到計算機基礎教育面臨的挑戰:
(1) 在世界范圍內信息技術以空前的速度迅猛發展,新的技術和新的方法層出不 窮,要求高等院校計算機基礎教育必須跟上信息技術發展的潮流,大力更新教學內容,用信息技術的新成就武裝當今的大學生。
(2) 我國國民經濟現在處于持續快速穩定發展階段,需要大力發展信息產業,加快經濟與社會信息化的進程,這就迫切需要大批既熟悉本領域業務,又能熟練使用計算機,并能將信息技術應用于本領域的新型專門人才。因此需要大力提高高校計算機基礎教育的水平,培養出數以千百萬計的計算機應用人才。
(3) 從21世紀初開始,信息技術教育在我國中小學中全面開展,計算機教育的起點從大學下移到中小學。水漲船高,這樣也為提高大學的計算機教育水平創造了十分有利的條件。
迎接21世紀的挑戰,大力提高我國高等學校計算機基礎教育的水平,培養出符合信息時代要求的人才,已成為廣大計算機教育工作者的神圣使命和光榮職責。全國高等院校計算機基礎教育研究會和清華大學出版社于2002年聯合成立了“中國高等院校計算機基礎教育改革課題研究組”,集中了一批長期在高校計算機基礎教育領域從事教學和研究的專家、教授,經過深入調查研究,廣泛征求意見,反復討論修改,于2004年春提出了新的高校計算機基礎教育改革思路和課程方案,并編寫了《中國高等院校計算機基礎教育課程體系2004》(簡稱CFC 2004),由清華大學出版社出版。之后又陸續推出CFC 2006、CFC 2008和CFC 2014。該課題受到各方面的關注、支持和歡迎,大家一致認為CFC 提出了一個既體現先進又切合實際的思路和解決方案。
為了實現課題研究組提出的要求,必須有一批與之配套的教材。教材是實現教育思想和教學要求的重要保證,是教學改革中的一項重要的基本建設。如果沒有好的教材,提高教學質量只是一句空話。要寫好一本教材是不容易的,不僅需要掌握有關的科學技術知識,而且要熟悉自己工作的對象,研究讀者的認識規律,善于組織教材內容,具有較好的文字功底,還需要學習一點教育學和心理學的知識等。一本好的計算機基礎教材應當具備以下5個要素:
(1) 定位準確。要十分明確本教材是為哪一部分讀者寫的,要有的放矢,不要不問對象,提筆就寫。
(2) 內容先進。要能反映計算機科學技術的新成果、新趨勢。
(3) 取舍合理。要做到“該有的有,不該有的沒有”,不要包羅萬象、貪多求全,不應把教材寫成手冊。
(4) 體系得當。要針對非計算機專業學生的特點,精心設計教材體系,不僅使教材體現科學性和先進性,還要注意循序漸進、降低臺階、分散難點,使學生易于理解。
(5) 風格鮮明。要用通俗易懂的方法和語言敘述復雜的概念。善于運用形象思維,深入淺出,引人入勝。
為了推動各高校的教學,我們愿意與全國各地區、各學校的專家和老師共同奮斗,編寫和出版一批具有中國特色的、符合非計算機專業學生特點的、受廣大讀者歡迎的優秀教材。為此,我們成立了“中國高等院校計算機基礎教育課程體系規劃教材”編審委員會,全面指導本套教材的編寫工作。
這套教材具有以下幾個特點:
(1) 全面體現CFC 的思路和課程要求。本套教材的作者多數是課題研究組的成員或參加過課題研討的專家,對計算機基礎教育改革的方向和思路有深切的體會和清醒的認識。因而可以說,本套教材是CFC 的具體化。
(2) 教材內容體現了信息技術發展的趨勢。由于信息技術發展迅速,教材需要不斷更新內容,推陳出新。本套教材力求反映信息技術領域中新的發展、新的應用。
(3) 按照非計算機專業學生的特點構建課程內容和教材體系,強調面向應用,注重培養應用能力,針對多數學生的認知規律,盡量采用通俗易懂的方法說明復雜的概念,使學生易于學習。
(4) 考慮到教學對象不同,本套教材包括了各方面所需要的教材(重點課程和一般課程;必修課和選修課;理論課和實踐課),供不同學校、不同專業的學生選用。
(5) 本套教材的作者都有較高的學術造詣,有豐富的計算機基礎教育的經驗,在教材中體現了研究會所倡導的思路和風格,因而符合教學實踐,便于采用。
本套教材統一規劃,分批組織,陸續出版。希望能得到各位專家、老師和讀者的指正,我們將根據計算機技術的發展和廣大師生的寶貴意見隨時修訂,使之不斷完善。
全國高等院校計算機基礎教育研究會榮譽會長
“中國高等院校計算機基礎教育課程體系規劃教材”編審委員會主任
本書是一本介紹C++面向對象程序設計的入門基礎教材。
目前的主流計算機的指令執行是過程導向的,每一個步驟(計算機指令)是依次執行的。因此早期的編程語言也是面向過程的,設計者必須充分地考慮程序的每一個細節,要指定程序在每一環節應執行的動作。
C語言是面向過程的結構化和模塊化的語言,C語言是編寫UNIX操作系統的語言,功能強大,使用靈活。它在處理小型問題上得心應手,但在處理大型復雜問題時就顯得力不從心了。現代計算機應用已經遠遠超出了科學計算和控制計算機操作的層面,而是更多地去解決各種各樣現實生活工作中的復雜問題,比如模擬氣象現象,制作文字、圖形、視頻作品等。為了處理復雜應用程序,計算機科學家提出了面向對象程序設計的理論,并于20世紀末期在C語言的基礎上推出支持面向對象的C++語言,為處理復雜應用程序提供了有力的工具。
近年來,國內許多大學的計算機類專業都開設了C++程序設計課程,一些大學的非計算機專業也開設了C++面向對象程序設計課程,許多學過C語言程序設計的人也想了解和學習C++和面向對象程序設計的有關知識。但是,由于C++涉及概念很多,語法比較復雜,內容十分廣泛,使不少人感到學習難度較大,難以入門。
應讀者的要求,作者在十多年前編著了《C++程序設計》一書,由清華大學出版社出版并向全國發行。該書以未學過C語言的讀者為對象,從面向過程入手介紹程序設計的基本知識和方法,然后介紹用C++進行面向對象程序設計的方法。由于內容全面,概念清晰,通俗易懂,該書出版后,受到各校師生的歡迎和好評,幾年內發行了70多萬冊。
目前在大學理工類專業,普遍開設了C語言程序設計的課程,許多學生在學習C語言后希望對C++面向對象程序設計有所了解,以便日后在需要時能較快地進入該領域。很多師生希望我能出版一本以C語言為起點的C++教材。
為此,幾年前我在清華大學出版社出版了《C++面向對象程序設計》一書。該書是在《C++程序設計》一書的基礎上編寫而成的,對于已學習過C語言程序設計的讀者,不必再重新學習面向過程程序設計的部分,而可以直接從面向對象程序設計入手。作者將《C++程序設計》一書中介紹面向對象程序設計的內容抽出來改寫后單獨成書,并且重新寫了第1章“從C到C++”,介紹C++面向對象程序設計的初步知識以及C++對C在面向過程程序設計方面的擴展,為以后各章的學習打下基礎。這樣的安排使本書內容更集中,篇幅更緊湊。該書仍然保持了通俗易懂、貼近讀者、容易入門的特點。希望有助于大學生學習C++課程,初步掌握面向對象程序設計的方法。
幾年前,作者曾對此書進行過修訂,出版了《C++面向對象程序設計(第2版)》,最近根據教學實踐的情況,又進行一次全面的修訂。這次修訂,在保留原書內容全面、概念清晰的優點的基礎上,從章節標題到正文都作了不少修改和補充,使之更加通俗易懂,容易學習。現在出版《C++面向對象程序設計(第3版)》,即本書。
在此,對本書的指導思想作以下的說明。
1. 教材要準確定位
首先要明確教材是為什么人寫的,他們學習C++的目的是什么,要學到什么程度,不能無的放矢。推出C++的初衷是為了解決大型復雜應用軟件開發中遇到的問題,提高軟件的開發效率。只有參加過研制相對大型軟件的人才會真正體驗到C++的優越性。應當說明,本書的主要對象不是C++的專業開發人員,而是高校各專業的大學生和自學現代編程語言的讀者,本書不是程序員培訓班教材。本書的讀者一般并無實際程序開發的經驗,將來多數人也不一定成為專業的編程人員。
不可奢望,通過幾十小時的學習,就能使一個沒有C++程序設計基礎的初學者變成一個熟練的C++開發人員。應當有實事求是的分析和估計。
本書的定位是“入門”與“基礎”。用有效的方法使讀者順利入門,通過學習,打好基礎。通過學習本書,多數讀者會有以下收獲:①清晰地了解面向對象程序設計的方法以及C++的主要功能與特點;②能夠用C++編寫簡單的面向對象的程序;③能看懂別人編寫的規模比較小的C++程序; ④奠定進一步學習和應用的良好基礎。也就是從“不知”到“初知”,從“不會”到“初會”。入了門,有了良好的基礎,以后提高和應用就不困難了。
2. 要設計合適的教材體系,合理取舍內容
學習C++面向對象程序設計,應當對面向對象的方法和C++的基本特點有基本的了解。
C++面向對象程序設計牽涉面向對象程序設計的理論和C++語言的語法兩個方面,都很重要。本書主要介紹C++處理問題的面向對象的思維方式和C++語言的基本內容。我們不是抽象地介紹面向對象程序設計的理論,也不是枯燥地介紹C++的語法,而是以程序設計為中心把這兩個方面有機地結合起來。在介紹用C++語言編程的過程中,自然而然地引出面向對象程序設計的有關概念,通過C++編程過程理解面向對象程序設計方法,二者緊密結合,相得益彰。
本書內容系統而全面。面向對象程序設計有4個主要特點:抽象、封裝、繼承和多態性,在C++語言中都有相應的機制來實現它們。作為教材,不能忽略C++的主要內容,本教材的內容全面涵蓋了以上4個方面,提供了詳細而通俗的介紹和編程舉例。
我們努力使讀者通過較短時間的學習,能對面向對象方法和C++有基本和全面的了解,而不是陷于煩瑣的細節之中。教材不同于使用手冊。手冊的任務是提供無所不包的使用細節以備查詢,而教材的任務是用容易理解的方法講清楚有關的基本概念和基本方法。不能把教材寫成包羅萬象的手冊,否則將會使篇幅過大,而且會沖淡重點,主次不分,使讀者感到枯燥無味。
本書的做法是:從應用出發,對編程所用到的最基本內容和注意的問題都作了詳細的說明,但是并不羅列C++語法中過多的細節,需要時把一些細節列出成表,供用時查閱。希望讀者在學習時,要“多理解,勿死記”,以把主要精力放在基本概念和基本方法上。
要深入了解和掌握面向對象程序設計的概念和方法,是一個學習——實踐——再學習——再實踐的過程,不可能一蹴而就。在初學階段,要引導讀者初步理解面向對象的概念,并由簡到繁地學會編寫C++程序。奠定了C++編程的初步基礎,以后再進一步提高。這樣的方法可能符合大多數學習者的情況,降低了學習難度。
3. 概念清晰,深入淺出,化難難點,容易學習
C++不容易學,也不容易教。作者在寫作過程中花了很大的精力考慮怎樣使讀者接受和理解。作者一貫認為:教材編著者應當與讀者將心比心,換位思考,要站在讀者的角度思考和提出問題,幫助他們解除學習中的困難。要善于把復雜的問題簡單化,而不應當把簡單的問題復雜化,要善于化解難點,深入淺出。
作者著力使讀者對于面向對象的方法和C++的特點有清晰、準確和全面的認識。有一些面向對象的概念,名詞很抽象,理論很難懂,有的初學者會被唬住,感到高深莫測。作者用通俗易懂的方法和語言敘述清楚復雜的概念,化解學習中的困難。讀者可以看到,在本書中,幾乎對每一個新出現的概念,都會用日常生活中的例子加以通俗地說明,一看就懂,很容易理解和入門。
希望讀者不要被一大堆高深莫測的名詞術語嚇住,有些問題看起來很深奧,其實換一個角度去解釋就很容易理解,一個通俗的例子就把問題說清楚了。
C++的名詞術語很多,一般C++的教材的章節標題都是一些陌生的、深奧莫測的專業詞匯,往往使人摸不著頭腦,不知道要學的是什么,難以引發學習的興趣和欲望。作者經過反復思考,改變了標題的寫法,不是簡單地列出一個名詞術語,而是著重說明它是解決什么問題的。例如,原來有一節的標題是“帶參的構造函數”,這次作者把它改為“用帶參的構造函數對不同對象進行初始化”,讀者從標題就可以知道帶參的構造函數是為了對象初始化的,從前一節到下一節,前后連貫,承上啟下,讀者就會想看看究竟是怎樣處理的。又如,有一節的標題是“友元”,讀者第一次聽到這個術語,往往不知所云,這次作者把標題改為“可以訪問私有數據的‘朋友’”,通俗易懂,具有目的性和啟發性,使讀者想去了解和學習。學習的過程不應該是“教師講什么,學生學什么”的被動式學習,應當形成學生主動思考問題、主動學習的局面。
在各章的敘述中,本書不是先給出一個新概念或新術語,再去解釋它,而是先提出需要解決的問題,然后討論用什么方法去處理它,從而引出新的概念和新的方法。傳統的教學三部曲是:“提出概念—解釋概念—舉例說明”,作者在多年的計算機教學實踐中,采用了新的教學三部曲:“提出問題—分析和解決問題—歸納分析”。 在引入每一個程序時,都按照以下幾個步驟展開:提出問題—編寫程序—運行結果—程序分析。由淺入深,逐步展開。不是先理論后實際,先抽象后具體,先一般后個別,而是從具體到抽象,從實際到理論,從個別到一般,從零散到系統。這樣做,符合初學者的認知規律。
4. 教學過程要采取“容易入門,逐步提高”的方法
(1) 精心選擇例子。教材中的例題是基礎性質的,是為了幫助讀者更好地理解某一方面的教學內容而專門編寫的,相對簡單,容易理解。
作者認為,在初學階段的例題不宜太復雜,更不宜把一些比較復雜的實際應用的程序直接搬到課堂當作例題。一個實用的C++程序需要考慮許多因素,綜合各部分知識,有許多注釋行,而且一般是多文件的程序包,讀懂這類大型程序往往需要一定的經驗。作為教學程序要對問題進行簡化,盡量壓縮不必要的語句。
本書中的例題的選擇原則是:①通過例題能更深入地理解有關的概念和編程方法。②篇幅一般不太長,絕大多數讀者能獨立讀懂程序。③通過程序舉例使讀者掌握編程的方法和技巧。
(2) 在初步掌握C++編程方法后,后續階段學習的例題程序會逐漸復雜一些。各章例題的難度是循序漸進的,每一個臺階都不大,讀者能在原來的基礎上逐步提高。
(3) C++面向對象程序設計的概念較多,語法復雜。有的讀者往往把精力放在弄清楚一個個具體問題上,而在學完一章后對全章的內容缺乏整體的概念。建議讀者對于教材每一章的內容一定至少認真讀兩遍,第一遍弄清楚各個部分的內容,不留死角。然后在學完全章后再從頭到尾認真看一遍,把各個知識點串成一條線,建立一個整體的概念,知道本章講了什么,重點在哪里,難點在哪里,在編程中怎樣使用它們。在開始學習時是化整為零,各個擊破,然后再化零為整,形成整體的認識。凡是這樣做的讀者都覺得有很大收獲。
(4) 不要滿足于能看懂例題程序,而應當在學完每一章后自己獨立編寫比例題難度大一點的程序。在各章最后的習題中,有些題的難度比教材中的例題稍大一些,希望教師能從中選擇一些指定學生完成,并通過上機實踐,進一步掌握C++的調試與運行的方法。
(5) 在學完本教材各章后,最好學習一些綜合的程序實例,以鞏固收獲,提高編程能力。本書的參考用書《C++程序設計實踐指導》,提供了約50個實用或接近實用的程序,教師可以從中選擇一些在課堂講授,或者指定學生自己閱讀參考。
(6) 本書便于自學,即使沒有老師講解,讀者也能看懂本書的大部分內容。老師可以要求學生先自學,然后在課堂上選擇重點內容講授。有些語法中的具體的規定可以不必講授,由學生自學。
5. C++教材應當體現C++標準
C++是從C語言發展而來的。多數編譯器同時兼容C與C++。C++中有很多語法是繼承了C的(當然也有不少改進)。熟悉C編程的人往往會沿用某些C的傳統用法,例如,頭文件帶后綴.h;使用系統庫時不使用命名空間;早期的C允許主函數為void類型、主函數可以無返回值等。但是,ANSI C++標準在一些方面有新的規定,例如,要求主函數為int類型,如果程序正常執行則返回0值;系統頭文件不帶后綴.h;使用系統庫時使用命名空間std;增加了字符串類型string等。
雖然C++編譯器仍然允許使用從C繼承來的一些傳統用法,但作者認為,作為教材,應當提倡C++的標準用法。引導讀者從一開始就按照C++標準編寫程序,養成C++的編程習慣和風格。本書各章都是依據C++標準介紹的,同時也說明允許使用的C的傳統用法。在本書中,程序的形式大致如下:#include//頭文件不帶后綴.h
#include//包含string頭文件,以便序中使用字符串變量
using namespace std;//使用系統庫時使用命名空間std
int main() //主函數為int類型
{string str; //可以定義字符串變量str
…
return 0; //程序正常執行則返回0
}6. 提供配套的教學資源,滿足教學需要
考慮到不同學校、不同專業、不同讀者對學習C++有不同的要求,因此我們提供了配套的教學資源,供選用。
除了主教材外,推薦使用以下兩本教學參考書:
(1) 《C++面向對象程序設計(第3版)學習輔導》,譚浩強編著,清華大學出版社出版。該書提供主教材各章中的全部習題的解答。由于教材篇幅有限,有些很好的例子無法在教材中列出,因此把它們作為習題,希望讀者自己完成,教師也可以從中選擇一些習題作為例題講授。學生除了完成教師指定的習題外,最好把習題解答中的程序看一遍,以更好地理解C++程序,擴大眼界,啟迪思路,豐富知識,增長能力。
程序設計是一門實踐性很強的課程,只靠聽課和看書是學不好的。衡量學習好壞的標準不是“懂不懂”,而是“會不會干”。因此必須強調多編程,多上機實踐。在《C++面向對象程序設計(第3版)學習輔導》中,還介紹了運行C++程序的方法。此外,書中還給出上機實踐任務,要求學生完成若干次上機實踐。
(2) 《C++程序設計實踐指導》,陳清華、朱紅編著,清華大學出版社出版。該書提供了50多個具有實用價值的C++應用程序。這是為學習教材后進一步深入學習的讀者準備的,目的是提高編程能力。該書內容包括: 怎樣編寫C++應用程序;提供若干不同規模的實際的C++應用程序供分析閱讀;安排并指導學生完成1~2個C++應用程序。經過這樣的訓練,學生的實際能力將會有較大的提高。
此外,本書還提供教材中全部例題的源程序,以便于教師上機和講授,也便于學生在此基礎上調試和修改程序,需要者可在清華大學出版社官網下載。同時,還向使用本書的教師免費提供講課的電子演示文稿(PPT的素材),以節省教師的備課時間。
本書由譚浩強教授編寫,譚亦峰也參加了部分編寫工作。全國高等院校計算機基礎教育研究會和浩強工作室的各位專家以及全國各高校老師多年來對作者始終給予了熱情的支持和鼓勵。清華大學出版社對本書的出版十分重視并作了周到的安排,使本書得以在短時間內出版。對于曾經鼓勵、支持和幫助過我的朋友,謹表示真摯的謝意。
本書肯定會有不妥之處,誠盼專家和廣大讀者不吝指正。
謹識2020年5月于清華園