C2B2B程序設(shè)計(jì)(part1).ppt_第1頁
C2B2B程序設(shè)計(jì)(part1).ppt_第2頁
C2B2B程序設(shè)計(jì)(part1).ppt_第3頁
C2B2B程序設(shè)計(jì)(part1).ppt_第4頁
C2B2B程序設(shè)計(jì)(part1).ppt_第5頁
已閱讀5頁,還剩86頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、C+程序設(shè)計(jì)(part 1),南京大學(xué)軟件學(xué)院鄭滔 Tel: 506 Room: 623,Ole-Johan Dahl Kristen Nygaard,Norwegian computer scientist Turing Award in 2001 http:/heim.ifi.uio.no/olejohan/ http:/heim.ifi.uio.no/kristen/,Father of Simula67 Father of OO programming,E.W.Dijkstra Niklaus Wirth,Swiss computer scientist Turing Award in

2、1994 http:/www.inf.ethz.ch/personal/wirth/,Design PASCAL、Modula2、Oberon,Netherland computer scientist Chair of Computer Sciences at the University of Texas at Austin from 1984 until 2000. Turing Award in1972 /users/EWD/,“A Case against the GO TO Statement” Algol 68,Dennis Ritc

3、hie Ken Thompson,American computer scientist Turing Award in 1983 (工程師獲獎(jiǎng)) http:/cm.bell- http:/plan9.bell-,Father of C Co-inventing Unix,Bjarne Stroustrup,Ph.D, University of Aarhus, Denmark College of Engineering Chair in Computer Science Professor at Texas A typedef int INT ; C+是強(qiáng)類型語言 要求程序設(shè)計(jì)者在使用之前

4、對(duì)數(shù)據(jù)的類型進(jìn)行聲明,表達(dá)式,操作數(shù)、操作符和標(biāo)點(diǎn)符號(hào)組成的序列,表示一個(gè)計(jì)算過程 優(yōu)先級(jí)a+b*c 結(jié)合性a+b-c 求值次序(a+b)*(a-b)與編譯系統(tǒng)有關(guān) 類型轉(zhuǎn)換約定 int x=10; float y=2.0; x*y 表達(dá)式種類 算術(shù)表達(dá)式 關(guān)系和邏輯表達(dá)式 賦值表達(dá)式 逗號(hào)表達(dá)式 字位運(yùn)算符表達(dá)式 操作符可重載,表達(dá)式,計(jì)算與類型 相同類型的兩個(gè)操作數(shù)運(yùn)算后,其結(jié)果仍然為該類型的值 類型對(duì)計(jì)算的限制 類型具有取值范圍,超出取值范圍的值沒有意義 混合類型計(jì)算和類型轉(zhuǎn)換 轉(zhuǎn)換總是朝表達(dá)能力更強(qiáng)的方向,并且轉(zhuǎn)換總是逐個(gè)運(yùn)算符進(jìn)行 自動(dòng)轉(zhuǎn)換(隱式類型轉(zhuǎn)換 coersion) 顯式轉(zhuǎn)換

5、(強(qiáng)制類型轉(zhuǎn)換 casting),表達(dá)式,賦值表達(dá)式 左值右值表達(dá)式 左值:可以出現(xiàn)在賦值表達(dá)式左部的表達(dá)式, 具有存放數(shù)據(jù)的空間 類型不同時(shí),先計(jì)算右值表達(dá)式的值,再轉(zhuǎn)換為左值類型,然后賦值 算術(shù)表達(dá)式 增量和減量操作符 前增量(前減量) +a ( -a ) 前增量的結(jié)果是左值 后增量(后減量) a+ ( a- ) 提高編譯結(jié)果的執(zhí)行效率,表達(dá)式,條件運(yùn)算符表達(dá)式 ? : 唯一的三目運(yùn)算符 只計(jì)算一個(gè)運(yùn)算分量 如果 和的值類型相同,且均為左值,則該條件運(yùn)算符表達(dá)式為左值表達(dá)式 可嵌套 sign(x) x 0? 1: x = 0? 0 : -1 就近原則,表達(dá)式,逗號(hào)表達(dá)式 , 的值作為該逗號(hào)

6、表達(dá)式的值 int a, b, c; d = (a = 1, b = a+2, c = b+3); cout 為左值,則該逗號(hào)表達(dá)式為左值,表達(dá)式,字位運(yùn)算符表達(dá)式 對(duì)整型數(shù)二進(jìn)制位(bit)的操作,將整型數(shù)看作二進(jìn)制序列 取反 、與 c = a*b + +b; 求值次序使交換率失去作用 int a=3; c = a+ * +a; 副作用的危害 破壞了可移植性 降低了程序的可讀性 消除副作用,語句,表達(dá)式語句 IO語句 cin、cout iostream.h 、可重載 控制流語句 順序、選擇、重復(fù),iostream,stdio.h,語句,switch switch 后必須是整型表達(dá)式,case

7、 后必須是整型常量表達(dá)式 值各不相同 各個(gè)case(包括default)出現(xiàn)的次序可以任意 case 僅起標(biāo)號(hào)作用,不改變執(zhí)行順序 break 多個(gè)case可以公用一組語句 通常可以和if語句配合使用,enum,函數(shù),原則 函數(shù)定義不允許嵌套 先定義后使用 函數(shù)的執(zhí)行機(jī)制 建立被調(diào)用函數(shù)的??臻g 保存調(diào)用函數(shù)的運(yùn)行狀態(tài)和返回地址 參數(shù)傳遞 值傳遞 (call by value) 引用傳遞 (call by reference) 將控制轉(zhuǎn)交被調(diào)函數(shù),Call by name Call by value-result,Runtime Environment,函數(shù),函數(shù)原型 遵循先定義后使用原則 自

8、由安排函數(shù)定義的位置 標(biāo)準(zhǔn)庫函數(shù)的函數(shù)原型都在頭文件(.h)中提供,用#include 指令包含這些原型文件 用戶自定義的函數(shù)必須在源代碼中說明函數(shù)原型 函數(shù)原型是一條語句 函數(shù)原型不必含有參數(shù)的名字,只需含有參數(shù)的類型 函數(shù)原型必須和函數(shù)定義在返回值類型、函數(shù)名和參數(shù)表完全一致,編譯器在遇到函數(shù)調(diào)用時(shí),需檢查函數(shù)原型,函數(shù),函數(shù)重載 原則 一組重載函數(shù),相互間至少在參數(shù)個(gè)數(shù)、類型或順序上有所不同 返回值類型不作為區(qū)別重載函數(shù)的依據(jù) 匹配重載函數(shù)的順序 嚴(yán)格 內(nèi)部轉(zhuǎn)換 用戶定義的轉(zhuǎn)換 void f(long);void f(double); f(10); ambiguous,Name mang

9、ling extern “C”,函數(shù),帶默認(rèn)參數(shù)的函數(shù) 默認(rèn)參數(shù)的聲明 函數(shù)原型中給出 先定義的函數(shù)中給出 默認(rèn)參數(shù)的順序規(guī)定 從右到左,中間不能間斷 默認(rèn)參數(shù)與函數(shù)重載 void f(int); void f(int, int=2); ambiguous,函數(shù),內(nèi)聯(lián)函數(shù)inline 目的 提高程序的可讀性 提高程序的運(yùn)行效率 對(duì)象 使用頻率高的小段代碼 實(shí)現(xiàn)方法 編譯系統(tǒng)將為 inline 函數(shù)創(chuàng)建一段代碼,在每次調(diào)用時(shí),用相應(yīng)的代碼替換 限制 非遞歸 由編譯系統(tǒng)控制,函數(shù),明智地運(yùn)用inlining(Use inlining judiciously) 缺點(diǎn) 增大目標(biāo)代碼(object co

10、de) 病態(tài)的換頁(thrashing) 降低指令快取裝置的命中率(instruction cache hit rate) 只是對(duì)編譯系統(tǒng)的提示 Big/complex/ Function pointer Compiler (outlined) static function recompile/link vs rebuild,作用域與生命期,程序的局部性原則 程序的內(nèi)存結(jié)構(gòu) Code、Global data、Stack、Heap Scope 全局變量 static 局部變量 靜態(tài)局部變量 static(生命期),程序結(jié)構(gòu),程序結(jié)構(gòu) 邏輯結(jié)構(gòu) 物理結(jié)構(gòu) 多個(gè)源文件組成 只能其中一個(gè) 文件含有主

11、函數(shù) 工程文件 外部函數(shù) 外部變量 extern,main,f1,f2,fn,cpp1,cpp2,cpp3,obj1,obj2,objn,Compiler,exe,Lib,Linker,程序結(jié)構(gòu),Static global variable static 防止名沖突 值可靠 Static function 限制使用 對(duì)函數(shù)定義的補(bǔ)充static Constant 缺省為 static 開放 extern,程序結(jié)構(gòu),標(biāo)識(shí)符在程序中有效的范圍 程序級(jí) 外部量、外部函數(shù) 文件級(jí) 靜態(tài)函數(shù)、靜態(tài)全局量 函數(shù)級(jí) 標(biāo)號(hào)、形式參數(shù)、局部量 塊級(jí) 可見性 分析在某一位置標(biāo)識(shí)符的有效性 : 引用全局變量 nam

12、espace using namespce,int global;/程序級(jí) void f() /程序級(jí) static float f; /文件級(jí) static void g() /文件級(jí) void main() int x; /函數(shù)級(jí) if (x0) float x=0; /塊級(jí) ,多文件結(jié)構(gòu),Header File 聲明的部分 宏定義 包含指令 類型聲明 函數(shù)聲明 內(nèi)聯(lián)函數(shù) 常量定義 變量聲明,編譯預(yù)處理,包含 #include “” 宏定義 define 字符串字符串 undef宏名字 帶參數(shù)的宏 條件編譯 #if#else#elif #endif#ifdef#ifndef 設(shè)定編譯器狀態(tài)

13、 #pragmawarning(disable:4101) once,數(shù)組,特征 相同數(shù)據(jù)類型 有序 連續(xù)存儲(chǔ)0n-1 一維數(shù)組 類型定義 函數(shù)參數(shù) 僅傳遞地址 元素個(gè)數(shù)需通過參數(shù)顯示給出,不能通過sizeof取得 字符串,數(shù)組,多維數(shù)組 定義T Ac1c2 存儲(chǔ)組織 參數(shù)傳遞 只能缺省第一維 降維處理,typedef T A1c2; A1 Ac1;,數(shù)組,#include int maximum(int grade, int num) int max = 0; for (int k=0;k max) max = gradek; return max; void main() int A24

14、= 68,69,70,71 , 85,86,87,89; cout “the max grade is” maximum( ); ,sizeof(A)/sizeof(A00),maximum(,A0,2*4,結(jié)構(gòu)和聯(lián)合,struct 賦值同類型 align 參數(shù)傳遞 union 共享存儲(chǔ)空間,_declspec(align(8),結(jié)構(gòu)和聯(lián)合,例:定義一個(gè)能存儲(chǔ)100個(gè)圖形的數(shù)組變量,其中的圖形可以是:直線、矩形、圓。 FIGURE figures100; struct Line double x1, x2, y1, y2; struct Rectangle double left, top,

15、right, bottom; struct Circle double x, y, r; ,enum FIGURE_TYPE LINE, RECTANGLE, CIRCLE; struct Line struct Rectangle FIGURE_TYPE t ; FIGURE_TYPE t; double x1, x2, y1, y2; double left, top, right, bottom; ; ; struct Circle FIGURE_TYPE t; double x, y, r; ; union FIGURE FIGURE_TYPE t; Line line; Rectan

16、gle rect; Circle circle; FIGURE figures100;,結(jié)構(gòu)和聯(lián)合,void draw(FIGURE figure)多態(tài)性 switch ( figure.t ) case LINE: draw_line(figuresi.line); break; case RECTANGLE: draw_rectangle(figuresi.rect); break; case CIRCLE:draw_circle(figuresi.circle); break; void main() InputF( figures, 100 ); for (int i=0;i100;i

17、+) draw(figuresi); ,void input (Figure fig, int size) int t; for (int k=0; k t; switch (t) case LINE: figk.type = LINE; cin figk.line.x1 figi.line.y1 figk.line.x2 figi.line.y2; break; case RECTANGLE: case CIRCLE: . ,指針,處理地址信息、動(dòng)態(tài)數(shù)據(jù) 指針定義與基本操作 指針與函數(shù) 指針與數(shù)組 指針與結(jié)構(gòu) 多級(jí)指針 動(dòng)態(tài)變量,指針定義與基本操作,定義 格式 * int *p; /p為一個(gè)

18、指針變量 語義 指針變量的值是另外一個(gè)變量的內(nèi)存地址。 如:上述指針變量 p 的值為某一整型變量的內(nèi)存地址。 說明 當(dāng)在一個(gè)定義(或聲明)中定義(或聲明)多個(gè)指針變量時(shí),每個(gè)指針變量前都要有* int *p,*q; /p和q均為指針變量 int *p, q; /p為指針變量,q為整型變量,指針定義與基本操作,也可以先用 typedef 定義一個(gè)指針類型,然后再用該指針類型定義指針變量,如: typedef int* Pointer; Pointer p,q; / p和q均為指針變量 取地址操作符(,9,x,0X5A12,p,0X7B77,0X5A12,1000,指針定義與基本操作,當(dāng)一個(gè)指針變

19、量的值為另一個(gè)變量的地址時(shí),通常也說成:該指針指向另一個(gè)變量,如:指針變量p指向整型變量x,可用下面的圖示法表示: Pointer literal (0 / NULL) 不指向任何對(duì)象 指針變量的初始化 區(qū)別 * 的三種用途 乘法運(yùn)算符 指針定義(或聲明)符 取指針?biāo)赶虻闹担ㄩg接訪問),p,1000,x,指針定義與基本操作,指針的運(yùn)算 賦值 對(duì)于一個(gè)指針變量,可以把一個(gè)同類型的指針值賦給它。 int x; double d; int *p, *q; p = ,指針定義與基本操作,加上或減去一個(gè)整型值 一個(gè)指針值可以與一個(gè)整型值進(jìn)行加或減運(yùn)算,結(jié)果為同類型的指針值。 int x; int *p

20、; p = p + 1; p = /q的值加8 ( sizeof(double) ),指針定義與基本操作,同類型的指針值相減 同類型的指針值可以相減,結(jié)果為整型值。 int *p, *q; int offset; offset = p - q; int a10; int *p, *q,offset; p = /結(jié)果值為 3,指針定義與基本操作,兩個(gè)同類型的指針值比較 兩個(gè)同類型的指針值可以進(jìn)行等于(=)和不等于(!=)比較,一般不進(jìn)行大于(,=)和小于(,=)比較。 指針值的輸出 int x=1; int *p= /輸出p指向的字符,即:A cout (void *)p /輸出p的值,指針定義

21、與基本操作,void * 只存放地址信息 void *p; 任何其它類型的指針均可以賦值給void指針 void *any_pointer; int x; double y; any_pointer = 不能進(jìn)行指針運(yùn)算和間接引用(*),若要進(jìn)行指針運(yùn)算或間接引用,必須作強(qiáng)制類型轉(zhuǎn)換。 *any_pointer /error *(int *)any_pointer) /OK *(double *)any_pointer) /OK,指針定義與基本操作,例:將某指針?biāo)赶虻囊粔K內(nèi)存清零。 void memset ( void *pointer, unsigned size) char *p = (

22、char *)pointer; for (int k=0;ksize;k+) *p+ = 0; void memset(void *, int, unsigned); void memcpy(void *, void *, unsigned size);,指針定義與基本操作,常量指針與指針常量 常量指針const * const int x=0; int y; const int *p; /p為指向常量的指針(常量指針) int *q; p = /OK! Why?,constant,P,variable,x(常量),const_cast,指針定義與基本操作,指針常量 * const 必須在定義

23、時(shí)初始化 int x, y; int * const p = /Ok,variable,P(常量),constant,x,const int * const p; ?,指針與函數(shù),指針作為行參 提高傳輸效率 函數(shù)副作用 常量指針 Function Pointer 指向函數(shù)的指針,double f(int x) int g() void main() double (*fp) (int); / typedef double (*FP)(int); / FP fp; fp = f; fp = /Error ,函數(shù)指針,函數(shù)參數(shù) 編寫函數(shù),使其能計(jì)算任意一元函數(shù)在某區(qū)間上的定積分 #include

24、double integrate(double (*f)(double),double a, double b) (*f)(x), a , b, double my_func(double x) void main() integrate(sin,0,1); integrate(cos,1,2); integrate(my_func,1,10); ,示例,sort,int scompare(const void *elem1, const void *elem2) TStudent *p1 = (TStudent *)elem1; TStudent *p2 = (TStudent *)elem

25、2; return strcmp(p1-name,p2-name); ,void MySort(void *base, unsigned num, unsigned width, int (*compare)(const void *elem1, const void *elem2) char *A = (char *)base; char *tmp = (char *)malloc(width); for (unsigned i=1;i0) /Aj Aj+1) memcpy(tmp,A+j*width,width); /int tmp = Aj; memcpy(A+j*width, A+(j

26、+1)*width,width);/Aj = Aj+1; memcpy(A+(j+1)*width,tmp,width); /Aj+1 = tmp; free(tmp); ,TStudent student = ; int num = sizeof(student)/sizeof(student0); int width = sizeof(student0); MySort(student,num,width,icompare);,指針與數(shù)組,數(shù)組元素操作 下標(biāo)表達(dá)式 訪問效率 數(shù)組元素的指針表示法 一維數(shù)組 多維數(shù)組,int b2010; / typedef int A10; A b20;

27、int *q; q = bij *(*(b+i)+j) *(*(p+i)+j) pij,int a10; int *p; int i; p = /數(shù)組名表示其首元素的地址,是常量! (int *const) ai *(a+i) *(p+i) pi char s28 = “C+”, “PASCAL”, “FORTRAN”;,s1,C + + 0,P A S C A L 0,F O R T R A N 0,s2,指針數(shù)組,函數(shù)main的參數(shù) 帶參數(shù)和返回值的函數(shù)main的原型為 int main(int argc, char *argv, char *env) argc: 參數(shù)個(gè)數(shù) argv: 命

28、令行參數(shù) env: 環(huán)境參數(shù)。 示例 c: copy file1 file2 操作系統(tǒng)將啟動(dòng)copy程序,調(diào)用其main函數(shù), argc : 3 argv: copy、 file1、 file2 env:,#include #include #include void MyFormat(char *lpszFormat, .) va_list marker; va_start(marker,lpszFormat); for (int i=0;i4;i+) cout va_arg(marker,double) endl; va_end(marker); void main() MyFormat(

29、“test %f %f %f %f test_end,1.1,2.2,3.3,4.4); ,/platform : x86 typedef char * va_list; #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) /pp為指針變量,指向另一個(gè)指針 /變量(int *) int x = 2, y = 8; int *p p = 指針變量必須初始化或賦值,否則將會(huì)導(dǎo)致運(yùn)行時(shí)刻的嚴(yán)重錯(cuò)誤,多級(jí)指針,編寫一個(gè)函數(shù),交換兩個(gè)字符串 void swap(char *p1, char *p2) char *tmp = *p1; *p1 = *

30、p2; *p2 = tmp; void main() char p18 ; strcpy(p2, abcd“); char p28 ; strcpy(p2, 1234“); cout p1 p2 endl; swap( ,動(dòng)態(tài)變量,動(dòng)態(tài)變量 編譯時(shí)刻無法確定 在程序運(yùn)行時(shí)刻,動(dòng)態(tài)產(chǎn)生、消亡 通過指向動(dòng)態(tài)變量的指針變量來實(shí)現(xiàn)的 分配在程序的堆區(qū)(heap) 局部變量也是動(dòng)態(tài)產(chǎn)生、消亡,但在程序運(yùn)行前,編譯程序已經(jīng)知道它們的存在 動(dòng)態(tài)變量與C+中的靜態(tài)(static)變量屬于不同的范疇,動(dòng)態(tài)變量是程序設(shè)計(jì)中的概念(與語言無關(guān)),static是C+語言中的概念。,動(dòng)態(tài)變量,動(dòng)態(tài)變量的產(chǎn)生 new n

31、ew ,int *p = new int10; int (*p2)5 = (int (*)5)p; for (int i=0;i10;i+) pi = i+1; for (int j=0;j2;j+) for (int k=0;k5;k+) cout p2jk ; cout endl; ,typedef int i5Array 5; void main() i5Array *p = new i5Array 2; for (int j=0;j2;j+) for (int k=0;k5;k+) pjk = (j*5)+(k+1); ,動(dòng)態(tài)變量,動(dòng)態(tài)變量的產(chǎn)生 庫函數(shù) malloc void *ma

32、lloc(unsigned int size) int *p,*q; p = (int *)malloc(sizeof(int); /new int q = (int *)malloc(sizeof(int)*20); /new int20 new與malloc的區(qū)別 new自動(dòng)返回相應(yīng)類型的指針,malloc 要作強(qiáng)制類型轉(zhuǎn)換。 如果創(chuàng)建的是動(dòng)態(tài)對(duì)象,new 會(huì)去調(diào)用相應(yīng)類的構(gòu)造函數(shù),malloc 則否 new或malloc為動(dòng)態(tài)變量申請(qǐng)空間時(shí),必須在判斷申請(qǐng)的空間有效的情況下,才能使用,動(dòng)態(tài)變量,動(dòng)態(tài)變量的消亡 動(dòng)態(tài)變量不會(huì)自動(dòng)消亡,在程序運(yùn)行期間,如果不再需要某個(gè)動(dòng)態(tài)變量,應(yīng)顯式地使之消

33、亡,否則將造成 memory leak 用new 產(chǎn)生的動(dòng)態(tài)變量,用 delete 使之消亡; 用 malloc 產(chǎn)生的動(dòng)態(tài)變量,用 free 使之消亡 delete ,cookie,動(dòng)態(tài)變量的應(yīng)用,數(shù)據(jù)結(jié)構(gòu) 鏈表(單、雙)棧、隊(duì)列 樹、圖 結(jié)點(diǎn)的定義 struct NODE int content; NODE *next; ; NODE *head=NULL;,單鏈表,結(jié)點(diǎn)的插入 產(chǎn)生一個(gè)新結(jié)點(diǎn): NODE *p = new NODE; p-content = some_int_value; p-next = NULL; 如果鏈表為空 head = p; 插在表頭 p-next = head; head = p;,單鏈表,如果插在表尾 NODE *q = head; while (q-next ) q = q-next; q-next = p; 插在鏈表中某一個(gè)結(jié)點(diǎn)(a)的后面 NODE *q = head; while (q ,單鏈表,如果插在鏈表中某一個(gè)結(jié)點(diǎn)(a)的前面,則: NODE *q1=NULL, *q2=head; while (q2 ,guard node,單鏈表,結(jié)點(diǎn)的刪除 (假設(shè)要?jiǎng)h除的結(jié)點(diǎn)的值為a

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論