《C++程序設計》(第二版)教學指導書第二版_第1頁
《C++程序設計》(第二版)教學指導書第二版_第2頁
《C++程序設計》(第二版)教學指導書第二版_第3頁
《C++程序設計》(第二版)教學指導書第二版_第4頁
已閱讀5頁,還剩151頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

《C++程序設計》(第二版)教學指導書

——供任課教師使用通常認為C++是ー個非純粹的面向?qū)ο蟮某绦蛟O計語言,因為它是從面向過程的C發(fā)展而來的,對它有種種詬病。然而編者認為符合ISO14882標準的C++語言是ー種先進的面向?qū)ο笈c參數(shù)化程序設計語言。因而本教材從面向?qū)ο蠛蛥?shù)化程序設計兩個方面來展開C++程序設計的教學,這在編者所見過的教材中是僅見的(其他的教材是從面向過程和面向?qū)ο髢蓚€方面來展開教學),這也是本教材的教學體系先進所在。本教材的出發(fā)點是:與時俱進和實事求是。與時俱進是指教學內(nèi)容要跟上計算機技術的最新發(fā)展;實事求是是指教學要切合當今大學生的實際情況,切合本課程在大一同時開設的課程中的地位?,F(xiàn)有的C++的教材的教學體系大致可分兩類:第一類是經(jīng)典的,按語法順序講授基本知識、面向過程的程序設計、基于對象的程序設計和面向?qū)ο蟮某绦蛟O計。第二類是盡早進入面向?qū)ο蟮某绦蛟O計的講授。側重于面向?qū)ο蟆1窘滩目蓪儆诘诙?但對教學體系做了全面的改革,力求建立全新的面向?qū)ο笈c參數(shù)化程序設計的C++教學體系。將最新發(fā)展的知識傳授給學生,教學內(nèi)容的選定以ISO14882C++語言標準為基礎。拋棄傳統(tǒng)的C++教學面向?qū)ο髢?nèi)容以語法為主的教學模式,突出面向?qū)ο蠛蛥?shù)化程序設計關鍵技術的教學,讓學生獲得面向?qū)ο驝++程序設計的真實本領。這ー全新的教學體系經(jīng)過4年大范圍的教學實踐已經(jīng)成熟。本教材是通用教材,可以用于對計算機知識要求相當深入的專業(yè),包括電類、機電一體化、計算機專業(yè)等等。盡管隨后續(xù)課程組織不同,教學側重有些不同,但本教材均可適用。課程特色第一,突出面向?qū)ο笈c參數(shù)化程序設計關鍵技術的教學:強調(diào)類對象個性實現(xiàn)的關鍵技術——多態(tài),包括重載(編譯時的多態(tài),包括函數(shù)與運算符重載)、層次結構中的同名覆蓋與超載(運行時的多態(tài))。在介紹函數(shù)時就引入函數(shù)重載,在教學剛涉及類對象時就引入運算符的重載。引入的越早應用的機會越多。普遍使用這些技術是面向?qū)ο蟮腃++的標/tls〇強調(diào)參數(shù)化程序設計,突出模板相關內(nèi)容的教學。不是將模板作為一種語法現(xiàn)象,而是作為ー個有力的工具用于本教材所涉及的全部數(shù)據(jù)結構基本知識,包括順序表、鏈表、棧、隊、ニ叉樹(可選)以及查找排序算法。同時介紹標準模板庫的簡單使用方法。提倡完善的類對象封裝,不僅封裝數(shù)據(jù)和對數(shù)據(jù)的操作,而且封裝資源(尤其是內(nèi)存)的動態(tài)分配與釋放,形成一個完備的子系統(tǒng)。在ー個有層次結構的類體系中內(nèi)存的動態(tài)分配與釋放最好封裝在成員對象(聚合)中,如同使用標準的string字符串類那樣。介紹怎樣在面向?qū)ο蟮某绦蛟O計中使用異常處理技術來處理一些很難查找甚至是無法避免的運行時錯誤和異常。總之,不是泛泛介紹面向?qū)ο蟮腃++的語法和框架,而是突出實用技術,包括完善的封裝、派生、多態(tài)和模板,在構造函數(shù)中動態(tài)分配資源、在析構函數(shù)中釋放資源和異常處理,這是面向?qū)ο蟮腃++程序設計的精髓。本教材要求學生能熟練應用多態(tài)(重載和超載),熟練應用模板,熟練應用派生。習慣在構造函數(shù)中動態(tài)分配資源、在析構函數(shù)中釋放資源和異常處理的方式。第二,強調(diào)算法,注意介紹有關獨立于任何特定編程語言的算法概念和結構,即突出程序設計而不是語法。強調(diào)算法,不是忽視語法,而是不要繁瑣的鉆牛角尖的語法,我們要的是基本的常用的語法,但更多的是模仿。不是知道的語法越多,程序編得越好,而是自己動手編程越多,程序編得越好。第三,培養(yǎng)面向?qū)ο蟪绦蛟O計能力。掌握怎樣從客觀事物中抽象出類來的方法。基礎教學與實踐教學相結合。在基礎教學中采用Windows平臺下的控制臺方式(命令行方式)以突出編程能力的培養(yǎng)。在實踐部分比較全面地學習標準的Windows圖形界面編程。采用研究型學習進行課程設計。本教材第二版做了大幅改動。首先例題和習題解答主體按三個熟練應用和一個習慣的要求,進行改編與重組,更加突出了面向?qū)ο驝++程序設計的實用技術;采用統(tǒng)ー的規(guī)范的編程模式,不再體現(xiàn)編程的多樣性,降低了學習難度。其次是調(diào)整章節(jié)安排與精簡教學內(nèi)容。第三,為了更好地配合精講多練,安排了二十九個(其中兩個選做)與教學內(nèi)容緊密相關的同步實驗。第四,更新部分不完全符合ISO14882C++語言標準的內(nèi)容。性質(zhì)與任務程序設計課程與數(shù)學、物理、外語等ー樣,是大學生的通識教育課程,也是從技術角度學習計算機的主要基礎課,包括面向?qū)ο蟪绦蛟O計及最基本的數(shù)據(jù)結構和軟件工程的知識。其任務是培養(yǎng)學生的面向?qū)ο蟮木幊棠芰?也鍛煉大學生的邏輯思維能力(計算機思維方式)。學時安排本教程建議授課時數(shù)48學時,習題課8學時,上機實驗56學時(含課外上機)。另有課程設計(小型軟件設計的實踐環(huán)節(jié)),16學時加上機實驗32學時(含課外上機)。課堂教學內(nèi)容分四部分,共十二章。第一部分,包括第一到第三章,是基礎部分。介紹C++程序的基本組成和編寫方法,函數(shù)的遞歸以及最簡單的常用算法。這ー階段代碼的編寫方法,應該是課堂教學的重點。第二部分,包括第四到第五章,是面向?qū)ο蟮娜腴T部分。介紹類對象的組成,構造函數(shù)和析構函數(shù)的編寫,運算符的重載,還有數(shù)組與指針的概念和兩者之間的對應關系。本階段逐步過渡到以算法為重點,逐漸淡化代碼的編寫細節(jié)。第三部分,包括第六到第八章,是核心部分。介紹通用算法的編寫方法,特別是數(shù)據(jù)結構的基本算法,和軟件的再利用。第六第七兩章采用模板技術,第八章采用繼承與派生。一般來講,本階段以算法為重點,不再細講代碼的編寫。第四部分,包括第九到第十一章(標準模板庫選讀),是擴展部分。包括:輸入輸出重載、在構造函數(shù)中動態(tài)分配資源、在析構函數(shù)中釋放資源和異常處理、以及標準模板庫。本階段主要學習面向?qū)ο蟮腃++程序框架構造知識。考慮到各專業(yè)相關課程配置不同,生源不同,授課內(nèi)容可有篩選。選讀內(nèi)容,可以作為學有余力的同學的自學內(nèi)容,做到因材施教。其實講哪些內(nèi)容,不講哪些內(nèi)容,教師完全可以自主掌握,關鍵是要學生掌握課程特色中所言的三個熟練應用和一個習慣。。教學方法現(xiàn)實情況是:第一,在大一的基礎課程中,大學生將程序設計排在數(shù)學、外語和物理之后,不可能投入過多的精力,大學生如果要放棄某門課以保證集中精力通過其他課時,最不熟悉的本課程列在首位;第二,大學生對這門課學習的期望值很高,但對學習時可能遇到的困難估計不足;第三,本科生總學時數(shù)下降,盡管計算機課程重要性上升,但總學時不可能增加;第四,大學生上機實踐的條件大大改善,特別有利于貫徹先進的精講多練的教學思想。所以在學時有限和學生所投精力有限的條件下,圍繞課程特色中提到的面向?qū)ο箨P鍵技術進行精講多練是第一條。為此安排了29個同步實驗。一年級大學生認為應試教育天經(jīng)地義,大學應延續(xù)中學的應試教育,不懂得主動學習〇要培養(yǎng)大學生的自學能力。預習是本課程對學生的基本要求。整個教學強調(diào)過程,知識積累的過程,能力培養(yǎng)的過程,使學生能快樂地學習。(但絕不是自學,實踐經(jīng)驗指出,自學出來的學生實際應用時編出

來的程序往往效率低,錯誤百出,而且別人看不懂,無法交流,原因就在不會規(guī)范化地編程。)一定要避免應試教育。教學要求高于考試要求,必須給學生真本事??荚嚳梢远鄻踊?,面要廣,難度要適中。切忌題目過偏過難,切忌出彎彎繞的語法題,要考學生編程的實際能力,這是大學的第一門計算機課,不要把多數(shù)學生的自信心毀了。授課時要采用案例教學法,從實例引出語法,盡管書中多數(shù)地方為了閱讀方便是將語法條文單列,甚至放在前面,但上課時不要順序往下講。現(xiàn)在提供的電子教案只是參考,修改和重編的過程也是熟悉教學內(nèi)容和發(fā)現(xiàn)問題的過程。要求每位老師自己做有自己個性的教案。面向?qū)ο蟪绦蛟O計的原代碼通常比較龐大,原因是數(shù)據(jù)與數(shù)據(jù)的操作封裝在ー起,原則上包含的操作要全面,正是眾多的成員函數(shù)使學生認為自己面對的是ー個龐然大物,嚇也嚇蒙了。教師應該指出成員函數(shù)是ー個個獨立的操作,每ー個成員函數(shù)都是簡單的??梢越o學生講講庖丁解牛的故事,要求學生做到目無全牛,也就是面向?qū)ο蟮某绦蛞粋€ー個函數(shù)來編。習題與實驗都是學生的實踐機會,具體指導和講評是必要的。特別是在學生尚未入門時具體指導尤其重要,最好是在實驗室里配大屏幕顯示,學生與教師演示同步操作,或用同步操作的教學軟件。如無此條件,至少教師在第二章和第三章課堂教學時多做控制臺應用程序設計全過程演示。在輔導實驗時只可能解決少數(shù)學生的少數(shù)問題,提倡上機時學生互相討論互相幫助。做習題,也提倡較難的題可以同學之間先討論再獨立完成。也可以把部分習題的參考答案先發(fā)給學生作為參考,畢竟我們要求規(guī)范化編程,主要是靈活應用通用算法,不是創(chuàng)造別人看不懂的算法,初級階段主要是模仿,見多識

廣后就能編出好的程序。講評是在學生做完習題和實驗之后,針對學生實際發(fā)生的最常見的錯誤進行的,也可以介紹ー些同學的好作業(yè),這是一個總結提高的過程。面向?qū)ο驝++程序設計的習題基本是在一個C++的類或類模板定義中添加一些成員函數(shù)。建議可以給學生提供完整的類定義和需添加的成員函數(shù)的聲明,以及檢測其功能的主函數(shù)代碼,同時給出需添加的成員函數(shù)的思路或提示,僅讓學生編寫需添加的成員函數(shù),可能效果會更好。建議將給教師使用的習題參考答案,刪去要求編寫的函數(shù),添加所需的說明,再發(fā)給同學去做習題,這樣即降低了難度也突出了重點,便于學生調(diào)通程序,同時提高了學生的信心和學習的效率。實驗也可做類似的考慮。該教學體系培養(yǎng)的學生所編的程序給人的第一影響應該是:這是規(guī)范的面向?qū)ο蟮某绦颉τ谛枰嬎銠C知識較多的專業(yè),程序設計課程應考慮后續(xù)課程的需要。尤其是電氣電子信息類專業(yè)的學生的后續(xù)課程中需要大量的面向過程的程序設計的基礎知識,包括匯編語言的編程,單片機、嵌入式系統(tǒng)和DSP的C語言編程。面向?qū)ο蟮某绦蛟O計其實與面向過程的程序設計是密不可分的。在本課程中,算法的描述實際上是面向過程的,而面向?qū)ο笫签`種包裝,它使程序的整體組織更合理,使用起來更方便。教學中應該合理地將兩個方面有機地結合起來,即細節(jié)上算法的編程和程序總體上的把握并重。在前三章的教學中對算法的描述,必須側重于采用C++語言編程的細節(jié)的講解,即培養(yǎng)學生對算法的編程能力。要求學生學會先分析算法,再畫UML的活動圖或普通的流程圖,最后進行編程。特別是在“基本控制結構程序設計”和“函數(shù)”這兩章的教學中要嚴格貫徹這ー要求?!邦惻c對象”和“數(shù)組與指針”兩章是過渡階段,對編程的細節(jié)的講授隨教學推進而逐漸淡化,對程序的整體掌握的要求逐漸加強,使學生的編程能力上一個臺階。從第六章起,算法表述的細節(jié)基本留給學生自己看,教師重點講解脫離具體C++語言的算法本身的描述和程序整體的構造。一方面提高學生的自學能力,另一方面引導學生的編程的大局觀。要引導學生,不要做學生的尾巴,片面地降低要求。目錄第一章C++基礎知識第二章基本捽制結構程序設計第一章函數(shù)第四章類與對象第五章數(shù)組與指針第六章模板與數(shù)據(jù)結構第七章動態(tài)內(nèi)存分配與數(shù)據(jù)結構第八章類的繼承與派生第九章輸入/輸出流類庫第十章異常處理第十一章標準模板庫(選讀)同步實驗部分課程設計部分UML活動圖UML類圖疑難問題解答索引C++類的構造函數(shù)的作用的討論const弓|用forward與向后移動if語句和switch語句的對應關系Node類和List類的復制構造函數(shù)討論this指針的應用try塊應用VC++6.〇與標準模板類庫VC++的隨機數(shù)VC++與標準名字空間編程中附加條件的安排標準流文件結束符的使用重載提取和插入運算符初學編程常見錯誤傳統(tǒng)運行庫和新的標準庫中的輸入輸出流的差異遞歸算法的討論調(diào)用樹的使用動態(tài)分配的討論多維數(shù)組與多級指針構造函數(shù)與虛函數(shù)關鍵字索引函數(shù)返冋值與返冋引用基類中protected成員的使用靜態(tài)變量聚合的復制構造函數(shù)矩形類討論類模板的插入和提取運算符的重載類模板的派生的討論流類庫屮的捽制枚舉常量的定義模板編譯模式模板與派生在實現(xiàn)通用性上的對比默認參數(shù)函數(shù)默認的構造函數(shù)內(nèi)存分配圖派生常見錯誤派生類的插入和提取運算符的重載使用多態(tài)完成定積分的通用性矢量類的邊界輸出運算符(插入運算符〈〈)的討論數(shù)字與數(shù)字串順序隊列轉(zhuǎn)化為循環(huán)隊列的笄法討論圖解法閱讀程序圖解法分析克法 Fibonacci級數(shù)文件中的數(shù)據(jù)格式下標運算符重載前向引用聲明循環(huán)控制變量使用要點異常處理匹配原則?個流文件?次只能與?個磁盤文件建立聯(lián)系引用的討論狀態(tài)字state及其使用技巧指向類成員的指針指針與數(shù)組的差異第一章C++基礎知識教學目的使大學生了解C++數(shù)據(jù)和運算的表述方法,簡單的輸入輸出流類,引入廣義的數(shù)據(jù)類型的概念。建議學時安排授課5學時初識C++程序,關鍵字與標識符,數(shù)據(jù)類型,變量與常量。2學時。運算符、表達式和語句,數(shù)組。2學時。簡單的C++輸入輸出。1學時。教學方法提示從形式上看本章與面向過程的教材差異不大,但教學上要從面向?qū)ο蟮乃季S方式出發(fā):數(shù)據(jù)類型總是與相關的算法封裝在ー起。不要說成算法是獨立的。某種算法可以用于那些數(shù)據(jù),這是面向過程的說法,并不切合實際。實際上不同數(shù)據(jù)類型是重載了運算符。例如加法,對于整型數(shù),執(zhí)行的是定點運算;而浮點數(shù),首先要對階。再如除法,對于整型數(shù),執(zhí)行的是整除,商為整數(shù),另有求余數(shù)的運算;而浮點數(shù),商為浮點數(shù),沒有求余數(shù)的運算。從不同數(shù)據(jù)有不同算法出發(fā),很容易理解為什么要將函數(shù)附屬于數(shù)據(jù)類型。這樣考慮問題,學生易于接受面向?qū)ο蟮乃枷?。在本章?存儲方式的概念要建立起來,每ー個變量總是在內(nèi)存中分配有一塊內(nèi)存單元,不僅本章中的左值、表達式、字面常量和sizeof()與之有關,后面的算法的分析、函數(shù)的傳值等等全與之有關。介紹數(shù)據(jù)的存儲方式,并在教學的過程中經(jīng)常利用它們,也是本書的教學特點之一。基本數(shù)據(jù)類型,相關的算術、關系和邏輯運算,是本章最基本的知識點。有關運算符的結合性是決定同一優(yōu)先級的運算符組合在ー起時的運算次序,同一優(yōu)先級的運算符有相同的結合性。如+、-的結合性是從左到右(左結合),則a+b+c-d的運算次序為:((a+b)+c)-d〃先算a+b,再加c,最后減d賦值號=的結合性是從右到左(右結合),則24ス+イ的運算次序為:a=(b=(c+d))〃算出c+d的和,賦給b,再將b賦給a又如前++和單目負ー的結合性是從右到左(右結合),則ー++a的運算次序為:-(++a) 〃先做++a,再取相反數(shù)(加負號)這對算法描述是必須的,每ー步做什么必須確定。運算符++,學生往往沒有真正理解,普通+的結果放在暫存器(累加器)中,而++的值要返回給變量,變量的值變了。畫一個演示圖應該好一些。要講清楚a++與a+1的不同。在第五章的運算符重載教學中,++無返回值,+=有返回值,前者友元方式時參數(shù)要使用引用,學生不理解,說看不懂,細問發(fā)現(xiàn)不懂在++的運算過程。簡單的數(shù)組概念的建立對算法的描述是很重要的,所以提前在這里引入。強調(diào)3點:第一,數(shù)組下標從。開始,這與簡化大量的算法有關,不從〇開始,相關的典型算法往往是錯的;第二,數(shù)組不能作為整體處理,只能按元素處理;第三,數(shù)組的初始化方法。字符數(shù)組與字符串現(xiàn)在是要求能用,因為它的應用實在太廣了。本章中只能講清組織方式。特別是串結束符,有了它,串的處理方式與數(shù)組大為不同。教師必須在這里給學生點明,輸出串是輸出串內(nèi)容,輸出數(shù)組是輸出數(shù)組首地址。輸入輸出方式簡介,強調(diào)會用。輸入方面:第一,提醒學生字符輸入容易出錯,特別是數(shù)字與字符混合輸入時,回車符的吸收問題要交待清楚。第二要講清cin和cin.get()的差異,cin會自動跳過所有空白符(包括空格、制表、回車等等與格式有關的符號),cin.get()不會。第三,輸入一系列數(shù)字時,用空格或回車分隔,不可以用逗號分隔。第四,輸入字符串使用cin.getline。的方法,提醒同學:它提取回車符但不保存回車符,而是加一個串結束符。其他錯誤解答請參考本指導書第9章。輸出方面:格式控制演示交代清楚,學生就會理解。字符輸出要提醒同學,左值輸出的才是字符,表達式輸出的是ASCII碼值,因為在表達式中已轉(zhuǎn)為整數(shù)。第二版中,C++程序改用標準庫頭文件,無后綴.h,并加usingnamespacestdo教師應作簡單說明。注意新標準要求main。函數(shù)必須返回int型,〇為正常,否則返冋其他整數(shù)。這樣可以取代exit()等函數(shù)(exit()庫函數(shù)通常在程序出錯時用來退回到操作系統(tǒng),詳細見教材4.3.2節(jié))。一般函數(shù)返冋為int的也不可省略,否則編譯器發(fā)出警告。疑難解答VC++的隨機數(shù)VC++輸出的隨機數(shù),并非隨機數(shù),而是特定值,如整型數(shù),為Oxcccccccc(-858993460),float型為ー1.07374e+008,duoble型為ー9.25596e+061。關鍵字索引

and運算符代替&&;and_eq運算符代替&=;asm運算符用于標識混編的C++源程序中的匯編語言代碼;auto說明符說明變量為自動變量,見主教材(下同)P.84;bitand運算符代替&:bitor運算符代替!;bool說明符用于說明布爾型變量,見P.7:break語句結束循環(huán)語句或開關語句的執(zhí)行,見P.40和P.50:case標號用于開關語句,見P.40;catch語句用于異常處理中捕獲異常子句,見P.343;char說明符用于說明字符型變量,見P.6;class說明符用于說明類類型,見P.106;compl運算符代替ー:const說明符用于說明常量類型,見P.11、136、165、193和200;const_cast運算符常量強制類型轉(zhuǎn)換運算符,詳見后文;continue語句用于循環(huán)語句,結束本次循環(huán),見P.52;default標號用于開關語句,表示其他情況,見P.40;delete運算符用于回收動態(tài)存儲空間,見P.220;do語句用于循環(huán)語句,實現(xiàn)直到型循環(huán),見P.44;double說明符用于說明雙精度實型變量,見P.7dynamic_cast運算符動態(tài)強制類型轉(zhuǎn)換運算符,詳見后文;;else語句用于組成雙分支結構條件語句,見P.34;

enum說明符用于說明枚舉類型,見P.59:explicit說明符取消構造函數(shù)隱式數(shù)據(jù)類型轉(zhuǎn)換的功能,見P.357:export說明符用于模板分離編譯模式,見本指導書第六章模板:extern說明符說明變量為外部變量,見P.84:false邏輯值對應0,表示邏輯假,見P.7;float說明符用于說明單精度實型變量,見P.7for語句用于ー種當型循環(huán)語句,見P.46;friend說明符用于說明友元函數(shù)和友元類,見P.135和139:goto語句用于無條件轉(zhuǎn)移程序執(zhí)行次序,見P.52:if語句用于組成雙分支結構條件語句,見P.34;inline說明符用于說明內(nèi)聯(lián)函數(shù),見P.96和110:int說明符用于說明整型變量,見P.6:long說明符用于說明長整型變量,見P.7;mutable說明符使const對象和成員函數(shù)的數(shù)據(jù)成員可修改,見后文:namespace說明符用于說明名字空間域,見P.148:new運算符用于分配動態(tài)存儲空間,見P.220;not運算符代替!;not_eq運算符代替!=:operator說明符用于定義運算符重載函數(shù)的函數(shù)名,見P.130:or運算符代替II:or_eq運算符代替1=;private說明符訪問限定或派生方式為私有的,見P.107和267;

protected說明符訪問限定或派生方式為保護的,見P.107和267:public說明符訪問限定或派生方式為公有的,見P.107和267:register說明符說明變量為寄存器變量,見P.84:reinterpret_cast運算符重解釋強制類型轉(zhuǎn)換運算符,詳見后文;return語句作為函數(shù)返回語句,見P.2和69:sizeof運算符計算類型或變量占用內(nèi)存的字節(jié)數(shù),見P.19:short說明符用于說明短整型變量,見P.7:signed說明符用于說明有符號整型變量,見P.7:static說明符說明靜態(tài)變量或類的靜態(tài)成員,見P.84和139:static_cast運算符靜態(tài)強制類型轉(zhuǎn)換運算符,詳見后文:struct說明符用于說明結構類型,見P.142:switch語句用于組成多分支結構開關語句,見P.40:template說明符用于參數(shù)化程序設計的模板構成,見P.186:this說明符指向具體類對象本身的指針,見P.166:throw說明符用于異常處理中拋出異常,見P.342:true邏輯值對應1或非〇,表示邏輯真,見P.7:try語句用于異常處理測試程序塊,見P.342:typedef說明符用于類型定義,見P.173:typeid運算符運行時類型信息運算符,詳見后文:typename說明符用于模板定義時類型參數(shù)的說明,見P.186:union說明符用于說明聯(lián)合類型,見P.144;unsigned說明符用于說明無符號整型變量,見P.7:using說明符用于using聲明或using指示符,見P.145:virtual說明符用于說明虛基類或虛函數(shù),見P.278或289;void說明符用于說明無值類型,見P.7:volatile說明符修飾函數(shù),表示表示該函數(shù)不做編譯優(yōu)化,見P.356:wchar_t說明符寬字符類型,見P.6:while語句用于循環(huán)語句,見P.43和44;xor運算符代替へxor_eq運算符代替A=:強制類型轉(zhuǎn)換及其他運算符說明如下:static_cast 靜態(tài)強制數(shù)據(jù)類型轉(zhuǎn)換。格式如下:doublea;intk;k=static_cast<int>(a);〃將雙精度型的a的值轉(zhuǎn)換為整型賦給k特別注意a本身的類型不變,仍是雙精度,所有轉(zhuǎn)換都是數(shù)值而非變量的轉(zhuǎn)換。允許在兩種類型之間進行標準轉(zhuǎn)換(如void?轉(zhuǎn)換為char*,int轉(zhuǎn)換為float等等),包括允許基類指針到派生類指針的向下類型轉(zhuǎn)換。但不能在const類型和非const類型轉(zhuǎn)換之間轉(zhuǎn)換,不能在非公有派生的基類和派生類的指針(引用)間轉(zhuǎn)換,不能轉(zhuǎn)換為無相應構造函數(shù)或轉(zhuǎn)換運算符的類型。constcast專用于轉(zhuǎn)換const或volatile類型。格式如下:constcastchar*string_copy(char*);constchar*p_str;char*pc=string_copy(const_cast<char>(p_str))〃取消p_str的const屬性注意:const_cast不能用于強制轉(zhuǎn)換常變量的常量性。mutable在const對象和成員函數(shù)中,用mutable修飾的數(shù)據(jù)成員也可以被修改。使用格式如下:classstudent{intid;mutablestringname;〃使name可以被修改public:voidsetname(stringName)const{name=Name;};〃合法1;intmain(){conststudentstu1;)reinterpret_castC++利用重解釋轉(zhuǎn)換進行非標準轉(zhuǎn)換(void?轉(zhuǎn)換為int?、int*轉(zhuǎn)換為char?等等)。重解釋轉(zhuǎn)換不可用于標準轉(zhuǎn)換,如duoble到int的轉(zhuǎn)換。該轉(zhuǎn)換可能導致嚴重的運行時錯誤。dynamic.cast 動態(tài)強制類型轉(zhuǎn)換運算符用于運行時多態(tài),也就是說用于派生體系,而且基類至少包含一個虛函數(shù)。它可以沿繼承樹向上(向基類)或向下(向派生類)進行類型轉(zhuǎn)換,改變指針(引用)的類型。使用時包含vtypeinfo〉。classbase{protected:intb;base(intx=0){b=x;}virtualvoidvertFunc(){}voidshow。{coutvv"基類:b=u?b?endl;})classderv:publicbase{intd;public:derv(intx=0,inty=0):base(x){d=y;}voidshow(){coutvv”派生類:d=H?d?endl;})intmain(){base*pb;derv*pd=newderv(23,29);pb=dynamic_cast<base*>(pd);pb->show();〃輸出基類:b=23轉(zhuǎn)換遵從賦值兼容規(guī)則pb=newderv(31,37);pd=dynamic_cast<derv*>(pb);pd->show();return。;〃輸出派生類:b=31,d=37)它可以將指向某派生類對象的基類指針轉(zhuǎn)換為該派生類指針,如類型有誤,返回NULL,可進而判斷對象屬于哪ー種派生類。在VC++中需要使用運行時類型識別(RTTI)必須選擇Projectlsetting項,單擊標簽C/C++?在Category列表框中選擇C++Language,選中“EnableRun-TimeTypeInformation”,單擊OK。typeid 作為運行時類型信息運算符可獲得未知對象類型的信息。這些信息放在typejnfo類中(其確切定義與編譯器有關):classtype_info{type_info(consttype_info&);〃不再有默認構造函數(shù)type_info&operator=(consttype_info&);public:virtual-type_info();type_info&operator==(consttype_info&)const;type_info&operator!=(consttype_info&)const;constchar*name()consl;〃返|口|lype_info對象所表示類型的名字)用戶不能在自己的程序中定義type_info對象。在程序中創(chuàng)建type_info對象的唯一途徑是使用typeid運算符。如:employee*pe=newmanager;cout?typeid(*pe).name()?endl;//$flij出manager使用時包含vtypeinfo〉。選中"EnableRun?TimeTypeInformation”。第二章基本控制結構程序設計教學目的使大學生掌握基本控制結構程序設計的C++語言實現(xiàn)和常用算法(遞推、迭代、窮舉、篩選等)。建議學時安排授課6學時,習題課2學時分支結構程序設計:if語句,條件運算符"?:",switch語句。2學時。循環(huán)結構程序設計:while語句,do...while語句,for語句,循環(huán)的嵌套;轉(zhuǎn)向語句。2學時。常用算法應用實例。枚舉類型定義,輸入輸出文件簡介。2學時。教學方法提示本章是用C++語言來描述程序的3種基本結構和介紹常用算法,這是學生編程的入門,也是重點。必須給學生指明,算法就是對數(shù)據(jù)的操作方法,讓學生始終處于面向?qū)ο蟪绦蛟O計的氛圍中。在本章教學中要求學生養(yǎng)成先分析算法,再畫流程圖或UML的活動圖,最后進行編程的良好習慣。在本章和下一章的教學中要嚴格貫徹這ー要求?,F(xiàn)在不嚴格要求,形成隨意直接編程的壞習慣,要改也難了。不要指望在本章中讓學生入門,他們還是在門口徘徊,要有幾個反復。到第4章學完,站得高了,回過頭來看,才能比較深刻地理解,オ會初步入門。千萬不要在這里堆砌過多的學時,學生總會說不懂,要跟他說大膽的往前走。實際上后面的教學內(nèi)容不斷反復使用3種基本結構,在這個過程中學生會逐步熟練起來的。教師在第二章和第三章課堂教學時應多做控制臺應用程序設計全過程演示。學生調(diào)試程序的能力主要在這時培養(yǎng),不僅是C++,而且以后“微機系統(tǒng)”等后續(xù)課程用Debug調(diào)試各種程序(匯編,C51,DSP的C語言編程)的基本功都是在這里打下的。輔導上機,主要指導學生怎樣跟蹤程序的運行,怎樣設置被監(jiān)視的變量,怎樣設置斷點,怎樣單步運行,怎樣使用Debug工具。授之以魚,不如授之以漁。幫同學調(diào)通一個程序,不如教會同學怎樣去調(diào)程序。講解3種基本結構時不要按書上的順序ー個ー個地講,建議把相關的語句對比起來講解。比如3種循環(huán)語句對比起來講,效率和效果都要好得多。這樣學時是綽綽有余。而有關switch語句的兩個例子宜先講簡單的例2.10,后講不加break的例2.9〇注意不要按C語言的習慣,在for語句括號表達式中定義控制變量。教師首先不要那樣做。理由在下一章介紹。本章的例題非常多,并不是要題題全講,那樣學時是不夠的,能講70%就很多了。編書的出發(fā)點是多給學生一些各種編程類型的樣板。學習編程與算法有些象外語,模仿是重要的第一步。有同學特別希望有編程題的標準答案,這是錯誤的,標準答案是不存在的。但有一個規(guī)范化編程樣板,對初學者卻是非常重要的。大學生往往忽視了這一點,教師應該時時提醒。比如實驗四中的約瑟夫算法,由于學生不愿模仿,把數(shù)組〇號元素放棄,從1號開始,結果書上提供的算法就全錯了,陷入死循環(huán)。學生不善于模仿,不要去批評他,碰了釘子,學生オ有更深的印象。例題源程序有主教材例題和同步實驗范例兩類,課堂教學完全可以任意選擇。非精講的程序要求學生一定要自己讀懂,見多識廣,水平才能提高;正如外語只摳精講部分,不看泛讀,考試能對付,水平肯定高不了。本教材強調(diào)算法,不是忽視語法,而是不要繁瑣的轉(zhuǎn)牛角尖的語法,不要讓這種語法把學生的時間占光了,我們要的是基本的常用的語法,更多的是要模仿。不是知道的語法越多,程序編得越好,而是自己動手編程越多,程序編得越好。從本章起,開始有大量的實驗,一定要抓緊。為了突出算法,本書主要采用命令行程序設計,教師在本章和下一章課堂教學時應多做控制臺應用程序設計全過程演示,否則學生做實驗時會卡在工程文件的建立上,而且錯誤是五花八門不勝枚舉,使學生信心大減輸入輸出文件簡介,放在這兒是ー個創(chuàng)新。就是讓學生先用起來,知道文件可以保存數(shù)據(jù),并依樣使用文件。文件輸入輸出用兩個例子分別對同一個文件進行寫入和讀取,讓同學切實體會到程序退出后信息確實沒有丟失。注意:教師認為文件引入很自然,但學生還沒這個概念,認為屏顯示與文件保存沒什么兩樣,“數(shù)據(jù)丟失,大不了再算一遍”,請教師務必講清楚。疑難解答初學編程常見錯誤最常見的初級錯誤有:賦值號(=)與比較運算的相等號(==)混淆,循環(huán)語句中兩個分號誤為逗號,使用了數(shù)學符號而不是運算符等等。在條件語句和循環(huán)語句中最常見的錯誤之一是不會使用復合語句。如:if(a<=b)temp=a;a=b;b=temp;其目的是當a<=b時,交換a、b兩變量,學生誤認為將實現(xiàn)交換的三條語句放在同一行就可以了。但if語句后面跟的僅是一條語句,必須將三條語句用花括號括起來。而且學生發(fā)現(xiàn)的錯誤是有時輸出的b是隨機數(shù),他始終想不到是錯在未用復合語句。再如,在循環(huán)語句中,循環(huán)變量往往同時用作數(shù)組的下標變量,很易出錯。書上的例題都是規(guī)范的編程方法,學生編程往往喜歡隨意修改,如例2.26被改為:inti=0;ifstreambaiji;baiji.open(ubaiji.txt*');do{baiji.get(a[i]);i++;}while(ali]!='\n');其原意是從baiji文件中讀取一行文字。當讀完一行,a[i]中放了換行符,但隨后i++,判斷循環(huán)條件時,比較的是數(shù)組的下ー個元素,陷入死循環(huán)。而原例題判斷是在i++之前。學生不認為這里會錯,而奇怪我的步驟沒錯,怎么文件讀不出來?常用算法應用實例是一個總結提高,有利于開拓學生的思路、提高編程的能力。這幾道題都是經(jīng)典的。注意:文本文件閱讀可以用的程序很多,常見的有,記事本、寫字板、Word、Explorer,VisualSdutio等文本編輯器,其中記事本對程序生成的沒有回車的文本往往無法讀出。學生往往只用記事本讀程序生成的文本文件,有時發(fā)現(xiàn)只有黑方塊,但用自編的程序讀出卻完全正確,于是用了大量時間去查錯,不知是記事本的要求不同。注意:當文本文件中既有文字又有數(shù)字時,請在文字后加回車(或endl),否則用自編程序讀文件時可能會出錯,因為文本文件中數(shù)字是用數(shù)字串存儲的,提取數(shù)據(jù)時系統(tǒng)自動將串轉(zhuǎn)換為數(shù),有回車時從哪里開始轉(zhuǎn)換十分清楚。if語句和switch語句的對應關系if語句和switch語句有一個呼應關系。if語句的嵌套方式對應于有break的switch語句,它實現(xiàn)互不相干的分段,每次僅處理一個分段;而并列的if語句對應沒有break的switch語句,它依次處理各個分段,但各分段的方法不同。前者例子很多,后者見書上例2.9和習題2.4。習題2.4編程計算個人所得稅。個人所得稅率表如下:月收入1200元起征,超過起征點500元以內(nèi)部分稅率5%,超過500元到2,000元部分稅率10%,超過2,000元到5,000元部分稅率15%,超過5,000元到20,000元部分稅率20%,超過20,000元到40,000元部分稅率25%,超過40,000元到60,000元部分稅率30%,超過60,000元到80,000元部分稅率35%,超過80,000元到100,000元部分稅率40%,超過100,000元部分稅率45機#include<iostream>usingnamespacestd;intmain(){doubleincome,tax=0;intk;coutvv"請輸入個人月收入:n?endl;cin?income;if(income<=1200){coutvv"免征個人所得稅"vvendl;return0;)elseincome-=1200;if(income>20000){〃收入超過起征點20000以卜.各段,使用不包含break的switch語句k=income/20000;switch(k){default:tax+=(income-100000)*0.45;income=100000;case4:tax+=(income-80000)*0.40;income=80000;case3:tax+=(income-60000)*0.35;income=60000;case2:tax+=(income-40000)*0.30;income=400(M);case1:tax+=(income-20000)*0.25;income=20000;)1if(income>5000){ 〃收入超過起征點20000以下各段,使用并列的if語句tax+=(income-5000)*0.20;income=5000;)if(income>2000){tax+=(income-2000)*0.15;income=2000;)if(income>500){tax+=(income-500)*0.10;income=500;tax+=income*0.05;couivv”應征所得稅:M?tax?endl;return0;}程序從最高稅率段開始計算,分段疊加。先算兩萬元以上各段,每兩萬為一檔,采用沒有break的switch語句。后面各低收入段,用并列的if語句,這兩種方法是對應的。第二要注意計算的入口處,收入減去該段的下限,進行計算,以后各段都是完整的段,計算十分簡單。循環(huán)控制變量使用要點循環(huán)語句中的循環(huán)控制變量最好不要參加運算,即使參加也只能參加不改變其本身值的運算,如習題2.11求完全數(shù)解答中的求某數(shù)的因子的運算不會改變原數(shù)的值。這是規(guī)范的做法。除前面常見錯誤小節(jié)中舉的讀文件的例子外,下面再看同步實驗練習5.2求水仙花數(shù)學生的解法:#include<iostream>usingnamespacestd;intmain(){inti,j,k,m,a[3];for(i=100;i<=999;i++){k=0;for(j=0;j<=2;j++){〃將該數(shù)分解為各位數(shù)字,并求各位數(shù)字的立方和a[j]=i%10;i=i/10;k=k+a[j]*a[j]*a[j];if(i=k)coutvvivv"是水仙花數(shù)、H?endl;return0;}成了死循環(huán),原因是循環(huán)變量參加的運算改變了循環(huán)變量本身的值。應該添加一個變量m來代替i參加將該數(shù)分解為各位數(shù)字的運算。#include<iostream>usingnamespacestd;intmain(){inti,j,k,m,a[3];for(i=100;i<=999;i++){m=ii 〃用m代替i參加運算k=0;for(j=0;j<=2;j++){〃將該數(shù)分解為各位數(shù)字,并求各位數(shù)字的立方和a[j]=m%10;m=m/10;k=k+a|j]*a[j]*a[j];)if(i==k)cout?i<ぐ’是水仙花數(shù)。"?endl;)return0;)編程中附加條件的安排學生在初學編程時,對題目提出的各種條件應如何實現(xiàn)心中無數(shù),必須多加指點。如窮舉法采用循環(huán),對須剔除的情況,應在循環(huán)體內(nèi)用條件語句實現(xiàn),并使用continue語句,不可用break。有同學將附加條件放在循環(huán)條件中,當然出錯。例如:0到4五個數(shù)字,組成五位數(shù),每個數(shù)字用一次,但十位和百位不能為3(當然萬位不能為0),輸出所有可能的五位數(shù)。#include<iostream>usingnamespacestd;intmain(){inti,j,k,l,m,n,count=0;for(i=l;i<=4;i++){for(j=0;jv=4;j++){if(j==i)continue;for(k=0;k<=4;k++){if(k==3llk==illk==j)continue;for(l=0;l<=4;l++){if(l==3lll==i|||==j||l==k)continue;fbr(m=0;m<=4;m++){if(m=illm==jllm==kllm==l)continue;n=i*10000+j*1000+k*l00+1*10+m;cout?n?\t';〃或cout<<i<<j?k?l?m?,\t';count++;if(count%5=0)cout?endl;))|))return0;學生往往會把排除條件放在循環(huán)條件中,不知道應放在循環(huán)體中,并用continue跳過,不再輸出。如(為了簡單,不考慮每個數(shù)只用一次):intmain(){inti,j,k,l,m,n,count=0;for(i=l;i<=4;i++)for(j=0;j<=4;j++)for(k=0;k<=4&&ko3;k++) //k到3循環(huán)就停止,4沒做for(l=0;l<=4&&l<>3,1++)〃同上for(m=0;m<=4,m4-+){n=i*10000+j*1000+k*100+1*10+m;cout?n?'\t,;〃或cout?i<<j?k?l?m?At,;count++;if(count%5==0)cout?endl;)return0;標準流文件結束符的使用例2.13采用函數(shù)intcin.get(),當鍵盤輸入Ctrl+z時它可以返回文件結束符EOF,即ー1,其后輸入的內(nèi)容全部忽略。但是Ctrl+z必須在獨立的一行的開頭輸入,否則Ctrl+z被忽略。而函數(shù)cin.get(字符變量)中的字符變量(實參)不能取得文件結束符,并發(fā)生輸入流出錯,以后跳過該語句,進入死循環(huán)(參見第9章)。但可以如下使用:cout<〈"輸入ー一段文本(無空行):"<<endl;

while(cin.get(ch)){if(ch==,\n,)nline++;〃ch必須為字符型〃遇換行符行數(shù)+1if(!isword)nword++;nch++;isword=l;)elseisword=0;};〃在單詞的起始處給單詞數(shù)〃ch必須為字符型〃遇換行符行數(shù)+1if(!isword)nword++;nch++;isword=l;)elseisword=0;};〃在單詞的起始處給單詞數(shù)+1〃字符數(shù)加+1//讀到間隔符〃讀到文本結束符為止函數(shù)cin.get(字符變量)的返回值是該輸入流對象cin的引用(參見第九章),該函數(shù)作為循環(huán)條件放在while語句中,實際是以函數(shù)的返冋值流對象cin的引用作為循環(huán)條件,當鍵盤輸入Ctrl_z后,標準輸入流結束,循環(huán)條件為假,循環(huán)結束。詳見本指導書第九章的解釋。他必須為字符型實踐教材實驗四范例2他必須為字符型while(cin.get(c)){switch(c){case’0':caseT:case'2':case3':case'4':case'5':case'6':caseワ’:case8:case'9':nDigit++;break;case'case'\n':caseAt':nWhite++;break;default:nOther++;break;))這兩題的源代碼在教學資源例題源代碼Ex_2_13_l和同步實驗范例源代碼Exp_4_2_l中。圖解法閱讀程序程序設計能力的培養(yǎng)包括兩個方面:編寫程序能力和閱讀程序能力。圖解法在讀懂程序方面可以帶來很大方便,跟蹤程序執(zhí)行,實際上是填寫變量表格完成的。參照本章習題2.1的解答。圖解法分析算法 Fibonacci級數(shù)例2.14是已知Fibonacci級數(shù)的公式來編程的,如果不知道,可以用圖解法。安排四個變量:兔子總數(shù)s,成年兔數(shù)a,一月兔數(shù)b,初生兔數(shù)c;則由下圖可以得到具體算法。下圖每ー個變量的內(nèi)存圖中列出的數(shù)據(jù)從右到左按月變化,繪制時也可以從左到右按月變化,比變量表格方便。2110211010321 100s:總兔數(shù)量a:成年兔b:a:成年兔a=a+b;〃本月成年兔為上月一月兔與成年兔之和b=c;〃本月一月兔數(shù)量為上月初生兔c=a;〃本月初生兔數(shù)量為本月成年兔(每對生一對)s=a+b+c;〃本月兔總數(shù)代入初值:a=0;b=0;c=l;就可以進行遞推。第二種考慮,安排三個變量:本月兔子總數(shù)i,上個月兔子總數(shù)j,前個月兔子總數(shù)k,前個月兔子總數(shù)恰好是本月可生育兔子的數(shù)量,即本月新生兔子數(shù)量,所以本月兔子數(shù)等于上月兔子數(shù)加前月兔子數(shù)之和。列出遞推算法,即:i=j+k;k=j;j=i;與Fibonacci級數(shù)的公式ー樣。數(shù)字與數(shù)字串例2.23為什么要用字符輸入二進制序列,不用數(shù)字,學生不理解。教師應加說明,對應數(shù)字,cin輸入數(shù)字串是自動轉(zhuǎn)換為數(shù)字的,也就是本例題的算法已經(jīng)包含在cin對象中。也可以輸入數(shù)字,變成字符保存,參見下例:請輸入ー組數(shù)字,它們是一字符串的ASCH碼,將它們轉(zhuǎn)換為字符串保存。#include<fstream>#include<iostream>usingnamespacestd;intmain(){inti,k;chara[64];for(i=0;i<64

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論