《大學計算機基礎教育規(guī)劃教材:C++程序設計》以c++為基礎系統(tǒng)地介紹程序語言、算法與數(shù)據(jù)結(jié)構(gòu)、高級編程技術(shù)!洞髮W計算機基礎教育規(guī)劃教材:C++程序設計》由16章組成,以程序設計語言、程序設計方法和程序設計技術(shù)三大主題組織教材,采用“數(shù)據(jù)表示”和“程序?qū)崿F(xiàn)”雙線索知識體系,優(yōu)化了程序設計知識的安排。
本書結(jié)構(gòu)清晰、語言通俗易懂,示例代碼具有專業(yè)的編程風格;內(nèi)容由淺入深、知識循序漸進,例題豐富,體現(xiàn)了程序設計和算法、數(shù)據(jù)結(jié)構(gòu)的緊密結(jié)合。本書注重典型案例的精選與提煉,高級編程技術(shù)內(nèi)容便于開展課程設計和研究型學習。
本書使用iso/iecl4882-2003c++語言標準,配套有經(jīng)過多年教學實踐的程序設計綜合訓練平臺。
本書可作為高等院校理工類專業(yè)和信息技術(shù)類培訓機構(gòu)“程序設計”、“軟件開發(fā)技術(shù)”課程的教材,也可作為計算機程序愛好者學習程序開發(fā)和編程技術(shù)的自學教材。
程序設計是大學計算機基礎教育和計算機專業(yè)基礎的核心課程,它既為其他技術(shù)課程奠定程序開發(fā)基礎,又是其他專業(yè)課程或?qū)嵺`環(huán)節(jié)的軟件工具,因此成為各類專業(yè)的必修課程。程序設計覆蓋面廣、影響大,是卓越工程師教育培養(yǎng)計劃的通識教育基礎,同時也是大學生參加課程設計、畢業(yè)設計、創(chuàng)新實驗、科技制作和學科競賽等活動的重要平臺。
C++是國內(nèi)外廣泛使用的計算機程序設計語言。其功能強大、面向?qū)ο、?shù)據(jù)表示豐富、代碼運行效率高、可移植性好,適合編寫系統(tǒng)軟件和各類應用程序。世界上大多數(shù)軟件都是由C語言和C++語言開發(fā)的,在TIOBE編程語言排行榜上,C語言、C++及其衍生發(fā)展起來的Java語言多年來始終處在前三位。學習程序設計從C++入手,對于培養(yǎng)算法設計與分析能力、抽象數(shù)據(jù)描述與表示能力以及利用計算機求解現(xiàn)實問題的計算思維能力具有其他語言無法比擬的優(yōu)點。而且在完全掌握了C語言、C++之后,再學習其他程序語言就會輕車熟路。
然而,C++的學習難度也是很大的。很多學生往往是“考完即忘”,學了后面的忘了前面的,低年級時學習的程序設計到了高年級即處于猶如從未學過的狀態(tài),更談不上利用程序設計解決實際應用問題。而且面對龐大、復雜的C++知識系統(tǒng),不少學生甚至教師在教與學的過程中始終感覺“只見樹木,不見森林”,對學過的程序思路不甚了解、數(shù)據(jù)描述不清楚、算法設計不到位,最后連最基本的語言知識也掌握不住,最基本的開發(fā)環(huán)境也不會使用。缺少以技能為目標的程序設計教材是造成這一局面的重要原因之一。
現(xiàn)有的C語言和C++程序設計類的教材多偏重語言知識,羅列語法多、千篇一律、大同小異,在如何應用程序解決實際問題方面下的工夫少;程序設計方法與語言結(jié)合少,缺少推動學生計算思維的訓練;生硬的例子與實際應用脫節(jié),缺少應用編程技術(shù)的展開。教學中盡管有諸如“案例教學”、“項目驅(qū)動”的做法,但由于缺少成熟的教學平臺和系統(tǒng)化、規(guī)范化的教學資源,難以培養(yǎng)和提高學生應用程序設計解決實際問題的技能。
需要知道,人類學自然語言時,學的不僅是聽還有說;學字時,學的不僅是讀還有寫。隨著人們向一個越來越數(shù)字化的信息世界邁進,不僅應該學會如何使用程序,還要學會如何編寫程序。當語言知識轉(zhuǎn)化為編程技能時,就沒有知識會遺忘了,應用程序設計解決實際問題的計算能力如同學習語言時的聽、說、讀、寫一般。
為此,我們在多年程序設計課程的一線教學經(jīng)驗和軟件開發(fā)科研工作基礎上,結(jié)合自主研發(fā)的程序設計綜合訓練平臺和系列教育軟件,推出以語言知識為工具、以技能培養(yǎng)為目標、以編程技術(shù)為核心的系列程序設計教材。
本教材遵循我們多年提倡的“精講多練、注重技能、開拓設計”教學理念編寫。在程序語言知識體系的選取與深度的把握上,在算法、數(shù)據(jù)結(jié)構(gòu)與程序設計的結(jié)合上精心設計,力圖適合高等院校和專業(yè)計算機培訓的教學目標與知識結(jié)構(gòu)的要求,體現(xiàn)了以下7個特色。
(1) 首創(chuàng)雙線索的程序設計知識體系。
任何一本程序設計教材必然是以程序語言為背景的,本書也不例外。然而C++具有龐大的語言知識內(nèi)容,因此以語言知識為教學線索必然是整體感凌亂。表現(xiàn)為教學學時始終處在不夠的“高壓狀態(tài)”,學生學習始終抓不住主次。
本教材的雙線索程序設計知識體系以“數(shù)據(jù)表示”和“程序?qū)崿F(xiàn)”作為教學上的兩條主線索,螺旋上升、交叉推進,如圖0.1所示。
圖0.1 雙螺旋線索C++知識體系示意
首先,教材通過簡單程序引出程序基本結(jié)構(gòu),以編程為目標給出兩條線索: 數(shù)據(jù)表示和程序?qū)崿F(xiàn)。其次,從引入簡單數(shù)據(jù)開始,逐步解決運算和程序組織,進而上升到程序模塊化的實現(xiàn)。再次,從基本類型提高到復雜數(shù)據(jù)類型,上升到數(shù)據(jù)結(jié)構(gòu)層面的數(shù)據(jù)表示,程序模塊進階到算法實現(xiàn)。最后,兩條線索交匯到高級編程技術(shù)應用專題,揭示程序設計與應用軟件開發(fā)的一般規(guī)律。
實際教學效果表明,雙線索程序語言知識體系突出了程序設計方法學,使程序語言成為服務于編程的工具而不是目標,學習者既能獲取語言知識,又能掌握編程技能。
(2) 優(yōu)化程序設計知識安排。
多數(shù)現(xiàn)有教材中的知識安排導致以技能為目標的程序設計難于實現(xiàn),出現(xiàn)教學瓶頸。表現(xiàn)在語言階段冗長,使得以函數(shù)、自定義類型等內(nèi)容為教學中心的編程階段在實際教學中接近課程末期,從而讓應用程序設計教學目標落空。
本教材在程序語言知識方面采用了“快節(jié)奏”,在程序設計方法和編程技術(shù)方面采用了“慢節(jié)奏”,解決了多年來程序設計教與學的難題和瓶頸問題!翱旃(jié)奏”體現(xiàn)為語言基礎知識學時被大幅度壓縮, 從一開始即以簡單程序框架展開程序知識,直接進入以程序模塊化為主的教與學環(huán)境。方便教師精講知識,學生早早練習進而多練,教材不在語言細節(jié)、小片段程序上反復循環(huán)!奥(jié)奏”體現(xiàn)為以(較難的)編程技術(shù)為研究專題展開(費時的)編程方法教學,方便教師組織技能訓練,學生獲取編程技巧。本教材將軟件開發(fā)中的結(jié)構(gòu)化、面向?qū)ο蟆⒔M件模型和敏捷思想融入到每個章節(jié),讓學習者接受專業(yè)化訓練。
如圖0.2所示是本教材的知識安排,與傳統(tǒng)的C++教學相比,增加了“設計階段”的教學。顯然,優(yōu)化的知識體系使教師在教學時能夠“抓大”(設計方法)“放小”(語言知識),學生學習時能夠得到最大化的“飽滿感”編程訓練。
圖0.2 優(yōu)化的C語言程序知識安排
(3) 首創(chuàng)高級編程技術(shù)教學新思想。
由于沒有更高層次的應用程序開發(fā)內(nèi)容,許多教材的實際教學效果就是教師和學生都集中在做題上面。如數(shù)學一般,將程序設計演變成“程序語言+計算方法”, C++成了數(shù)學工具。殊不知計算方法(數(shù)值計算、非數(shù)值計算)僅是程序設計方法的一種,程序方法學中還有諸如操作系統(tǒng)、人機界面、圖形圖像、多媒體、網(wǎng)絡通信、數(shù)據(jù)庫、硬件接口等技術(shù)領域,每個領域都有獨特的編程技術(shù)和精巧的解決方法。
衡量程序設計教學效果有兩個重要指標: 編程累計行數(shù)(TLOC)和單個程序行數(shù)(SLOC) 。以解題為主的編程訓練能提高TLOC,但卻止步于SLOC。即使將習題做上百題,雖然TLOC指標上去了,但SLOC卻不見長。一般地,在專業(yè)的軟件開發(fā)技術(shù)領域,SLOC小于300行時很難讓人體會到應用開發(fā)的“感覺”.
高級編程技術(shù)是本教材主要的創(chuàng)新成果之一。通過研究型專題的技術(shù)教學,拓寬了學生的知識面,使其充分認識到程序是如何解決應用問題的,有極大的興趣展開研究型學習。在這樣的教與學環(huán)境下,才能從根本上提高SLOC,提升技能訓練層次。
(4) 注重程序設計和算法、數(shù)據(jù)結(jié)構(gòu)的緊密結(jié)合。
程序設計與算法、數(shù)據(jù)結(jié)構(gòu)實際上是一個統(tǒng)一體,不應該也不可能將它們對立與分割。我國計算機基礎教育的實際情況是,不少非計算機專業(yè)在程序設計課程后不再涉及算法和數(shù)據(jù)結(jié)構(gòu)。即使是計算機專業(yè)開設有專門的算法和數(shù)據(jù)結(jié)構(gòu)課程,也是“自說自話”,并不是站在軟件系統(tǒng)開發(fā)(SSD)的角度使之有機地聯(lián)系在一起。
算法和數(shù)據(jù)結(jié)構(gòu)是程序設計的理論升華,是培養(yǎng)學生向應用程序開發(fā)轉(zhuǎn)型的主要工具。本教材給出算法和數(shù)據(jù)結(jié)構(gòu)的初步知識,克服了簡單羅列算法、數(shù)據(jù)結(jié)構(gòu)內(nèi)容和算法與程序設計脫節(jié)、數(shù)據(jù)結(jié)構(gòu)與程序數(shù)據(jù)表示脫節(jié)的問題。在講述每一種常用算法和數(shù)據(jù)結(jié)構(gòu)的基本思路與設計步驟的基礎上,落實到每一個案例求解,從案例的提出到算法設計與數(shù)據(jù)描述、從程序?qū)崿F(xiàn)到案例結(jié)果的討論與分析,環(huán)環(huán)相扣,融為一體,力求理論與實際相結(jié)合,數(shù)據(jù)描述與數(shù)據(jù)表示、算法與程序?qū)崿F(xiàn)相統(tǒng)一,切實提高對所學算法、數(shù)據(jù)結(jié)構(gòu)的理解和掌握。
(5) 注重典型案例的精選與提煉。
培養(yǎng)學生的學習興趣,激發(fā)學生的學習熱情,不是一兩句空洞說教所能奏效的,必須通過一些有價值的實際案例來引導。本教材設計了初等難度語言示范型、中等難度算法和數(shù)據(jù)結(jié)構(gòu)應用型、較高難度綜合設計型三種梯度的案例。這些案例的精選與提煉,有利于提高學生學習程序設計的興趣,有利于學生在計算機現(xiàn)實問題求解上開闊視野,使之在程序設計方法和思路的開拓與編程技巧的應用上有一個深層次的鍛煉與提高。其中難度較大的高級編程技術(shù)綜合設計案例可作為課程設計、大作業(yè)與課后專題研究選用。
算法、數(shù)據(jù)結(jié)構(gòu)與程序設計都不是一成不變的,可以實施多層次多方位的變通,變通出效果,變通長能力。本教材的部分示例給出了算法改進與程序優(yōu)化的過程,既是提高案例求解效率的過程,也是算法設計能力培養(yǎng)與提高的過程,更是優(yōu)化意識與創(chuàng)新能力增強的過程。
(6) 注重編程風格。
本書使用ISO/IEC 14882-2003 C++語言標準(簡稱C++03標準),充分體現(xiàn)了程序語言的最新進展和當前業(yè)界的最佳實踐。
書中廣泛采納各專業(yè)軟件公司編程規(guī)范的優(yōu)點,無論語法語義、書寫形式、示例代碼等,均采用專業(yè)編程風格編寫,潛移默化地引導學習者與專業(yè)化接軌。
書中所有程序均在Visual C++ 6.0和GCC 4.x (Code: : Blocks)上調(diào)試通過。同時,教材中的所有源程序與各章習題的完整代碼均可在清華大學出版社網(wǎng)站下載。
(7) 配套程序設計教學平臺、系列教育軟件和教學資源。
學習程序設計,上機實驗是重要的環(huán)節(jié)。而實驗環(huán)節(jié)重要的是什么呢?是性能優(yōu)越的計算機或者環(huán)境良好的機房嗎?答案不是。那種在實驗課上做題、講題的教學模式是很難培養(yǎng)程序設計技能的,本質(zhì)上這種模式一開始就是奔期末考試(等級考試)去的。
程序設計實驗環(huán)節(jié)最重要的是要有優(yōu)秀的教學平臺、教育軟件和完整的教學資源。以技能培養(yǎng)為目標、以編程技術(shù)為核心的教學模式不是傳統(tǒng)實驗手段自發(fā)實現(xiàn)的,而是通過高集成度的程序設計綜合訓練平臺,全程自動化輔助教學和教學管理來實現(xiàn)的。
自2001年以來,基于專業(yè)的軟件開發(fā)科研優(yōu)勢,結(jié)合一線教學和課程改革的經(jīng)驗,圍繞課堂、實驗、作業(yè)、設計、考核5個教學環(huán)節(jié),我們開發(fā)了系列教育軟件。例如,“程序設計在線評測系統(tǒng)INPOJ”采用計算機系統(tǒng)使學生通過大量習題的訓練提高解題速度(POJ訓練)以解決TLOC; “軟件設計協(xié)同開發(fā)平臺DevForge”按專業(yè)軟件開發(fā)方式引導、跟蹤、自動評閱學生課程設計程序和報告以解決SLOC; “遠程網(wǎng)絡考試系統(tǒng)inTest”實現(xiàn)技能測試和實踐考核,等等。這些教學平臺的使用,使得實驗機房變成了學生討論、思考、相互教授的研究場所,形成數(shù)字化課堂教學、網(wǎng)絡輔助教學、電子教室、智能答疑、綜合訓練等立體化教學環(huán)境,為落實教學理念和教學目標提供了先進工具。
使用本教材的高等院校和培訓機構(gòu)想要進一步了解有關程序設計綜合訓練平臺和系列教育軟件更多的信息,請與作者(jxf@nwpu.edu.cn)聯(lián)系。
由于C++兼容C語言,因此本書第1~8章主要是C語言的知識內(nèi)容,不妨稱為“C語言的”,其中帶號的章節(jié)是C++對C語言的擴展。第9~14章完全是C++的知識內(nèi)容,稱為“C++的”. C語言部分以結(jié)構(gòu)化程序設計為主要方法,C++部分將逐步上升到面向?qū)ο蟪绦蛟O計方法。之所以如此涇渭分明,是因為C語言是C++的基礎,C語言的即C++的,結(jié)構(gòu)化程序設計是面向?qū)ο蟪绦蛟O計的起步環(huán)節(jié)。
本書有兩本配套的教學參考書:
(1) 《C++程序設計實驗教程》。該書分為四部分。前兩部分詳細介紹了Visual C++和GCC開發(fā)工具的使用方法和程序調(diào)試技術(shù);第三部分是與教材知識體系相對應的實驗內(nèi)容,分為驗證型實驗和設計型實驗,主要突出綜合性實驗,并結(jié)合算法、數(shù)據(jù)結(jié)構(gòu)知識設計了一些有難度的實驗題目;第四部分是課程設計專題研究實驗內(nèi)容,其目的是使讀者能夠訓練應用程序開發(fā),獲取設計C++程序項目的初步知識和工程經(jīng)驗,掌握高級編程技術(shù)。
(2) 《C++程序設計習題與解析》。該書主要包括3個方面的內(nèi)容: 知識點與考點提煉、經(jīng)典例題解析、典型習題與解答。內(nèi)容緊扣課程教材和實驗教材,對課程的講授、學習以及考查起到積極的指導和輔助作用,其目的是使讀者加強程序語言知識的掌握。
此外,向使用本書的教師提供講課的電子演示文稿和素材,以節(jié)省教師的備課時間。向使用本書的高校和培訓機構(gòu)提供“程序設計課程教學指南”,方便組織教學、實施課程管理。
本書第1~8章和第15、16章由姜學鋒編寫,第9章和第10章由周果清、姜學鋒共同編寫,第11~14章由劉君瑞編寫,全書由姜學鋒主編并統(tǒng)稿。在書稿的編著過程中,得到了多位專家的關心和熱情支持,西北工業(yè)大學計算機學院的同事們提出了許多寶貴的意見和建議,清華大學出版社對本書的出版十分重視并做了周到的安排。在此,對所有鼓勵、支持和幫助過本書編寫工作的領導、專家、同事和廣大讀者表示真摯的謝意!
由于時間緊迫以及作者水平有限,書中難免有錯誤、疏漏之處,懇請讀者批評指正。
姜學鋒2011年7月于西北工業(yè)大學
第1章 程序設計基礎
1.1 計算機系統(tǒng)和工作原理
1.2 信息的表示與存儲
1.3 程序設計語言
1.4 程序設計概述
1.5 c++概述
習題
第2章 數(shù)據(jù)類型與表達式
2.1 數(shù)據(jù)類型
2.2 常量
2.3 變量
2.4 運算符與表達式
2.5 類型轉(zhuǎn)換
習題
第3章 程序控制結(jié)構(gòu)
3.1 語句
3.2 輸入與輸出
3.3 程序順序結(jié)構(gòu)
3.4 程序選擇結(jié)構(gòu)
3.5 程序循環(huán)結(jié)構(gòu)
習題
第4章 函數(shù)
4.1 函數(shù)定義
4.2 函數(shù)參數(shù)
4.3 函數(shù)原型與調(diào)用
4.4 內(nèi)聯(lián)函數(shù)
4.5 默認參數(shù)
4.6 函數(shù)重載
4.7 函數(shù)模板
4.8 函數(shù)調(diào)用形式
4.9 作用域和生命期
4.10 對象初始化
4.11 聲明與定義
4.12 變量修飾小結(jié)
4.13 程序組織結(jié)構(gòu)
4.14 函數(shù)應用程序舉例
習題
第5章 預處理命令
5.1 宏定義
5.2 文件包含
5.3 條件編譯
5.4 其他命令
習題
第6章 數(shù)組
6.1 一維數(shù)組的定義和引用
6.2 多維數(shù)組的定義和引用
6.3 數(shù)組與函數(shù)
6.4 字符串
6.5 c++字符串類
6.6 數(shù)組應用程序舉例
習題
第7章 指針與引用
7.1 指針與指針變量
7.2 指針的使用及運算
7.3 指針與數(shù)組
7.4 指針與字符串
7.5 指針與函數(shù)
7.6 動態(tài)內(nèi)存
7.7 帶參數(shù)的main函數(shù)
7.8 引用類型
習題
第8章 自定義數(shù)據(jù)類型
8.1 結(jié)構(gòu)體類型
8.2 結(jié)構(gòu)體對象
8.3 結(jié)構(gòu)體與數(shù)組
8.4 結(jié)構(gòu)體與指針
8.5 結(jié)構(gòu)體與函數(shù)
8.6 共用體
8.7 枚舉類型
8.8 位域
8.9 用戶自定義類型
8.10 鏈表
習題
第9章 類與對象
9.1 類的定義和聲明
9.2 對象的定義和使用
9.3 構(gòu)造函數(shù)和析構(gòu)函數(shù)
9.4 對象數(shù)組
9.5 對象指針
9.6 類作用域與對象生命期
9.7 const限定
9.8 靜態(tài)成員
9.9 友元
9.10 類模板
9.11 數(shù)據(jù)封裝和信息隱蔽
習題
第10章 繼承與派生
10.1 類的繼承與派生
10.2 派生類成員的訪問
10.3 賦值兼容規(guī)則
10.4 派生類的構(gòu)造和析構(gòu)函數(shù)
10.5 多重繼承
10.6 多態(tài)性與虛函數(shù)
10.7 命名的強制類型轉(zhuǎn)換
習題
第11章 運算符重載
11.1 運算符重載的概念
11.2 運算符重載的方法
11.3 典型運算符的重載
習題
第12章 異常處理
12.1 基本概念
12.2 異常處理的實現(xiàn)
習題
第13章 命名空間
13.1 命名空間的概念
13.2 命名空間的定義
13.3 命名空間的使用
習題
第14章 標準庫
14.1 c++標準庫
14.2 標準輸入輸出
14.3 標準模板庫
習題
第15章 算法
15.1 算法基本概念
15.2 算法分析
15.3 常用算法
習題
第16章 高級編程技術(shù)
16.1 配置開發(fā)環(huán)境
16.2 界面編程
16.3 圖形編程
16.4 多媒體編程
16.5 網(wǎng)絡編程
16.6 數(shù)據(jù)庫編程
習題
附錄a ascii碼對照表
附錄b c++關鍵字
附錄c c++運算符及其優(yōu)先級、結(jié)合性
參考文獻