本書是在《C 語言程序設計(MOOC版)》的基礎上進一步總結愛課程網中國大學MOOC(http://www.icourse163.org/)的網絡教學實踐修訂而成。本書按照實際編程應用來梳理和組織C 語言的知識點,按章節順序可分為程序設計基礎、結構化程序設計方法和面向對象程序設計方法三大部分。內容編排由易到難,循序漸進。每個小節都設計了適合在線評判的單選練習題,每章則設計了適合課堂討論的程序閱讀題、改錯題和編程題。
凡開設C 語言程序設計課程的教師可將本書作為授課教材使用,聯系作者可免費獲得配套教學課件和視頻。參加慕課(MOOC)或其他網絡課程學習的學生可將本書作為線下閱讀教材使用。
本書是在《C 語言程序設計(MOOC版)》的基礎上進一步總結愛課程網中國大學MOOC(http://www.icourse163.org/)的網絡教學實踐修訂而成。依據本教材開設的C 語言程序設計MOOC(慕課)課程已開設四個學期,累計選課人數已超過十萬人。
第2版前言
本書是在《C 語言程序設計( MOOC版)》的基礎上進一步總結愛課程網中國大學MOOC(http://www.icourse163.org/)的網絡教學實踐修訂而成。依據本教材開設的C 語言程序設計MOOC(慕課)課程已開設四個學期,累計選課人數超過十萬人。
MOOC學員能夠積極參與課堂討論,提出各種問題,并對如何開展C 語言程序設計教學提出了很多寶貴的意見和建議。這里分享幾個MOOC課堂的精華貼。
【空空mooc369】:這門課是學軟件的,為什么第1章很多內容是關于硬件的呀?
【教師回復】:初學者學習程序設計,首先應樹立以下兩個觀念。
(1) 程序員向計算機硬件下達指令,然后由硬件執行指令。程序員應首先了解硬件的基本結構和工作原理,這樣才能知道如何向硬件下達指令。
(2) 程序是一組下達給計算機硬件的指令序列(或稱為語句序列)。僅從語法角度去理解,語句是抽象的。初學者要學會從有形的硬件去理解抽象的語句和語法。
程序設計課程只在一開始簡單介紹一下硬件,后續章節在講解C 語法時會提及內存或CPU等硬件。
【luckymooc360】:C 語言為什么提出引用和指針的概念?
【教師回復】:程序員通過定義變量來申請內存,再用變量名訪問所分配的內存單元。大型程序需要多個程序員協作開發,共同完成。如果其他程序員想訪問上述變量的內存單元,例如讀取其中的數據,可以嗎?答案是肯定的,可以,但只能通過引用或指針來訪問(即間接訪問)。
【小二上盤ID】:老師,我們學校先學C語言,然后學的是C#和Java。怎樣才能學好程序設計?以后從事工作用Java好,還是C/C 好?
【教師回復】:如何學習程序設計,這是很多初學者經常提出的問題。經過一段時間的學習,很多同學會產生新的困惑。例如,理論知識看了好幾遍了,但是怎樣提高編程能力?自己對MOOC課程的學習效果很滿意,下一步該做什么?程序設計的學習過程是什么樣的,最終能學到什么程度?針對這些問題我談一下個人體會,供同學們參考。
學習程序設計大致可以分為三個階段:初級、中級和高級。
(1)初級。初級階段的目標是學習程序設計原理,其中包括計算機硬件基本結構及其工作原理,程序如何管理內存來存儲數據(例如變量的定義與訪問,數據類型,引用與指針等)、程序如何控制CPU來處理數據(例如各種不同的運算符,或通過控制語句來控制指令的執行順序)等。程序設計原理還要學習如何設計大型、復雜的程序,這就需要學習程序設計方法。程序設計方法有兩種,分別是結構化程序設計和面向對象程序設計。初級階段學習結束后,同學們可以參加計算機等級考試(二級)或各種程序設計大賽等活動,并在應試過程中進一步提高自己的水平。
(2)中級。中級階段的目標是學習程序應用開發(學會就能有好工作了哦)。程序應用開發需要基于別人的程序來開發,從零開始是不可能的。結構化程序設計方法規定:其他人給你函數庫,你要會調用別人的函數。面向對象程序設計方法規定:其他人給你類庫,你要知道如何使用別人的類庫。因此我們在學習應用開發之前必須要掌握結構化程序設計方法或面向對象程序設計方法。目前面向對象程序設計是主流,已經很少有人繼續給程序員提供函數庫了,所提供的都是類庫。掌握了面向對象程序設計方法,你只要拿到微軟公司提供的MFC類庫(隨Visual C 6.0或Visual Studio提供),就可以用C 語言開發Windows圖形界面的程序(或者你拿到蘋果公司的類庫、谷歌公司的類庫,就可以使用這些類庫開發iPhone或Android系統的App了)。不同的操作系統是由不同廠家開發的,它們對計算機語言的支持程度有所不同。例如,Windows操作系統是由微軟開發的,開發Windows軟件主要使用C 和C#語言; MacOS/iOS操作系統是由蘋果公司開發的,開發MacOS/iOS軟件主要使用Objective-C(C 的變種);Android操作系統(從Linux演變而來)由谷歌公司主導,開發Android軟件主要使用Java語言。可以看出,程序應用開發可能會用到不同的計算機語言,但程序設計原理是共同的。
(3) 高級。高級階段的目標是提高自己的理論水平,不光要知其然,還要知其所以然。計算機專業的同學需要先學習程序設計原理,然后再學習計算機組成原理、數據結構、操作系統、編譯原理、數據庫原理、計算機網絡、計算機圖形學、數字圖像處理、算法設計、離散數學和人工智能等課程。在學習完這些專業課程之后,你的理論水平會得到很大提高,將會成為一名真正的高手。
【LingDash】:老師,總地來說講得挺好的,但是我有些想法。比如在講類的繼承與派生時,應先讓學生體會到,每個類都從底層開發十分麻煩,那么怎么解決呢?這時引出類的繼承與派生,將用與不用類的繼承與派生進行比較,這樣的學習會更加符合人的認知規律。
【教師回復】:有道理,接受你的建議,謝謝!
【cc76965】很高興能夠遇到這門公開課。這門公開課的條理十分清晰,讓我對C 的語法有了一個清晰的脈絡。我是一名計算機專業的學生,已經學了數據結構,但是缺少開發項目的經驗。不知道如何去尋找開發項目,也不知道如何下手,希望老師能夠給我一些建議。
【網友Crazy峰少回復】:下面這個網站里有大量的編程題目可以做:https://www.patest.cn/。
這一版就是在總結廣大MOOC學員所提出的難點、問題和建議的基礎上對上一版所做的修訂。重點完善了結構化程序設計和面向對象程序設計這兩種程序設計方法的內容,使之更加系統化。
在此謹向中國大學MOOC和所有提出寶貴建議的MOOC學員們表示感謝!
作 者
2017年3月于北京
前言
1. 關于MOOC
MOOC(Massive Open Online Course),即大規模開放在線課程,中文譯為慕課,是近幾年興起的一種基于互聯網的新型教學模式。2012年被稱為MOOC元年。MOOC教學模式實現了兩個轉變,即由以教師為中心向以學習者為中心轉變,學習者則由被動學習向主動學習轉變。與普通網絡教學視頻所不同的是,MOOC實現了從授課到習題、討論、答疑、測驗,直到最終學習評價等環節的完整教學過程。與傳統課堂授課不同的是,開設MOOC課程需重新梳理和組織知識點,并分別提供適合線上使用的練習題以及線下使用的討論或實驗題。
可以將線上MOOC與線下課堂這兩種教學模式結合起來。線上MOOC就是先由學生自主完成知識學習,例如觀看視頻、做線上習題等。線下課堂則是由教師組織課堂討論、實驗、測驗,或講解重點疑難問題。線上MOOC,線下課堂是對現有課上聽課,課下作業教學模式的翻轉。雖然MOOC教學模式尚處于起步試驗階段,但大多數網絡學習者十分喜歡MOOC。目前已涌現出很多知名的MOOC網站,例如國外的Coursera、Udacity和Edx,國內的中國大學MOOC、學堂在線和雨虹學網等。中國農業大學也正在基于雨虹學網積極開展校內課堂教學改革方面的嘗試與探索。
學習C 語言程序設計需要邊閱讀、邊思考、邊消化吸收。雖然有了大量的網上資源,但紙質教材仍是初學者線下學習的首選方式,這也是作者編寫出版本書的目的。
2. 本書特色
1)適用于MOOC在線教育課程
本書按應用需求來梳理和組織C 語言的知識點,其中包括結構化程序設計方法和面向對象程序設計方法。內容編排由易到難,循序漸進。每個小節都設計了適合在線評判的單選練習題,每章則設計了適合課堂討論的程序閱讀題、改錯題和編程題。
2)采用案例教學
每個知識點都從精心設計的任務需求開始導入,然后提出對應的實現方法,最后系統地闡述其語法細則,既保證了知識體系的完整性,又能讓讀者直觀理解抽象的概念和原理。
3)創新教學方法
本書從三個方面對C 語言教學進行了探索。一是強化初學者對程序由計算機硬件執行這一基本概念的認知,從有形的硬件來理解相對抽象的程序,這樣各種語法概念就不再那么抽象了;二是明確提出程序設計過程中存在不同的程序員角色,并充分利用角色來引導讀者理解語法的應用語境;三是明確提出必須從代碼分類管理、數據類型、歸納抽象和代碼重用等多個維度才能準確理解面向對象程序設計方法。教學實踐表明,上述教學方法可降低學習難度。
3. 內容摘要
本書內容按章節順序可分為三部分,分別是程序設計基礎(第1~4章)、結構化程序設計方法(第5~6章)和面向對象程序設計方法(第7~10章)。
第1章 程序設計導論。從初學者對計算機已有的認知開始,將初學者逐步引導到計算機程序的世界。本章首先介紹計算機硬件、指令及機器語言、程序等基本概念,然后描述程序與計算機硬件、程序員、用戶之間的關系,讓讀者在一開始就能明確程序員的職責,實現從用戶到程序員的角色轉換。本章要點:一是讓讀者從有形的硬件來理解相對抽象的軟件;二是讓讀者認識到計算機中的數據是有類型的,類型決定了數據在計算機中的存儲位數和存儲格式;三是讓讀者知道,學習程序設計和學習編程語言不是一回事。和C語言、Java語言相比,C 語言的知識體系更加系統、全面。本書選用C 語言作為程序設計初學者的入門語言。
第2章 數值計算。本章從最簡單的數值計算問題開始,以案例教學的方式讓讀者領會程序設計中一些最基礎的概念,其中包括程序中的變量和常量、表達式與運算符、數據的輸入和輸出等。最后介紹了C 程序訪問內存的三種方式,它們分別是變量名、引用和指針。本章要點:一是讓讀者將程序中的數據與內存聯系起來,這樣就很容易理解數據類型、引用和指針等初學者難以掌握的概念;二是讓讀者重點關注運算符的運算規則、優先級和結合性等語法細節;三是讓讀者初步體會到計算機語言與人類語言的不同之處,即計算機語言的語法規則非常嚴格,甚至到了機械的程度,稍有不慎就會出現語法錯誤。
第3章 算法與控制結構。本章講解程序中的算法及三種算法基本結構,并通過選擇結構和循環結構中的條件引出布爾類型。C 語言通過選擇語句來描述選擇結構算法,通過循環語句來描述循環結構算法。最后通過案例簡單講解算法的設計與評價方法。本章要點:一是讓讀者了解絕大部分復雜算法都可以由三種基本的算法結構來完成;二是讓讀者掌握布爾類型的作用及其相關的運算符;三是讓讀者了解編程能力實際上是一個人計算思維能力的反映,閱讀程序和模仿編程是初學者培養計算思維能力的兩個重要途徑;四是讓讀者根據案例認真體會如何根據算法合理選用不同的控制語句。
第4章 數組與文字處理。本章學習如何在程序中存儲和處理大量數據。數組可以存儲大量具有相同類型的數據集合。計算機只能存儲和處理數值數據,而文字處理程序所處理的對象是字符數據,為此,C 語言引入了字符類型。讀者需深入了解字符編碼和字符類型。文字處理必須使用數組,即字符型數組。本章最后用一節的篇幅簡單介紹了中文處理及Unicode編碼。本章要點:一是讓讀者重點掌握數組定義及訪問的語法規則;二是讓讀者認識到計算機內部對數組的管理和訪問是通過指針(即內存地址)來實現的;三是讓讀者通過具體案例初步了解數組的常用處理算法。
經過前4章的學習,讀者已掌握了程序設計原理基礎部分的內容。那么該如何編寫更大型的計算機程序呢?這就需要進一步學習程序設計原理的高級部分,即程序設計方法。程序設計方法的基本思想是:將大型程序中的數據和算法分解成程序零件,將不同零件的設計任務交由不同的程序員完成,這樣就能以團隊的形式來共同開發。更進一步,如果所分解出的程序零件在以前項目中曾經開發過,或者可以從市場上購買到,那么就可以直接使用這些零件來組裝軟件,實現快速開發。使用已有的程序零件,實際上是重用其程序代碼,這就是程序設計中的代碼重用。從第5章開始,本書對程序設計方法進行系統介紹。
第5章 結構化程序設計之一。本章學習如何將一個復雜的數據處理算法分解成多個簡單模塊,分而治之,這被稱為是結構化程序設計方法。C 語言支持結構化程序設計方法,以函數的語法形式來描述和組裝模塊,即函數的定義和調用。函數是結構化程序設計方法的基礎,它為代碼重用提供了有效的手段。函數之間需要共享數據才能完成規定的數據處理任務。C 語言提供了集中管理和分散管理兩種不同的數據管理策略。本章要點:一是讀者要準確領會結構化程序設計的思想內涵,并熟練掌握C 語言中函數相關的語法知識;二是讓讀者深入計算機內部,了解程序執行時其代碼和變量在內存中的存儲原理,這樣可以更容易理解變量作用域和生存期等抽象的概念;三是讀者要準確把握函數間傳遞數據的三種方式;四是讀者要分別站在兩種不同的程序員角度,即定義函數的程序員和調用函數的程序員,才能更容易地理解函數相關的各種語法知識。
第6章 結構化程序設計之二。本章學習如何以多文件結構的形式來組織和管理源代碼,并介紹幾種常用的編譯預處理指令;然后再介紹幾種特殊形式的函數,其中包括帶默認形參值的函數、重載函數、內聯函數、帶形參和返回值的主函數以及遞歸函數等。本章還會介紹與C語言相關的系統函數和自定義數據類型。本章最后以微軟公司開發的Win32 API函數庫為例介紹如何開發一個Windows圖形用戶界面程序,并對結構化程序設計方法進行簡單的回顧和總結。本章要點:一是學習掌握與多文件結構相關的語法知識,其中包括外部函數和全局變量的聲明、頭文件等;二是重點掌握帶默認形參值的函數、重載函數和內聯函數這三種常用的特殊函數形式;三是牢固樹立重用代碼的思想,學會通過調用他人編寫的函數來提高開發效率。
第7章 面向對象程序設計之一。面向對象程序設計方法將程序中的數據元素和算法元素根據其內在關聯關系進行分類管理,這就形成了類的概念。分類可以更好地管理。類相當于是一種自定義的數據類型,用類所定義的變量稱為對象。本章通過具體案例演示了結構化程序設計是如何演變到面向對象程序設計的,然后再系統地介紹面向對象程序設計方法。本章內容包括類的定義、對象的定義與訪問、對象的構造與析構、類中的常成員與靜態成員以及類的友元等。本章要點:一是讀者必須從代碼分類管理、數據類型、歸納抽象和代碼重用等多個維度才能準確理解類與對象的概念;二是讀者需認真學習類與對象編程的具體語法規則;三是深入領會面向對象程序設計通過設置訪問權限來實現類封裝的基本原理;四是深入了解對象的構造與析構過程,程序員通過編寫構造與析構函數來參與對象的構造與析構過程;五是讀者要懂得從兩個不同的角度,即定義類的程序員和使用類定義對象的程序員,才能更容易地理解類與對象相關的各種語法知識。
第8章 面向對象程序設計之二。重用類代碼有三種方式,分別是用類定義對象、類的組合和類的繼承。本章講解類的組合與繼承。程序員可以基于已有的零件類來定義新的整體類,這就是類的組合。程序員可以繼承已有的基類來定義新的派生類,這就是類的繼承與派生。利用派生類和基類之間的特殊關系可以進一步提高程序代碼的可重用性,這就是面向對象程序設計中的對象替換與多態技術。本章將具體講解與多態相關的運算符重載、虛函數和抽象類等概念。最后本章將簡單討論一下類的多繼承。本章要點:一是讓讀者學會使用組合和繼承的方法來定義新類,這樣可以提高類代碼的開發效率;二是讀者應理解,類在組合或繼承時可以進行二次封裝;三是從提高程序代碼重用性的角度可以更容易地理解對象多態性;四是多繼承會導致語法陷阱,新的面向對象程序設計語言(例如Java和C#)已不再支持類的多繼承,而只支持接口的多繼承,讀者只需要了解多繼承的基本原理即可。
第9章 流類庫與文件I/O。C語言通過輸入/輸出函數(例如scanf和printf)實現了數據的輸入和輸出。C 語言則是通過輸入/輸出流類為程序員提供了輸入/輸出的功能。這些輸入/輸出流類都是從類ios派生出來的,組成了一個以ios為基類的類族,這個類族被稱為C 語言的流類庫。本章將介紹流類庫中三組不同功能的輸入/輸出流類,它們分別是通用輸入/輸出流類、文件輸入/輸出流類和字符串輸入/輸出流類。本章要點:一是讀者應理解之前所用的cin、cout指令實際上分別是通用輸入/輸出流類的對象;二是通過本章學習,讀者可以從側面了解全球頂尖的C 程序員是如何來設計和編寫類的,這樣可以幫助讀者進一步深入體會前面所學習的各種面向對象程序設計知識;三是重點學習如何進行文件讀寫操作,大部分程序都需要使用文件來保存數據。
第10章 C 標準庫。C 語言全盤繼承了C語言的標準C庫,另外又增加了一些新的庫。新庫中包含一些新增的系統函數,但更多的是為面向對象程序設計方法所提供的系統類庫,這些新庫被統稱為C 標準庫。為了更好地凝練源代碼,C 語言引入了模板技術,其中包括函數模板和類模板。模板技術是一種代碼重用技術,C 標準庫在編寫時就采用了模板技術,因此標準庫能以較少的代碼量來提供很強大的功能。本章內容重點介紹模板技術、C 語言的異常處理機制以及C 標準庫所提供的數據集合存儲及處理功能。本章最后以微軟公司開發的MFC類庫為例介紹如何開發一個Windows圖形用戶界面程序。本章要點:一是讓讀者了解如何使用模板技術來提高函數和類代碼的可重用性;二是重點學習C 語言的異常處理機制;三是初步掌握如何使用C 標準庫中的向量類、列表類、集合類和映射類來存儲和處理數據集合。
學習完C 面向對象程序設計之后,程序員在拿到一個具體的程序設計任務時,首先應當考慮有哪些現成的類庫可以使用。使用現成的類庫開發程序,開發周期將大大縮短。基于已有的類庫開發程序,相當于是用別人已經做好的零件來組裝產品。程序的應用開發,通常就是用已有的程序零件來組裝自己的軟件產品。只要掌握了面向對象程序設計方法和C 語言,相信每位讀者都能夠借助各種第三方類庫,發揮出無限的開發潛能。
4. 使用建議
凡希望開設C 語言程序設計在線教育課程的教師,可將本書作為授課教材。聯系作者可免費獲得配套教學課件和視頻。參加在線課程學習的學生可將本書作為線下閱讀教材。
如將本書作為課堂教學用書,則建議講課學時和實驗學時各為32學時,合計64學時。每學時50分鐘。作者本人按如下方式安排講課學時:第1、3、4、9、10章各2學時,第2、5、6、7章各4學時,第8章6學時。
聯系作者:kandaohong@cau.edu.cn
5. 致謝
作者編寫本書的想法源于中國農業大學雨虹學網:面向主動學習的教學云平臺建設項目。在參與相關系統開發和教學實踐的過程中,作者積累了一些MOOC在線課程教學的經驗。
本書編寫過程中,得到了中國農業大學信電學院高萬林院長的熱情鼓勵和大力支持。本書部分素材來自于雨虹學網的教學實踐活動,這得益于張曉東教授、孫瑞志教授等領導的關心和指導。另外,本書在編寫過程中還得到了鄭立華、呂春利、冀榮華、劉云玲、陳瑛、周緒宏、胡慧、段晶潔、李鑫、李靜等同事和同學的熱心幫助。在此一并致以衷心的感謝!
最后,感謝家人對我的理解和支持。
作 者
2015年9月于北京
目錄
第1章 程序設計導論 1
1.1 計算機硬件結構 1
本節習題 4
1.2 計算機程序 4
本節習題 8
1.3 計算機程序開發 8
1.3.1 程序設計 8
1.3.2 程序實現 10
1.3.3 程序測試 12
1.3.4 程序發布 12
本節習題 13
1.4 信息分類與數據類型 13
1.4.1 二進制數制 13
1.4.2 數據類型 16
1.4.3 信息分類及數字化 18
本節習題 21
1.5 C 語言簡介 21
1.6 本章習題 22
第2章 數值計算 23
2.1 程序中的變量 23
2.1.1 變量的定義 24
2.1.2 變量的訪問 26
本節習題 27
2.2 程序中的常量 28
本節習題 31
2.3 算術運算 31
2.3.1 C 語言中的加減乘除 31
2.3.2 其他算術運算符 34
本節習題 35
2.4 位運算 35
本節習題 39
2.5 賦值運算 40
本節習題 42
2.6 數據的輸入與輸出 42
本節習題 45
2.7 引用與指針 45
2.7.1 引用 45
2.7.2 指針 47
本節習題 53
2.8 本章習題 54
第3章 算法與控制結構 55
3.1 算法 56
本節習題 57
3.2 布爾類型 57
3.2.1 關系運算符 58
3.2.2 邏輯運算符 59
本節習題 59
3.3 選擇語句 60
3.3.1 if-else語句 61
3.3.2 switch-case語句 65
本節習題 68
3.4 循環語句 69
3.4.1 while語句 70
3.4.2 do-while語句 71
3.4.3 for語句 72
3.4.4 break語句和continue語句 74
本節習題 77
3.5 算法設計與評價 78
3.5.1 計算復雜度 79
3.5.2 內存占用量 80
3.5.3 算法設計舉例 81
3.6 本章習題 84
第4章 數組與文字處理 86
4.1 數組 87
4.1.1 數組變量的定義與訪問 87
4.1.2 常用的數組處理算法 91
本節習題 94
4.2 指針與數組 95
4.2.1 指針運算 95
4.2.2 動態內存分配 99
4.2.3 指針數組 102
本節習題 103
4.3 字符類型 103
4.3.1 字符型常量 104
4.3.2 字符型運算 105
本節習題 106
4.4 字符數組與文字處理 106
4.4.1 字符串常量 107
4.4.2 字符數組 107
4.4.3 常用文字處理算法 109
本節習題 111
4.5 中文處理 112
4.5.1 字符編碼標準 112
4.5.2 基于ANSI編碼的中文處理程序 113
4.5.3 基于Unicode編碼的中文處理程序 115
本節習題 118
4.6 程序設計方法簡介 118
4.7 本章習題 119
第5章 結構化程序設計之一 121
5.1 結構化程序設計方法 121
5.1.1 設計舉例 121
5.1.2 于模塊的團隊分工協作開發 123
5.1.3 模塊的4大要素 125
本節習題 126
5.2 函數的定義和調用 127
5.2.1 函數的定義 127
5.2.2 函數的調用 128
5.2.3 函數應用舉例 130
5.2.4 函數的執行 132
5.2.5 函數的聲明 135
5.2.6 程序員與函數 136
本節習題 138
5.3 數據的管理策略 139
5.3.1 數據分散管理,按需傳遞 139
5.3.2 數據集中管理,全局共享 140
5.3.3 變量的作用域 142
本節習題 148
5.4 程序代碼和變量的存儲原理 148
5.4.1 程序副本與變量 149
5.4.2 動態分配的內存 153
5.4.3 函數指針 154
本節習題 156
5.5 函數間參數傳遞的三種方式 157
5.5.1 值傳遞 157
5.5.2 引用傳遞 158
5.5.3 指針傳遞 160
5.5.4 函數參數的設計 161
本節習題 165
5.6 在函數間傳遞數組 165
5.6.1 在函數間傳遞一維數組 166
5.6.2 在函數間傳遞一維數組的首地址 166
5.6.3 在函數間傳遞二維數組 168
5.7 本章習題 169
第6章 結構化程序設計之二 171
6.1 C 源程序的多文件結構 171
6.1.1 多文件結構的源代碼組織 171
6.1.2 靜態函數與靜態變量 174
6.1.3 頭文件 177
本節習題 179
6.2 編譯預處理指令 180
6.2.1 文件包含指令 180
6.2.2 宏定義指令 181
6.2.3 條件編譯指令 183
本節習題 186
6.3 幾種特殊形式的函數 187
6.3.1 帶默認形參值的函數 187
6.3.2 重載函數 189
6.3.3 內聯函數 189
6.3.4 主函數main的形參和返回值 191
6.3.5 遞歸函數 193
本節習題 198
6.4 系統函數 199
6.4.1 C語言的系統函數 199
6.4.2 命名空間 204
6.4.3 C 語言的系統函數 206
本節習題 208
6.5 自定義數據類型 208
6.5.1 類型定義typedef 209
6.5.2 枚舉類型 210
6.5.3 聯合體類型 211
6.5.4 結構體類型 213
本節習題 218
6.6 結構化程序設計的應用與回顧 219
6.6.1 開發Windows圖形用戶界面程序 220
6.6.2 結構化程序設計回顧 224
6.7 本章習題 226
第7章 面向對象程序設計之一 229
7.1 面向對象程序設計方法 229
7.1.1 結構化程序設計中的函數 229
7.1.2 結構化程序設計中的結構體類型 231
7.1.3 面向對象程序設計中的分類 233
7.1.4 面向對象程序設計中的封裝 236
本節習題 240
7.2 面向對象程序的設計過程 241
7.2.1 分析 241
7.2.2 抽象 243
7.3.3 組裝 245
本節習題 247
7.3 類與對象的語法細則 247
7.3.1 類的定義 247
7.3.2 對象的定義與訪問 250
7.3.3 對象指針 252
7.3.4 類與對象的編譯原理 253
本節習題 256
7.4 對象的構造與析構 258
7.4.1 構造函數 258
7.4.2 析構函數 262
7.4.3 拷貝構造函數中的深拷貝與淺拷貝 263
7.4.4 類與對象編程舉例 265
本節習題 269
7.5 對象的應用 271
7.5.1 對象數組 272
7.5.2 對象的動態分配 273
7.5.3 對象作為函數的形參 274
本節習題 277
7.6 類中的常成員與靜態成員 278
7.6.1 常成員 281
7.6.2 靜態成員 283
本節習題 288
7.7 類的友元 289
7.7.1 友元函數 290
7.7.2 友元類 291
本節習題 291
7.8 本章習題 293
第8章 面向對象程序設計之二 296
8.1 重用類代碼 296
8.1.1 用類定義對象 296
8.1.2 用類繼續定義新類 298
本節習題 300
8.2 類的組合 300
8.2.1 組合類的定義 301
8.2.2 組合類對象的定義與訪問 302
8.2.3 組合類對象的構造與析構 304
8.2.4 類的聚合 306
8.2.5 前向引用聲明 308
本節習題 309
8.3 類的繼承與派生 310
8.3.1 派生類的定義 311
8.3.2 派生類對象的定義與訪問 314
8.3.3 保護權限與保護繼承 316
8.3.4 派生類對象的構造與析構 319
8.3.5 繼承與組合的應用 322
本節習題 325
8.4 多態性 327
8.4.1 面向對象程序中的多態 328
8.4.2 運算符的多態與重載 328
本節習題 334
8.5 對象的替換與多態 334
8.5.1 算法代碼的可重用性 334
8.5.2 鐘表類及其處理算法 337
8.5.3 類型兼容語法規則 341
8.5.4 對象的多態性 343
8.5.5 虛函數 345
8.5.6 抽象類 349
本節習題 351
8.6 關于多繼承的討論 353
8.6.1 多個基類之間的成員重名 353
8.6.2 重復繼承 354
8.6.3 虛基類 356
本節習題 357
8.7 本章習題 357
第9章 流類庫與文件I/O 360
9.1 流類庫 360
本節習題 363
9.2 標準I/O 364
9.2.1 通用輸入流類istream及其對象cin 364
9.2.2 通用輸出流類ostream及其對象cout 369
本節習題 375
9.3 文件I/O 376
9.3.1 文件及其操作 376
9.3.2 文件輸出流類ofstream及文件輸出 379
9.3.3 文件輸入流類ifstream及文件輸入 382
9.3.4 文件輸入/輸出流類fstream 385
本節習題 389
9.4 string類及字符串I/O 389
9.4.1 字符串類string 389
9.4.2 字符串I/O 391
本節習題 392
9.5 基于Unicode編碼的流類庫 392
本節習題 394
9.6 本章習題 394
第10章 C 標準庫 395
10.1 函數模板 395
10.1.1 函數模板的定義與使用 396
10.1.2 函數模板的編譯原理 397
10.1.3 函數模板的聲明 399
本節習題 400
10.2 類模板 400
10.2.1 類模板的定義與使用 400
10.2.2 類模板的編譯原理 402
10.2.3 類模板的繼承與派生 403
本節習題 405
10.3 C 標準庫 406
本節習題 407
10.4 C 語言的異常處理機制 408
10.4.1 程序中的三類錯誤 408
10.4.2 程序異常處理機制 410
10.4.3 try-catch異常處理機制 412
10.4.4 C 標準庫中的異常類exception 418
本節習題 420
10.5 數據集合及其處理算法 421
10.5.1 數據集合的存儲和處理 421
10.5.2 C 標準庫中數據集合的存儲和處理 424
10.5.3 向量類vector 427
10.5.4 列表類list 431
10.5.5 集合類set 432
10.5.6 映射類map 433
本節習題 434
10.6 面對象程序設計總結 435
10.6.1 使用MFC類庫開發圖形用戶界面程序 435
10.6.2 結語 440
10.7 本章習題 441
附錄A Visual C 6.0集成開發環境 442
附錄B 各章本節習題參考答案 449
參考文獻 452