C++115章程序設(shè)計(jì)教程(第.ppt_第1頁(yè)
C++115章程序設(shè)計(jì)教程(第.ppt_第2頁(yè)
C++115章程序設(shè)計(jì)教程(第.ppt_第3頁(yè)
C++115章程序設(shè)計(jì)教程(第.ppt_第4頁(yè)
C++115章程序設(shè)計(jì)教程(第.ppt_第5頁(yè)
已閱讀5頁(yè),還剩353頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

02:22:41,1,C + 程序設(shè)計(jì)教程(第二版),第一章 c+概述 Chapter 1 Introduction,清華大學(xué)出版社,一、面向?qū)ο蟮姆椒ㄊ窃谟?jì)算機(jī)語(yǔ)言發(fā)展過(guò)程中產(chǎn)生的。 早期:機(jī)器語(yǔ)言、匯編語(yǔ)言 50年代中期:FORTRAN語(yǔ)言引進(jìn)了許多現(xiàn)代仍然使用的程序設(shè)計(jì)概念。 50年代后期:ALGOL60提出塊結(jié)構(gòu)的思想。 60年代:SIMULA67首先提出對(duì)象和類的概念,并支持類的繼承,是面向?qū)ο笳Z(yǔ)言的鼻祖 70年代:ADA不能全面地支持繼承,稱為基于對(duì)象的語(yǔ)言。,1 面向?qū)ο蟮挠蓙?lái)和發(fā)展,后來(lái)出現(xiàn)的Smalltalk是最有影響的面向?qū)ο蟮恼Z(yǔ)言之一。 80年代中后期以后,隨著面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言的廣泛應(yīng)用,出現(xiàn)了更多的面向?qū)ο蟮恼Z(yǔ)言。,面向?qū)ο蟮恼Z(yǔ)言可分為以下兩類: 1、開(kāi)發(fā)全新的面向?qū)ο蟮恼Z(yǔ)言 ObjectC Eiffel Smalltalk80 2、對(duì)傳統(tǒng)語(yǔ)言進(jìn)行面向?qū)ο蟮臄U(kuò)展,稱為混合型語(yǔ)言,其代表有C+語(yǔ)言。,C+,C,C+ 語(yǔ)言具有C語(yǔ)言的豐富的應(yīng)用基礎(chǔ)和開(kāi)發(fā)環(huán)境的支持,對(duì)于已經(jīng)掌握C語(yǔ)言的人講,更易學(xué)易普及。,二、從C到C+ C語(yǔ)言是貝爾實(shí)驗(yàn)室為DEC公司開(kāi)發(fā)PDP 系列計(jì)算機(jī)操作系統(tǒng)時(shí)研制的。 C作為UNIX操作系統(tǒng)的開(kāi)發(fā)語(yǔ)言而廣為應(yīng)用 和流行。1989年制定為ANSI C標(biāo)準(zhǔn)。,1、語(yǔ)言簡(jiǎn)潔、緊湊,使用方便、靈活。 2、運(yùn)算符和數(shù)據(jù)類型豐富。 3、訪問(wèn)內(nèi)存地址、寄存器、進(jìn)行位操作, 具有匯編語(yǔ)言的功能。 4、生成的目標(biāo)代碼質(zhì)量高、程序運(yùn)行效率高。,C語(yǔ)言的獨(dú)有特點(diǎn)是:,局限: 1、對(duì)類型的檢查機(jī)制相對(duì)較弱、程序中的一些錯(cuò)誤不能在編譯時(shí)發(fā)現(xiàn); 2、無(wú)支持代碼重用的語(yǔ)言結(jié)構(gòu); 3、當(dāng)程序規(guī)模達(dá)到一定的程度時(shí),難以控制程序的復(fù)雜性;,為滿足管理程序復(fù)雜性需要,1980年,貝爾實(shí)驗(yàn)室對(duì)C進(jìn)行了改進(jìn)和擴(kuò)充:,“帶類的C”,C,1983年取名為C+,后經(jīng)過(guò)三次修訂。 1994年制定了ANSI C+標(biāo)準(zhǔn)的草案。,1、C+是C的擴(kuò)展,C是C+的子集,C+ 包括C的全部特征、屬性和優(yōu)點(diǎn)。同時(shí),增加了對(duì)面向?qū)ο缶幊痰耐耆С帧?2、與C 一致, C+程序結(jié)構(gòu)采用函數(shù)驅(qū)動(dòng)機(jī)制實(shí)現(xiàn)。 3、C+實(shí)現(xiàn)了類的封裝,數(shù)據(jù)隱藏、繼承及多態(tài),使其代碼可重用并容易維護(hù)。 4、C+是一門(mén)高效使用的程序設(shè)計(jì)語(yǔ)言,既可進(jìn)行過(guò)程化程序設(shè)計(jì),又可進(jìn)行面向?qū)ο蟪绦蛟O(shè)計(jì)。,C+的特點(diǎn),在面向過(guò)程的程序設(shè)計(jì)中,程序是處理數(shù)據(jù)的一系列過(guò)程。過(guò)程(或函數(shù))定義為實(shí)現(xiàn)特定功能的一組指令。 其主要設(shè)計(jì)思想是功能分解并逐步求精。數(shù)據(jù)與程序過(guò)程分開(kāi)存儲(chǔ),編程的主要技巧在于關(guān)注模塊之間的調(diào)用關(guān)系及數(shù)據(jù)的變化。,1.2 面向過(guò)程的程序設(shè)計(jì),1、當(dāng)數(shù)據(jù)量增大時(shí),數(shù)據(jù)與處理這些數(shù)據(jù)的方法之間的分離使程序變得越來(lái)越難以理解。 2、相對(duì)于老問(wèn)題的新方法都要帶來(lái)額外的開(kāi)銷(xiāo),程序的可重用性小。,面向過(guò)程程序設(shè)計(jì)的主要缺點(diǎn),面向?qū)ο蟪绦蛟O(shè)計(jì) OOP (Object-Oriented Programming)的三要素: 對(duì)象、類和繼承 面向?qū)ο蟪绦蛟O(shè)計(jì)的實(shí)現(xiàn)需要: 封裝和數(shù)據(jù)隱藏技術(shù) 繼承和多態(tài)性技術(shù),1.3 面向?qū)ο蟪绦蛟O(shè)計(jì),對(duì)象的模型結(jié)構(gòu),多態(tài)性 封裝性、繼承性、多態(tài)性是構(gòu)成面向?qū)ο?程序設(shè)計(jì)的三大特征。 封裝性是基礎(chǔ) 繼承性是關(guān)鍵 多態(tài)性是補(bǔ)充 什么是多態(tài)性? 多態(tài)是指一個(gè)名字有多種語(yǔ)義,或一個(gè)相同界面有多種實(shí)現(xiàn); 或是指發(fā)出同樣的消息被不同類型的對(duì)象 接受而導(dǎo)致完全不同的行為。即對(duì)象根據(jù)所接收到的消息做出相應(yīng)的操作。,例如:在學(xué)籍管理系統(tǒng)中,學(xué)生類(基類) 計(jì)算成績(jī)的操作,中學(xué)生類(派生類) 計(jì)算成績(jī)的操作,大學(xué)生類(派生類) 計(jì)算成績(jī)的操作,1.4 程序開(kāi)發(fā)過(guò)程,例1: /* /*ch1.0.cpp* /* void main( ) ,1.5 最簡(jiǎn)單的程序,運(yùn)行結(jié)果為:,例2: /* /*ch1.1.cpp* /* # include void main( ) cout “I am a student.n”; ,1.5 最簡(jiǎn)單的程序,運(yùn)行結(jié)果為: I am a student.,例 3: /* ch1.2.cpp * #include void main( ) int interger1; int interger2; int result; cout interger1 interger2; result=3*interger1-2*interger2+1; cout “Result is ” resultendl; ,內(nèi)存的概念 Memory Concepts,cin integer1; Assume user entered 45 cin integer2; Assume user entered 72 sum = integer1 + integer2;,C+程序是由函數(shù)構(gòu)成的,由一個(gè)主函數(shù)和若干個(gè)函數(shù)構(gòu)成。 C+程序是函數(shù)驅(qū)動(dòng)的。 例3: /*ch1.3.cpp* #include #include double max(doubl x, doubl y); / function prototype void main( ) double a, b, c; cout “Input two numbers:n”; c=max(a,b); cout “The squart of maximum=”sqrt( c); , 1.6 函 數(shù),double max(double x, double y) if (xy) return x; else return y; ,運(yùn)行結(jié)果: Input two numbers: 10.0,25.0 The squart of maximum=5.0,學(xué)習(xí)本課程目的,C + 程序設(shè)計(jì)教程(第二版),第二章 基本編程語(yǔ)句 Chapter 2 Basic Programming Statements,清華大學(xué)出版社 錢(qián) 能,第二章內(nèi)容,說(shuō)明語(yǔ)句 ( Declarative Statements ) 條件語(yǔ)句 (Condition Statements ) 循環(huán)語(yǔ)句 ( Loop Statements ) 循環(huán)設(shè)計(jì)(Loop Designs ) 輸入輸出語(yǔ)句( Input/Output Statements ) 轉(zhuǎn)移語(yǔ)句 ( Move Statements ) 再做循環(huán)設(shè)計(jì)(More Loop Designs ),1. 說(shuō)明語(yǔ)句 ( Declarative Statements ),數(shù)據(jù)說(shuō)明: 求解問(wèn)題所使用的數(shù)據(jù)是什么性質(zhì),進(jìn)行什么運(yùn)算,表達(dá)范圍如何,必須預(yù)先說(shuō)明 說(shuō)明方式: 既要指明其名字,也要指明其是什么類型,還可以順便初始化如: int a; double d = 3.5; 說(shuō)明數(shù)據(jù)的另一個(gè)目的是創(chuàng)建一個(gè)所需大小的實(shí)體空間給該名字,以便存儲(chǔ)所用的數(shù)據(jù)值 若數(shù)據(jù)名字沒(méi)有說(shuō)明,使用其便是非法的,過(guò)程(函數(shù))說(shuō)明: 求解中需要通過(guò)函數(shù)調(diào)用來(lái)實(shí)施求解時(shí),便要對(duì)函數(shù)的性質(zhì)進(jìn)行說(shuō)明,說(shuō)明其返回類型,參數(shù)類型,參數(shù)個(gè)數(shù) 函數(shù)說(shuō)明分函數(shù)聲明和函數(shù)定義兩種: 函數(shù)聲明是說(shuō)明函數(shù)的名字,函數(shù)的返回類型,以及函數(shù)的參數(shù)和個(gè)數(shù)如: double area(double ra); 函數(shù)定義是在函數(shù)聲明的基礎(chǔ)上,對(duì)整個(gè)實(shí)現(xiàn)過(guò)程進(jìn)行詳細(xì)定義如: double area(double ra) return ra*ra*3.14; ,調(diào)用函數(shù)就是使用函數(shù)名字,使用名字前必須清楚名字的性質(zhì),所以必須先對(duì)函數(shù)進(jìn)行聲明 運(yùn)行程序中,會(huì)涉及到被調(diào)用函數(shù)的執(zhí)行,所以凡是被調(diào)用的函數(shù)都必須有函數(shù)定義,不管該定義在程序的什么位置如: double sphere(); / 聲明 int main() double result = sphere(); / 調(diào)用 coutr; return r*r*3.14; ,. 條件語(yǔ)句(Condition Statements ),if語(yǔ)句的兩種形態(tài):,語(yǔ)句1,條件,語(yǔ)句1,條件,語(yǔ)句2,是,是,否,否,對(duì)應(yīng)語(yǔ)句: if(ab) coutaendl; if(a=b) coutaendl; else coutbendl;,錯(cuò)綜復(fù)雜時(shí),必須注意兩義性: if(x0) if(x50) cout”x is ok.n”; else cout”x is not ok.n”;,正解:else從屬于緊挨的if if(x0) if(x 50) cout”O(jiān)Kn”; else cout”NOT OKn”; ,誤解:else從屬于外面的if if(x0) if(x 50) cout”O(jiān)Kn”; else cout”NOT OKn”;,條件表達(dá)式: 對(duì)于 if(x) a = 327981; else b = 327981; 可表示為: x ? a=327981 : b=327981; 如果a和b為同類型,則還可以: (x?a:b) = 327981;,switch多分支語(yǔ)句: switch(整數(shù)表達(dá)式) case value1: 語(yǔ)句1; break; case value2: 語(yǔ)句2; break; default: 語(yǔ)句n; 等價(jià)于: if(整數(shù)表達(dá)式=value1) 語(yǔ)句1; else if(整數(shù)表達(dá)式=value2) 語(yǔ)句2; else 語(yǔ)句n; ,雖然switch有等價(jià)的復(fù)合if表示, 而且,分支判斷值只能是整數(shù),顯得應(yīng)用范圍狹窄, 但是switch在使用上的直觀和靈活形式, 使得其仍具有編程價(jià)值. 如: break可選,甚至case可以重疊: case value1: 語(yǔ)句1; case value2: 語(yǔ)句2; case v1: case v2: case v3: 語(yǔ)句;,3. 循環(huán)語(yǔ)句 ( Loop Statements ),for循環(huán)結(jié)構(gòu):,對(duì)應(yīng)語(yǔ)句為: for(int i=1; i=10; i+) cout”hello.n”;,循環(huán)初始狀態(tài),條件判斷,狀態(tài)修正,循環(huán)體,每次循環(huán)體執(zhí)行,都改變循環(huán)狀態(tài),直到條件不滿足而終止. 如,設(shè)置求和的初始值,交給循環(huán)計(jì)算,完成循環(huán)后,輸出求和結(jié)果: int sum = 0; for(int i=1; i=100; i+) sum = sum+i; coutsumendl;,循環(huán)開(kāi)始,循環(huán)結(jié)束,因?yàn)椴⒉皇撬醒h(huán)都有明顯的循環(huán)初始狀態(tài)和狀態(tài)修正的,所以,while循環(huán)是一種for循環(huán)的簡(jiǎn)潔形式. 如,同樣的求和: int sum=0, i=1; while(i=100) sum += i+; coutsumendl;,循環(huán)開(kāi)始,循環(huán)結(jié)束,4. 循環(huán)設(shè)計(jì) ( Loop Designs ),(1)簡(jiǎn)單字符圖形的雙重循環(huán) M MM MMM MMMM MMMMM MMMMMM MMMMMMM MMMMMMMM MMMMMMMMM MMMMMMMMMM,分析方法: 該圖形一共10行,每一行增加一個(gè)字符,所以,應(yīng)循環(huán)10次,每次輸出一行,其循環(huán)模式為: for(int i=1; i=10; +i) 輸出第i行(循環(huán)) 換行 行 i M個(gè)數(shù) 1 1 1 2 2 2 3 3 3 4 4 4 . 10 10 10,for(int i=1; i=10; +i) for(int j=1; j=i; +j) cout”M”; coutendl; ,(2)判斷素?cái)?shù):(利用數(shù)學(xué)定律) mij 假定ij, 則 i2ijmj2 即 i2mj2 即 imj bool isPrime(int m) double sqm=sqrt(m*1.0); for(int i=2; i=sqm; +i) if(m%i=0) return false; return true; ,5. 輸入輸出語(yǔ)句( Input/Output Statements ),標(biāo)準(zhǔn)輸出流: 可以控制輸出格式 cout3)3); / 0 false coutfixed12345.678; / 12345.678000 coutscientific123456.678; / 1.234568e+05,控制寬度和填充字符的操作是帶參數(shù)的,注意width(n)為一次性操作,即第二次顯示時(shí)將不再有效。默認(rèn)為width(0),表示僅顯示數(shù)值。例如: cout.width(5); cout.fill(S); cout coutsetw(6)setfill($)27endl; / 輸出: $27,文件流的輸入出操作與標(biāo)準(zhǔn)輸入出基本相同,只是需要以一定方式打開(kāi)和關(guān)閉 如,將文件a.in打開(kāi),逐行讀入字符,輸出到文件a.out: ifstream in(“a.in”); ofstream out(“a.out”); for(string s; getline(in, s); ) outsendl; 其中文件流讀入操作總是伴隨著狀態(tài)返回,判斷狀態(tài)就可以確定文件是否正常讀入,如getline(in,s)當(dāng)讀到文件尾時(shí),便返回false,以使循環(huán)結(jié)束,. 轉(zhuǎn)移語(yǔ)句 ( Move Statements ),break除了用在switch之外,主要的是用在終結(jié)本次循環(huán) for(int i; ; ) for( ; ; ) / . if(i=1) break; / . a=1; / . ,break跳到此處,continue一般是用條件判斷執(zhí)行的,通過(guò)反條件,可以免去continue的使用,所以,它用來(lái)構(gòu)筑良好的程序風(fēng)格 for(int n=100; n=200; +n) if(n%3=0) continue; coutnendl; 免去continue的情形: for(int n=100; n=200; +n) if(n%3!=0) coutnendl;,goto的程序段除了系統(tǒng)跟蹤和架構(gòu)困難外,閱讀也相對(duì)復(fù)雜: int a; goto Init; Forward: a = a + 1; Print: coutaendl; goto Down; Init: a = 1; goto Print; Down: if(a100) goto Forward; 等價(jià)于: for(int i=1; i=100; +i) couti“n”;,break語(yǔ)句的可取之處: / 用break語(yǔ)句的代碼段 bool flag=false; / 用于做退出記號(hào) for(int i=1; i100; +i) for(int j=1; j100; +j) if(i*j=651) flag=true; break; else / . if(flag) break; / goto語(yǔ)句的代碼段 for(int i=1; i100; +i) for(int j=1; j100; +j) if(i*j=651) goto End; / . End:,7. 再做循環(huán)設(shè)計(jì)( More Loop Designs ),邏輯判斷類的語(yǔ)句控制結(jié)構(gòu): for(所有可能情況) / 可為多重循環(huán) if(條件1不滿足) continue; if(條件2不滿足) continue; / if(條件n不滿足) continue; 輸出所要的結(jié)果 ,百雞問(wèn)題的例子: for(int c=1; c=13; +c) for(int h=1; h=18; +h) for(int s=1; s=96; +s) if(7*c+5*h+s/3-100) continue; if(c+h+s-100) continue; if(s%3) continue; cout“Cock:“c “, Hens:“h “, Chicks:“100-c-hendl; ,級(jí)數(shù)逼近問(wèn)題 前后項(xiàng)之差與0的鄰域(精度要求)的比較作為循環(huán)退出條件,是控制精度的必要方法 項(xiàng)值計(jì)算 由循環(huán)變量,根據(jù)通項(xiàng)公式,直接求第i項(xiàng)的值 也可先給出第一項(xiàng)的值,然后反復(fù)根據(jù)前項(xiàng)求后項(xiàng),求級(jí)數(shù) 的例子: double sum=0, item=1; for(int n=1; abs(item)1e-6; +n) item *= (-1.0)*(2*n-3)/(2*n-1); sum += item; cout“Pi = “ setiosflags(ios:fixed) sum*4endl;,第三章內(nèi)容,整型 ( int Types ) 整型子類 ( sub-int Types ) 浮點(diǎn)型 ( Floating-Point Type ) C-串與string ( C-string & string ) 數(shù)組 ( Arrays ) 向量 ( vectors ) 指針與引用 ( Pointer & References ),整型數(shù)的內(nèi)部表示:二進(jìn)制補(bǔ)碼 位數(shù)既定的二進(jìn)制補(bǔ)碼運(yùn)算沒(méi)有加減的區(qū)別;對(duì)于溢出,只是簡(jiǎn)單的舍棄而不是錯(cuò)誤 整型數(shù)的表示范圍:取決于二進(jìn)制位數(shù) 整型數(shù)的操作:+,-,*,/,%,=,!,=,=,=,&,|,&=,|=,&,|,&=,|=,!=,=,+=,-=,*=,/=,%=,+,-,,,? :,編譯器的機(jī)器字長(zhǎng)總是與整型的位長(zhǎng)有關(guān)如: 32位編譯器的整型數(shù)一定為32位長(zhǎng) 整型字面值分八進(jìn)制,十進(jìn)制和十六進(jìn)制不同表示如: 0123 / 8進(jìn)制 0x12af3 / 16進(jìn)制 12345 / 10進(jìn)制 超過(guò)表示范圍的整型數(shù)其值不可預(yù)料或者出錯(cuò)如: int a = 12345678912345678912345; / 錯(cuò),數(shù)據(jù)類型: 一定的數(shù)據(jù)在計(jì)算機(jī)的內(nèi)部表示; 該數(shù)據(jù)所表示的值的集合; 在該數(shù)據(jù)上的一系列操作。 內(nèi)部數(shù)據(jù)類型: 1.整型 長(zhǎng)整型,短整型,字符型,布爾型 2.浮點(diǎn)型 單精度,雙精度,. 整型子類( Sub-int Types ),字符型: 表示范圍: 有符號(hào):-128127 無(wú)符號(hào):0255 輸出形式與整型數(shù)不同: int a = 65; char b = 65; couta“n”; coutb“n”; 結(jié)果為: 65 A,枚舉型: 自定義整數(shù)區(qū)間,甚至列舉單個(gè)整數(shù)值 enum Week Mon, Tue, Wed, Thu, Fri, Sat, Sun ; 最大特點(diǎn)是可以給每個(gè)值指定一個(gè)在程序中直接使用的標(biāo)記(枚舉符) 編程中將其當(dāng)作整數(shù)常量用如: int a = 7; if ( a = Sun) cout “Sundayn”;,布爾型: 表示范圍僅含整數(shù)和1,也可以表示成true和false,相當(dāng)于: enum bool false, true ; 因?yàn)闂l件表達(dá)式、邏輯運(yùn)算的結(jié)果都是或,所以,相當(dāng)大數(shù)量的表達(dá)式的值與布爾型對(duì)應(yīng),3. 浮點(diǎn)型 ( Floating-Point Types ),浮點(diǎn)數(shù)的內(nèi)部表示: 國(guó)際標(biāo)準(zhǔn)IEEE754浮點(diǎn)表示法,它與編程所用的浮點(diǎn)數(shù)字面量以及輸出的十進(jìn)制浮點(diǎn)數(shù)之間有一個(gè)轉(zhuǎn)換關(guān)系 浮點(diǎn)數(shù)的表示范圍: 32位浮點(diǎn)數(shù)3.41038 64位浮點(diǎn)數(shù)1.810308 浮點(diǎn)數(shù)的操作: 常規(guī)的加、減、乘、除等操作,4. C-串與string ( C-string & string ),C-串結(jié)構(gòu) 每個(gè)字符占據(jù)1個(gè)字節(jié) 一個(gè)C-串是一個(gè)字符序列,用來(lái)表示各種名字或者文字說(shuō)明 C-串的字符序列的最后總是添加有一個(gè)結(jié)束標(biāo)志.即在6個(gè)字符的字串(“Hello!”)其空間存儲(chǔ)有7個(gè)字節(jié) 左邊三圖是不同細(xì)節(jié)的同一空間結(jié)構(gòu)描述,Hello!0,72 101 108 108 111 33 0,知道了C-串首地址,即可知道整個(gè)串,所以可以藉字符首址(字符指針)來(lái)操作C-串,但要注意,串的第一個(gè)字符與整個(gè)串的操作不同,如,C-串的輸出操作: char* str = ”Hello”; cout *str endl; / 顯示H cout str endl; / 顯示Hello,C + 程序設(shè)計(jì)教程(第二版),第三章 數(shù)據(jù)類型 Chapter 3 Data Types,清華大學(xué)出版社 錢(qián) 能,C-串不能直接比較,因?yàn)樽址羔樀谋容^只是地址值的比較而不是C-串的字典序比較: cout(“join”=”join” ? ” : ”not “)”equaln”; / 字面值比較 char* str1=”good”; char* str2=”good”; cout(str1=str2 ? ” : ”not “)”equaln”; / 字符指針比較 char buffer16=”Hello”; char buffer26=”Hello”; cout(buffer1=buffer2 ? ” : ”not “)”equaln”; / 字符數(shù)組比較 結(jié)果: not equal not equal not equal,不得不配備專門(mén)操作C-串的庫(kù)函數(shù): strcpy(s1, s2); /從s2拷貝到s1 strcmp(s1, s2); /比較s1與s2 strcat(s1, s2); /連接s2到s1 strrev(s); /將s倒排 strset(s, c); /將s全置為c strstr(s, “ell”); /查找s中的子串 strchr(s,c); /查找s中的字符 等等,但字符指針操作C-串的安全性受到質(zhì)疑: char* str1; char* str2 = new char5; strcpy(str2, ”ugly”); strcpy(str1,str2); / 錯(cuò): str1沒(méi)有空間可儲(chǔ) strcpy(str2, ”Hello”); / 錯(cuò): str2空間不夠大 str2 = ”Hello”; / 錯(cuò):原來(lái)的”ugly”空間脫鉤,導(dǎo)致內(nèi)存泄漏 根源:復(fù)制操作須以足夠的目的地空間為前提,而所有C-串操作的空間調(diào)配都是人為安排的,C-串庫(kù)函數(shù)一概不管,類串string串類自定義串 對(duì)應(yīng)字符指針的C-串操作: string a, s1 = “Hello “; string s2 = “123“; a = s1; / copy cout(a=s1 ? “ : “ not“)“equaln“; / compare couta+s2endl; / concatenate reverse(a.begin(), a.end(); coutaendl; / reverse couta.replace(0,9,9,c)endl; / set cout(s1.find(“ell“)!= -1 ? “ : “not “)“foundn“;/ find string cout(s1.find(c)!= -1 ? “: “not “)“foundn“; / find char,輸入C-串的string承載方式: cin的讀入方式總是將前導(dǎo)的空格(所謂空格,即包括空格、回車(chē)、水平或垂直制表符等)濾掉,將單詞讀入,在遇到空格時(shí)結(jié)束本次輸入 getline總是將行末的回車(chē)符濾掉,將其整行輸入 對(duì)字串”Hello, How are you?”的兩種輸入方式 for ( string s; cins; ) couts” “; coutendl; string s; getline(cin, s); coutsendl;,string流: 將string實(shí)體看作是一個(gè)輸入設(shè)備給一個(gè)像cin這樣的取名,作為流來(lái)操作,會(huì)很有用 例如,如果一個(gè)文件aaa.txt,有若干行,每行中含有不知道幾個(gè)的整數(shù),要輸出每行的整數(shù)和: ifstream in ( “aaa.txt“ ) ; for ( string s ; getline ( in, s ) ; ) int a, sum=0 ; for ( istringstream sin ( s ) ; sin a ; sum += a ) ; cout sum “n” ; ,5. 數(shù)組( Arrays ),數(shù)組是同類元素的集合,它的元素排列在連續(xù)的空間中,按下標(biāo)來(lái)標(biāo)記 描述數(shù)組必須給出元素類型,元素個(gè)數(shù) 元素個(gè)數(shù)必須在編程時(shí)確定,任何變量都不允許 int aa ; / 表示int a97; int n = 100 ; int an ; / 錯(cuò): 元素個(gè)數(shù)必須預(yù)知 const int n = 100 ; int an ; / ok int a ; / 錯(cuò): 無(wú)元素個(gè)數(shù) int a = 1, 2, 3, 4, 5 ; / ok:通過(guò)初始化確定元素個(gè)數(shù),數(shù)組初始化可選,但須遵循語(yǔ)法無(wú)初始化的數(shù)組按規(guī)定取默認(rèn)值 int array15 = 1, 2, 3, 4, 5, 6 ; / 錯(cuò): 初始值個(gè)數(shù)超元素個(gè)數(shù) int array25 = 1, , 2, 3, 4 ; / 錯(cuò): 不能以逗號(hào)方式省略 int array35 = 1, 2, 3, ; / 錯(cuò): 同上 int array45 = ; / 錯(cuò): 初始值不能為空 int array55 = 1, 2, 3 ; / ok: 后面元素取0 int array65 = 0 ; / ok: 元素全為0 int array75 ; / ok: 元素值不確定 int a35 = 1, 2, 3, 4, 5 , 2, 3, 4, 5, 6 , 3, 4, 5, 6, 7 ;,數(shù)組有諸多缺陷,造成編程艱難和不安全 int a5 = 1,2,3,4,5, c5; int b5 = a; / 錯(cuò):無(wú)法拷貝創(chuàng)建 c = a; / 錯(cuò):無(wú)法整體拷貝和局部拷貝 a8 = 10; / 錯(cuò):無(wú)法動(dòng)態(tài)擴(kuò)容和隨意增減元素 for(int i=0; i=5; +i) / 錯(cuò):無(wú)法防范下標(biāo)溢出 ai = i+1; if(a=c) a0 = 2; / 錯(cuò):不可比較 int a5 = 1; / 初始化呆板,無(wú)法獲得全初值,二維數(shù)組的初始化,下標(biāo)訪問(wèn)及輸出 int array123=1,2,3,4,5; int array223=1,2,4; cout“array1: “; for(int i=0; i2; +i) for(int j=0; j3; +j) coutarray1ij“,“; cout“narray2: “; for(int i=0; i2; +i) for(int j=0; j3; +j) coutarray2ij“,“; cout“n“; 結(jié)果為: array1: 1,2,3,4,5,0, array2: 1,2,0,4,0,0,.向量( vector ),向量與數(shù)組的共同特征是元素的排列在邏輯上是線性序列結(jié)構(gòu),可以用下標(biāo)進(jìn)行訪問(wèn) 向量可以按需創(chuàng)建,拷貝創(chuàng)建,局部拷貝創(chuàng)建,異類拷貝和創(chuàng)建 靈活的初始化 隨意擴(kuò)容和元素增減 可通過(guò)異常來(lái)進(jìn)行下標(biāo)溢出追蹤和處理 可比較 等等,int n=10; int t5=1,2,3,4,5; vector a(n); /按需創(chuàng)建 vector b(10, 1); /元素賦全,靈活的初始化 vector c(b); / 整體拷貝創(chuàng)建 vector f(t, t+5); /異類拷貝創(chuàng)建 vector d(b.begin(), b.begin()+3); /局部拷貝創(chuàng)建d為b的前個(gè)元素 a.assign(100); /動(dòng)態(tài)擴(kuò)容至100個(gè)元素,向量常用操作 a.assign(b.begin(), b.begin()+3); / b的前3個(gè)元素賦給a a.assign(4,2); / a向量含4個(gè)元素,全初始化為2 int x = a.back(); / a的最后一個(gè)元素賦給變量x a.clear(); / a向量清空(不再有元素) if(a.empty() cout”empty”; / a判空操作 int y = a.front(); / a的第一個(gè)元素賦給變量y a.pop_back(); / 刪除a的最后一個(gè)元素 a.push_back(5); / a最后插入一個(gè)元素,其值為5 a.resize(10); / a元素個(gè)數(shù)調(diào)至10。多刪少補(bǔ),其值隨機(jī) a.resize(10,2);/a元素個(gè)數(shù)調(diào)至10。多刪少補(bǔ),新添元素初值為2 if(a=b) cout”equal”; / a與b的向量比較操作,向量操作尤其適合于函數(shù)參數(shù)傳遞(-D以上的數(shù)組參數(shù)的傳遞十分丑陋): 傳遞一個(gè)矩陣,無(wú)論其每行中的元素個(gè)數(shù)不同.輸出之: typedef vector Mat; void print(const Mat ,7. 指針與引用 ( Pointers & Reference ),指針指向存放數(shù)據(jù)的地址 指針必須初始化或者賦值(指向了數(shù)據(jù))后,才能進(jìn)行間接訪問(wèn)(間訪)操作 int* ip; int iCount = 18; int* iPtr = / 間訪操作,指針操作與指向數(shù)據(jù)的類型密切相關(guān) float f = 34.5; int* ip = reinterpret_cast( 結(jié)果為: fAddr: 1245064=34.5 iAddr: 1245064=1107951616 int: 100 float: 1.4013e-43,指針加減整數(shù)的操作表示空間位置上的挪動(dòng) 但是挪動(dòng)的字節(jié)數(shù)與其數(shù)據(jù)類型相關(guān): 對(duì)float指針加6實(shí)際增加了24個(gè)字節(jié) 對(duì)long int指針加5實(shí)際增加了20個(gè)字節(jié) 對(duì)char指針減7實(shí)際減少了7個(gè)字節(jié) 對(duì)double指針減2實(shí)際減少了16個(gè)字節(jié),數(shù)組名本身就是表示元素集合的首地址 可以將數(shù)組名賦給指針 int a3; for(int i=0; i3; +i) ai = i*2; for(int* iP=a; iPa+3; iP+=1) coutiP“: ”*iP“n”; 結(jié)果為: 1245036: 0 1245040: 2 1245044: 4,指針限定 const int a = 78; int b = 10; int c = 18; const int* ip = / ok,引用必須初始化,因?yàn)橐每偸歉綄儆谀硞€(gè)實(shí)體 int someInt = 5; int 結(jié)果為: 8 引用多用在函數(shù)參數(shù)的傳遞上,C + 程序設(shè)計(jì)教程(第二版),第四章 計(jì)算表達(dá) Chapter 4 Computational Expressing,清華大學(xué)出版社 錢(qián) 能,計(jì)算表達(dá): 表達(dá)計(jì)算使用一系列操作,它依賴于特定語(yǔ)言的操作符功能,關(guān)乎數(shù)據(jù)類型的內(nèi)在特性,故計(jì)算表達(dá)目的在于深入剖析數(shù)據(jù)類型對(duì)于編程的影響,從而準(zhǔn)確使用操作符 學(xué)習(xí)方法: 1.掌握操作符的功能和相互關(guān)系(優(yōu)先級(jí)和結(jié)合性) 2.針對(duì)內(nèi)部數(shù)據(jù)類型,對(duì)一些典型的操作中的典型問(wèn)題留下深刻印象,第四章內(nèi)容,名詞解釋( Name Explainations ) 算術(shù)運(yùn)算問(wèn)題 ( Arithmetic Problems ) 相容類型的轉(zhuǎn)換 ( Cast Campatible Type ) 關(guān)系與邏輯操作 ( Relation & Logic Operations ) 位操作 ( Bit Operations ) 增量操作 ( Increment Operations ) 表達(dá)式副作用 ( Expressions Side Effects ),1. 操作符 ( Operators ),單目操作符:在一個(gè)操作數(shù)上施加的操作,如:-3 雙目操作符:在二個(gè)操作數(shù)上施加的操作,如:- 故有些操作符既是單目操作符,又是雙目操作符 表達(dá)式:若干個(gè)操作數(shù)和操作符按語(yǔ)法規(guī)則構(gòu)成的操作,如: a = -3-5+6*7/-8,優(yōu)先級(jí):表達(dá)式中多個(gè)操作符的執(zhí)行順序的規(guī)定性,如: *x+; / 先做x+ 結(jié)合性:同級(jí)操作符的執(zhí)行順序的規(guī)定性,如: a=b=6; / 先做b=6,. 算術(shù)運(yùn)算問(wèn)題( Arithmetic Problems ),整型數(shù)表示范圍有限,如: 不能用整型變量累計(jì)的一般循環(huán)方法來(lái)解: int sum = 0; for(int i=1; i=10000; +i) sum += i; coutsum“n”;,整型數(shù)的周而復(fù)始性,如: unsigned int a = 2000000000; unsigned int b = 3000000000; cout a+b“n”; 結(jié)果為: 705032704 超過(guò)表示范圍的整型數(shù)不是報(bào)錯(cuò),而是表示成一個(gè)去掉進(jìn)位后的余數(shù),中間結(jié)果溢出導(dǎo)致計(jì)算錯(cuò)誤,如: int a = 100000; int b = 100000; int c = 1000; couta*b/c“n“; couta*(b/c)“n“; 結(jié)果為: 1410065 10000000,浮點(diǎn)數(shù)的精度和有效位 影響比較的正確性,如: float f1 = 7.123456789; float f2 = 7.123456785; if ( f1=f2 ) cout“f1 equal to f2n”; float f = 1.0/3.0; double d = 1.0/3.0; if ( g=d ) cout“g not equal to dn”; 結(jié)果為: f1 equals to f2 g not equals to d,浮點(diǎn)數(shù)計(jì)算的近似性 使精確性比較失敗,如: double d1 = 123456789.9*9; double d2 = 1111111109.1; if ( d1!=d2 ) cout “Not samen” ; else cout “Samen” ; if ( abs ( d1-d2 ) 1e-05 ) cout “Samen” ; else cout “Not samen” ; 結(jié)果為: Not same Same,3. 相容類型轉(zhuǎn)換 ( Cast Compatible Type ),隱式轉(zhuǎn)換:整型和浮點(diǎn)型都是數(shù)值型,所以它們是相容類型指針與整型不相容,如: 7.0 / 3 = 7.0 / 3.0 /將隱式轉(zhuǎn)換成浮點(diǎn) = 2.33333333 int a = 9; int* ap = 3 + ap /錯(cuò),從表達(dá)能力弱的類型到強(qiáng)的類型的轉(zhuǎn)換 是安全的,反之,會(huì)引起精度丟失如: float f = 7.0/3; / doublefloat int a = 7.0/3; / doubleint cout.precision(9); cout fixed 7.0/3 “n” ; cout f “n” a “n” ; 結(jié)果為: 2.333333333 2.333333254 2,可以用顯式轉(zhuǎn)換的方法,人為控制運(yùn)算 在一定的數(shù)據(jù)類型下工作,如: double d = sqrt ( 123456.0 ) ; int a = static_cast(d) * 8 + 5; int b = d * 8 + 5; / 隱式轉(zhuǎn)換為浮點(diǎn) couta“n”b“n”; 結(jié)果為: 2813 2815,4. 關(guān)系與邏輯操作 (Relations & Logic Operations ),=與=的區(qū)別 int x = 9; if ( x = 0 ) cout “test 1 okn” ; if ( x = 5 ) cout “test 2 okn” ; if ( x = 0 ) cout “test 3 okn” ; 結(jié)果為: test 2 ok,!=是操作符,=!不是操作符 int x = 3; if ( x!=9 ) cout “not 9n” ; if ( x=!9 ) cout “impossiblen” ; 條件表達(dá)式(x!=0)與(x)等同 int x = 3; if ( x != 0 ) cout x ; if ( x ) cout x ;,不等式連寫(xiě)的錯(cuò)誤: int a = -1, b = 0, c = 1; if ( abc ) cout “ok1n” ; if ( ab 結(jié)果為: ok2,短路求值的妙用: 避免除0的惡果 if ( b ,5. 位操作( Bit Operations ),左移操作 將整數(shù)最高位擠掉,在右端補(bǔ)0。如: int a = 12; / a為:00000000000000000000000000001100 a = a1; / a為:00000000000000000000000000011000,右移操作 在整數(shù)的高位擠一個(gè)0或1進(jìn)去(有符號(hào)數(shù)擠符號(hào)位,無(wú)符號(hào)數(shù)擠 ),而整數(shù)最低位被擠掉。如: short int a = -2; / 1111111111111110 a = a1; / a=-1 即1111111111111111 unsigned short int b = 65535; / 1111111111111111 b = b1; / b=32767即0111111111111111,位與操作 結(jié)果為:( 比較 & 與 & 的區(qū)別 ) 4 1,位與操作 | 將兩個(gè)操作數(shù)每一位做或操作,如: int a = 12; / a為: 00000000000000000000000000001100 int b = 6; / b為: 00000000000000000000000000000110 / a | b為: 00000000000000000000000000001110 int cbit = a | b; int clogic = a | b; cout cbit “n” clogic “n” ; 結(jié)果為:( 比較 | 與 | 的區(qū)別 ) 14 1,.增量操作(Increment Operations),前增量與后增量: 操作數(shù)為左值才能做增量操作 const int d = 8 ; d+ ; / 錯(cuò): d不是左值 3+ ; / 錯(cuò): 3不是左值 int a = 3, x = 3, b, c ; b = +a ; / a的前增量操作,使b 為4 c = x+ ; / x的后增量操作,使c 為 5 a+ -= 2 ; / 錯(cuò): a+不是左值 +a += 5; / ok: +a 是左值且a最后為11 +a+; / 錯(cuò): 先做a+,而a+不是左值,編譯的貪吃特征: int a = 3, b = 5, c; c = a + b ; /錯(cuò): 理解為a+ b c = a + b; /ok: a+ +b c = a + b; /錯(cuò): 理解為a+ +b c = a + b; /錯(cuò): 理解為a+ + +b,指針的增量操作: char s110, s2 = “hello” ; char *p1 = s1, *p2 = s2; while ( *p1+ = *p2+ ) ; 等價(jià)于下列操作序列: while ( *p2 ) *p1 = *p2 ; p1+ ; p2+ ; *p1 = 0 ;,7. 表達(dá)式副作用 ( Expressions Side Effects ),表達(dá)式的值 由操作數(shù)和操作符決定. 操作符決定對(duì)操作數(shù)施加的操作 操作的先后由優(yōu)先級(jí)和結(jié)合性作主 訪問(wèn)操作數(shù)的先后,語(yǔ)言沒(méi)有明確規(guī)定 表達(dá)式的副作用 表達(dá)式的值因?yàn)樵L問(wèn)操作數(shù)先后順序不同而不同所引起,使結(jié)合律失效 int a = 3, b = 5 ; c = a*b + +b; d = +b + a*b; / c與d不同 /c為21,d 為24 或反之 使括號(hào)失效 int a = 3 , b = 5 ; int c = +b * ( a+b ) ; /可能為54,副作用的根源 表達(dá)式中,多于一個(gè)的實(shí)體值發(fā)生改變 int a = 3, b = 5 ; c = a*b + +b ; / c和b改變 此時(shí),若其中一個(gè)實(shí)體被訪問(wèn)兩次以上,則副作用可能發(fā)生 a = ( b=25 ) += 5 ; / a和b改變,但都被訪問(wèn)1次 a = ( b=25 ) + b ; / 副作用: a,b改變,b被訪問(wèn)2次,消除副作用分開(kāi)語(yǔ)句寫(xiě),如: c = a*b + +b ; 可以寫(xiě)成: c = b + a*b ; b+ ; 或者 b+ ; c = b + a*b ;,C+程序設(shè)計(jì)教程(第二版),第五章 函數(shù)機(jī)制 Chapter 5 Function Mechanism,清華大學(xué)出版社 錢(qián) 能,函數(shù) C+的函數(shù)是完成既定任務(wù)的功能(過(guò)程)體,它涵蓋了數(shù)學(xué)函數(shù)和一般過(guò)程所以基于過(guò)程編程本質(zhì)上就是基于函數(shù)編程 函數(shù)機(jī)制 一是指程序運(yùn)行過(guò)程中對(duì)函數(shù)調(diào)用的數(shù)據(jù)管理和處理過(guò)程 二是指編程中函數(shù)的使用規(guī)范它包括函數(shù)參數(shù)的屬性和傳遞規(guī)則,函數(shù)返回類型的匹配與審查,函數(shù)名字的識(shí)別原則,函數(shù)體效率的選擇,函數(shù)體中數(shù)據(jù)的訪問(wèn)權(quán)限等,第五章內(nèi)容,函數(shù)性質(zhì)( Function Character ) 指針參數(shù) ( Pointer Parameters ) 棧機(jī)制 ( Stack Mechanism ) 函數(shù)指針 ( Function

溫馨提示

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

評(píng)論

0/150

提交評(píng)論