C-++-程序設計教程_第1頁
C-++-程序設計教程_第2頁
C-++-程序設計教程_第3頁
C-++-程序設計教程_第4頁
C-++-程序設計教程_第5頁
已閱讀5頁,還剩336頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、16:02:39,1,C+程序設計教程(第二版),第二章基本編程語句Chapter2BasicProgrammingStatements,清華大學出版社錢能,16:02:39,2,第二章內容,說明語句(DeclarativeStatements)條件語句(ConditionStatements)循環(huán)語句(LoopStatements)循環(huán)設計(LoopDesigns)輸入輸出語句(Input/OutputStatements)轉移語句(MoveStatements)再做循環(huán)設計(MoreLoopDesigns),16:02:39,3,1.說明語句(DeclarativeStatements),

2、數(shù)據(jù)說明:求解問題所使用的數(shù)據(jù)是什么性質,進行什么運算,表達范圍如何,必須預先說明說明方式:既要指明其名字,也要指明其是什么類型,還可以順便初始化如:inta;doubled=3.5;說明數(shù)據(jù)的另一個目的是創(chuàng)建一個所需大小的實體空間給該名字,以便存儲所用的數(shù)據(jù)值若數(shù)據(jù)名字沒有說明,使用其便是非法的,16:02:39,4,過程(函數(shù))說明:求解中需要通過函數(shù)調用來實施求解時,便要對函數(shù)的性質進行說明,說明其返回類型,參數(shù)類型,參數(shù)個數(shù)函數(shù)說明分函數(shù)聲明和函數(shù)定義兩種:函數(shù)聲明是說明函數(shù)的名字,函數(shù)的返回類型,以及函數(shù)的參數(shù)和個數(shù)如:doublearea(doublera);函數(shù)定義是在函數(shù)聲明的

3、基礎上,對整個實現(xiàn)過程進行詳細定義如:doublearea(doublera)returnra*ra*3.14;,16:02:39,5,調用函數(shù)就是使用函數(shù)名字,使用名字前必須清楚名字的性質,所以必須先對函數(shù)進行聲明運行程序中,會涉及到被調用函數(shù)的執(zhí)行,所以凡是被調用的函數(shù)都必須有函數(shù)定義,不管該定義在程序的什么位置如:doublesphere();/聲明intmain()doubleresult=sphere();/調用coutr;returnr*r*3.14;,16:02:39,6,.條件語句(ConditionStatements),if語句的兩種形態(tài):,語句1,條件,語句1,條件,語句

4、2,是,是,否,否,16:02:39,7,對應語句:if(ab)coutaendl;if(a=b)coutaendl;elsecoutb0)if(x50)cout”xisok.n”;elsecout0)if(x50)cout”O(jiān)Kn”;elsecout0)if(x50)cout”O(jiān)Kn”;elsecout”NOTOKn”;,16:02:39,9,條件表達式:對于if(x)a=327981;elseb=327981;可表示為:x?a=327981:b=327981;如果a和b為同類型,則還可以:(x?a:b)=327981;,16:02:39,10,switch多分支語句:switch(整數(shù)表達

5、式)casevalue1:語句1;break;casevalue2:語句2;break;default:語句n;等價于:if(整數(shù)表達式=value1)語句1;elseif(整數(shù)表達式=value2)語句2;else語句n;,16:02:39,11,雖然switch有等價的復合if表示,而且,分支判斷值只能是整數(shù),顯得應用范圍狹窄,但是switch在使用上的直觀和靈活形式,使得其仍具有編程價值.如:break可選,甚至case可以重疊:casevalue1:語句1;casevalue2:語句2;casev1:casev2:casev3:語句;,16:02:39,12,3.循環(huán)語句(LoopSt

6、atements),for循環(huán)結構:,16:02:39,13,對應語句為:for(inti=1;i=10;i+)cout”hello.n”;,循環(huán)初始狀態(tài),條件判斷,狀態(tài)修正,循環(huán)體,16:02:39,14,每次循環(huán)體執(zhí)行,都改變循環(huán)狀態(tài),直到條件不滿足而終止.如,設置求和的初始值,交給循環(huán)計算,完成循環(huán)后,輸出求和結果:intsum=0;for(inti=1;i=100;i+)sum=sum+i;coutsumendl;,循環(huán)開始,循環(huán)結束,16:02:39,15,因為并不是所有循環(huán)都有明顯的循環(huán)初始狀態(tài)和狀態(tài)修正的,所以,while循環(huán)是一種for循環(huán)的簡潔形式.如,同樣的求和:intsu

7、m=0,i=1;while(i=100)sum+=i+;coutsumendl;,循環(huán)開始,循環(huán)結束,16:02:39,16,4.循環(huán)設計(LoopDesigns),(1)簡單字符圖形的雙重循環(huán)MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM,16:02:39,17,分析方法:該圖形一共10行,每一行增加一個字符,所以,應循環(huán)10次,每次輸出一行,其循環(huán)模式為:for(inti=1;i=10;+i)輸出第i行(循環(huán))換行行iM個數(shù)111222333444.101010,16:02:39,18,for(inti=1;i=10;+i)f

8、or(intj=1;j=i;+j)cout”M”;coutendl;,16:02:39,19,(2)判斷素數(shù):(利用數(shù)學定律)mij假定ij,則i2ijmj2即i2mj2即imjboolisPrime(intm)doublesqm=sqrt(m*1.0);for(inti=2;i=sqm;+i)if(m%i=0)returnfalse;returntrue;,16:02:39,20,5.輸入輸出語句(Input/OutputStatements),標準輸出流:可以控制輸出格式cout3)3);/0falsecoutfixed12345.678;/12345.678000coutscientif

9、ic123456.678;/1.234568e+05,16:02:39,21,控制寬度和填充字符的操作是帶參數(shù)的,注意width(n)為一次性操作,即第二次顯示時將不再有效。默認為width(0),表示僅顯示數(shù)值。例如:cout.width(5);cout.fill(S);coutcoutsetw(6)setfill($)27endl;/輸出:$27,16:02:39,22,文件流的輸入出操作與標準輸入出基本相同,只是需要以一定方式打開和關閉如,將文件a.in打開,逐行讀入字符,輸出到文件a.out:ifstreamin(“a.in”);ofstreamout(“a.out”);for(str

10、ings;getline(in,s);)outsendl;其中文件流讀入操作總是伴隨著狀態(tài)返回,判斷狀態(tài)就可以確定文件是否正常讀入,如getline(in,s)當讀到文件尾時,便返回false,以使循環(huán)結束,16:02:39,23,.轉移語句(MoveStatements),break除了用在switch之外,主要的是用在終結本次循環(huán)for(inti;)for(;)/.if(i=1)break;/.a=1;/.,break跳到此處,16:02:39,24,continue一般是用條件判斷執(zhí)行的,通過反條件,可以免去continue的使用,所以,它用來構筑良好的程序風格for(intn=100;

11、n=200;+n)if(n%3=0)continue;coutnendl;免去continue的情形:for(intn=100;n=200;+n)if(n%3!=0)coutnendl;,16:02:39,25,goto的程序段除了系統(tǒng)跟蹤和架構困難外,閱讀也相對復雜:inta;gotoInit;Forward:a=a+1;Print:coutaendl;gotoDown;Init:a=1;gotoPrint;Down:if(a100)gotoForward;等價于:for(inti=1;i=100;+i)couti“n”;,16:02:39,26,break語句的可取之處:/用break語句

12、的代碼段boolflag=false;/用于做退出記號for(inti=1;i100;+i)for(intj=1;j100;+j)if(i*j=651)flag=true;break;else/.if(flag)break;/goto語句的代碼段for(inti=1;i100;+i)for(intj=1;j100;+j)if(i*j=651)gotoEnd;/.End:,16:02:39,27,7.再做循環(huán)設計(MoreLoopDesigns),邏輯判斷類的語句控制結構:for(所有可能情況)/可為多重循環(huán)if(條件1不滿足)continue;if(條件2不滿足)continue;/if(條件

13、n不滿足)continue;輸出所要的結果,16:02:39,28,百雞問題的例子:for(intc=1;c=13;+c)for(inth=1;h=18;+h)for(ints=1;s=96;+s)if(7*c+5*h+s/3-100)continue;if(c+h+s-100)continue;if(s%3)continue;coutCock:c,Hens:h,Chicks:100-c-h1e-6;+n)item*=(-1.0)*(2*n-3)/(2*n-1);sum+=item;coutPi=“setiosflags(ios:fixed)sum*4=,!,=,=,=,/錯,16:02:39

14、,36,.整型子類(Sub-intTypes),字符型:表示范圍:有符號:-128127無符號:0255輸出形式與整型數(shù)不同:inta=65;charb=65;couta“n”;coutb“n”;結果為:65A,16:02:39,37,枚舉型:自定義整數(shù)區(qū)間,甚至列舉單個整數(shù)值enumWeekMon,Tue,Wed,Thu,Fri,Sat,Sun;最大特點是可以給每個值指定一個在程序中直接使用的標記(枚舉符)編程中將其當作整數(shù)常量用如:inta=7;if(a=Sun)cout“Sundayn”;,16:02:39,38,布爾型:表示范圍僅含整數(shù)和1,也可以表示成true和false,相當于:e

15、numboolfalse,true;因為條件表達式、邏輯運算的結果都是或,所以,相當大數(shù)量的表達式的值與布爾型對應,16:02:39,39,3.浮點型(Floating-PointTypes),浮點數(shù)的內部表示:國際標準IEEE754浮點表示法,它與編程所用的浮點數(shù)字面量以及輸出的十進制浮點數(shù)之間有一個轉換關系浮點數(shù)的表示范圍:32位浮點數(shù)3.4103864位浮點數(shù)1.810308浮點數(shù)的操作:常規(guī)的加、減、乘、除等操作,16:02:39,40,4.C-串與string(C-stringcout*strendl;/顯示Hcoutstrendl;/顯示Hello,16:02:39,42,C-串不

16、能直接比較,因為字符指針的比較只是地址值的比較而不是C-串的字典序比較:cout(“join”=”join”?”:”not“)”equaln”;/字面值比較char*str1=”good”;char*str2=”good”;cout(str1=str2?”:”not“)”equaln”;/字符指針比較charbuffer16=”Hello”;charbuffer26=”Hello”;cout(buffer1=buffer2?”:”not“)”equaln”;/字符數(shù)組比較結果:notequalnotequalnotequal,16:02:39,43,不得不配備專門操作C-串的庫函數(shù):strcp

17、y(s1,s2);/從s2拷貝到s1strcmp(s1,s2);/比較s1與s2strcat(s1,s2);/連接s2到s1strrev(s);/將s倒排strset(s,c);/將s全置為cstrstr(s,“ell”);/查找s中的子串strchr(s,c);/查找s中的字符等等,16:02:39,44,但字符指針操作C-串的安全性受到質疑:char*str1;char*str2=newchar5;strcpy(str2,”ugly”);strcpy(str1,str2);/錯:str1沒有空間可儲strcpy(str2,”Hello”);/錯:str2空間不夠大str2=”Hello”;

18、/錯:原來的”ugly”空間脫鉤,導致內存泄漏根源:復制操作須以足夠的目的地空間為前提,而所有C-串操作的空間調配都是人為安排的,C-串庫函數(shù)一概不管,16:02:39,45,類串string串類自定義串對應字符指針的C-串操作:stringa,s1=Hello;strings2=123;a=s1;/copycout(a=s1?:not)equaln;/comparecouta+s2endl;/concatenatereverse(a.begin(),a.end();coutaendl;/reversecouta.replace(0,9,9,c)endl;/setcout(s1.find(el

19、l)!=-1?:not)foundn;/findstringcout(s1.find(c)!=-1?:not)的讀入方式總是將前導的空格(所謂空格,即包括空格、回車、水平或垂直制表符等)濾掉,將單詞讀入,在遇到空格時結束本次輸入getline總是將行末的回車符濾掉,將其整行輸入對字串”Hello,Howareyou?”的兩種輸入方式for(strings;cins;)couts”“;coutendl;strings;getline(cin,s);coutsa;sum+=a);coutsum“n”;,16:02:39,48,5.數(shù)組(Arrays),數(shù)組是同類元素的集合,它的元素排列在連續(xù)的空間

20、中,按下標來標記描述數(shù)組必須給出元素類型,元素個數(shù)元素個數(shù)必須在編程時確定,任何變量都不允許intaa;/表示inta97;intn=100;intan;/錯:元素個數(shù)必須預知constintn=100;intan;/okinta;/錯:無元素個數(shù)inta=1,2,3,4,5;/ok:通過初始化確定元素個數(shù),16:02:39,49,數(shù)組初始化可選,但須遵循語法無初始化的數(shù)組按規(guī)定取默認值intarray15=1,2,3,4,5,6;/錯:初始值個數(shù)超元素個數(shù)intarray25=1,2,3,4;/錯:不能以逗號方式省略intarray35=1,2,3,;/錯:同上intarray45=;/錯:

21、初始值不能為空intarray55=1,2,3;/ok:后面元素取0intarray65=0;/ok:元素全為0intarray75;/ok:元素值不確定inta35=1,2,3,4,5,2,3,4,5,6,3,4,5,6,7;,16:02:39,50,數(shù)組有諸多缺陷,造成編程艱難和不安全inta5=1,2,3,4,5,c5;intb5=a;/錯:無法拷貝創(chuàng)建c=a;/錯:無法整體拷貝和局部拷貝a8=10;/錯:無法動態(tài)擴容和隨意增減元素for(inti=0;i=5;+i)/錯:無法防范下標溢出ai=i+1;if(a=c)a0=2;/錯:不可比較inta5=1;/初始化呆板,無法獲得全初值,1

22、6:02:39,51,二維數(shù)組的初始化,下標訪問及輸出intarray123=1,2,3,4,5;intarray223=1,2,4;coutarray1:;for(inti=0;i2;+i)for(intj=0;j3;+j)coutarray1ij,;coutnarray2:;for(inti=0;i2;+i)for(intj=0;j3;+j)coutarray2ij,;coutn;結果為:array1:1,2,3,4,5,0,array2:1,2,0,4,0,0,16:02:39,52,.向量(vector),向量與數(shù)組的共同特征是元素的排列在邏輯上是線性序列結構,可以用下標進行訪問向量可

23、以按需創(chuàng)建,拷貝創(chuàng)建,局部拷貝創(chuàng)建,異類拷貝和創(chuàng)建靈活的初始化隨意擴容和元素增減可通過異常來進行下標溢出追蹤和處理可比較等等,16:02:39,53,intn=10;intt5=1,2,3,4,5;vectora(n);/按需創(chuàng)建vectorb(10,1);/元素賦全,靈活的初始化vectorc(b);/整體拷貝創(chuàng)建vectorf(t,t+5);/異類拷貝創(chuàng)建vectord(b.begin(),b.begin()+3);/局部拷貝創(chuàng)建d為b的前個元素a.assign(100);/動態(tài)擴容至100個元素,16:02:39,54,向量常用操作a.assign(b.begin(),b.begin()

24、+3);/b的前3個元素賦給aa.assign(4,2);/a向量含4個元素,全初始化為2intx=a.back();/a的最后一個元素賦給變量xa.clear();/a向量清空(不再有元素)if(a.empty()cout”empty”;/a判空操作inty=a.front();/a的第一個元素賦給變量ya.pop_back();/刪除a的最后一個元素a.push_back(5);/a最后插入一個元素,其值為5a.resize(10);/a元素個數(shù)調至10。多刪少補,其值隨機a.resize(10,2);/a元素個數(shù)調至10。多刪少補,新添元素初值為2if(a=b)cout34.5iAddr

25、:1245064=1107951616int:100float:1.4013e-43,16:02:39,58,指針加減整數(shù)的操作表示空間位置上的挪動但是挪動的字節(jié)數(shù)與其數(shù)據(jù)類型相關:對float指針加6實際增加了24個字節(jié)對longint指針加5實際增加了20個字節(jié)對char指針減7實際減少了7個字節(jié)對double指針減2實際減少了16個字節(jié),16:02:39,59,數(shù)組名本身就是表示元素集合的首地址可以將數(shù)組名賦給指針inta3;for(inti=0;i3;+i)ai=i*2;for(int*iP=a;iPa+3;iP+=1)coutiP“:”*iP“n”;結果為:1245036:01245

26、040:21245044:4,16:02:39,60,指針限定constinta=78;intb=10;intc=18;constint*ip=/ok,16:02:39,61,引用必須初始化,因為引用總是附屬于某個實體intsomeInt=5;int結果為:8引用多用在函數(shù)參數(shù)的傳遞上,16:02:39,62,C+程序設計教程(第二版),第四章計算表達Chapter4ComputationalExpressing,清華大學出版社錢能,16:02:39,63,計算表達:表達計算使用一系列操作,它依賴于特定語言的操作符功能,關乎數(shù)據(jù)類型的內在特性,故計算表達目的在于深入剖析數(shù)據(jù)類型對于編程的影響,

27、從而準確使用操作符學習方法:1.掌握操作符的功能和相互關系(優(yōu)先級和結合性)2.針對內部數(shù)據(jù)類型,對一些典型的操作中的典型問題留下深刻印象,16:02:39,64,第四章內容,名詞解釋(NameExplainations)算術運算問題(ArithmeticProblems)相容類型的轉換(CastCampatibleType)關系與邏輯操作(Relation/先做x+結合性:同級操作符的執(zhí)行順序的規(guī)定性,如:a=b=6;/先做b=6,16:02:39,67,.算術運算問題(ArithmeticProblems),整型數(shù)表示范圍有限,如:不能用整型變量累計的一般循環(huán)方法來解:intsum=0;f

28、or(inti=1;i=10000;+i)sum+=i;coutsum“n”;,16:02:39,68,整型數(shù)的周而復始性,如:unsignedinta=2000000000;unsignedintb=3000000000;couta+b“n”;結果為:705032704超過表示范圍的整型數(shù)不是報錯,而是表示成一個去掉進位后的余數(shù),16:02:39,69,中間結果溢出導致計算錯誤,如:inta=100000;intb=100000;intc=1000;couta*b/cn;couta*(b/c)n;結果為:141006510000000,16:02:39,70,浮點數(shù)的精度和有效位影響比較的正

29、確性,如:floatf1=7.123456789;floatf2=7.123456785;if(f1=f2)cout“f1equaltof2n”;floatf=1.0/3.0;doubled=1.0/3.0;if(g=d)cout“gnotequaltodn”;結果為:f1equalstof2gnotequalstod,16:02:39,71,浮點數(shù)計算的近似性使精確性比較失敗,如:doubled1=123456789.9*9;doubled2=1111111109.1;if(d1!=d2)cout“Notsamen”;elsecout“Samen”;if(abs(d1-d2)1e-05)co

30、ut“Samen”;elsecout“Notsamen”;結果為:NotsameSame,16:02:39,72,3.相容類型轉換(CastCompatibleType),隱式轉換:整型和浮點型都是數(shù)值型,所以它們是相容類型指針與整型不相容,如:7.0/3=7.0/3.0/將隱式轉換成浮點=2.33333333inta=9;int*ap=3+ap/錯,16:02:39,73,從表達能力弱的類型到強的類型的轉換是安全的,反之,會引起精度丟失如:floatf=7.0/3;/doublefloatinta=7.0/3;/doubleintcout.precision(9);coutfixed7.0/

31、3“n”;coutf“n”a“n”;結果為:2.3333333332.3333332542,16:02:39,74,可以用顯式轉換的方法,人為控制運算在一定的數(shù)據(jù)類型下工作,如:doubled=sqrt(123456.0);inta=static_cast(d)*8+5;intb=d*8+5;/隱式轉換為浮點couta“n”b“n”;結果為:28132815,16:02:39,75,4.關系與邏輯操作(Relationsif(x=0)cout“test1okn”;if(x=5)cout“test2okn”;if(x=0)cout“test3okn”;結果為:test2ok,16:02:39,7

32、6,!=是操作符,=!不是操作符intx=3;if(x!=9)cout“not9n”;if(x=!9)cout“impossiblen”;條件表達式(x!=0)與(x)等同intx=3;if(x!=0)coutx;if(x)coutx;,16:02:39,77,不等式連寫的錯誤:inta=-1,b=0,c=1;if(abc)cout“ok1n”;if(ab結果為:ok2,16:02:39,78,短路求值的妙用:避免除0的惡果if(b,16:02:39,79,5.位操作(BitOperations),左移操作將整數(shù)最高位擠掉,在右端補0。如:inta=12;/a為:000000000000000

33、00000000000001100a=a在整數(shù)的高位擠一個0或1進去(有符號數(shù)擠符號位,無符號數(shù)擠),而整數(shù)最低位被擠掉。如:shortinta=-2;/1111111111111110a=a1;/a=-1即1111111111111111unsignedshortintb=65535;/1111111111111111b=b1;/b=32767即0111111111111111,16:02:39,81,位與操作結果為:(比較/a為:00000000000000000000000000001100intb=6;/b為:00000000000000000000000000000110/a|b為:

34、00000000000000000000000000001110intcbit=a|b;intclogic=a|b;coutcbit“n”clogicm?m:n)*10;/保證運輸次數(shù)最少,16:02:39,96,參數(shù)傳遞:形參是對實參的克隆,克隆必須遵守類型匹配規(guī)則,voidf(Typea);/a為形參voidg()Typex;f(x);/x為實參,a實體,x實體,復制,Type類型,Type類型,16:02:39,97,.指針參數(shù)(PointerParameters),傳遞指針:指針參數(shù)也是值傳遞的,指針值的真正用途是進行數(shù)據(jù)間訪,以達到操作數(shù)據(jù)塊(大小由之)的目的傳遞引用:引用參數(shù)本質上

35、也是值傳遞的,它表現(xiàn)為名字傳遞,即以形參的名字來代替實參名字如果實參不是實體名而是表達式,那么其表達式所對應的臨時實體取名為形參,并要求其為常量引用意義:指針和引用參數(shù)的存在,使函數(shù)實際上可以訪問非局部的數(shù)據(jù)區(qū),函數(shù)的黑盒性便名存實亡但這并非一定壞事,指針是一把雙刃劍,或靈巧或邪惡引用是為了防范指針非安全的無意操作,16:02:39,98,voidmySort(int*b,intsize);voidf()inta=3,5,7,1,8,4,9;mySort(a,sizeof(a)/sizeof(a0);,傳遞指針須附帶傳遞單位數(shù)據(jù)的個數(shù),元素個數(shù),傳指針,16:02:39,99,限制無意操作帶來

36、的意外副作用,vectoradd(/向量加法constvector,16:02:39,100,3.棧機制(StackMechanism),運行時內存布局,16:02:39,101,未初始化局部數(shù)據(jù)的不確定性,#includevoidf()intb;/未初始化std:cout”a“n”;f();/-/8804248/2788048,16:02:39,102,#includeinta=5;intb=6;intmain()int*ap=(int*)4202660;*ap=8;std:couta“n”;std:coutint(/8/4202664,指針的無約束性,5,6,4202660,4202664

37、,a,b,4202660,ap,16:02:39,103,4.函數(shù)指針(FunctionPointers),函數(shù)類型:函數(shù)類型因參數(shù)類型、個數(shù)和排列順序的不同而不同,也因返回類型的不同而不同函數(shù)指針:指向代碼區(qū)中函數(shù)體代碼的指針.不同的函數(shù)類型,其函數(shù)指針也不同用法:函數(shù)指針經(jīng)常用作函數(shù)參數(shù),以傳遞連函數(shù)本身都不知道的處理過程(函數(shù)),16:02:39,104,不同的函數(shù)指針,不能相互賦值,intg(int);int(*gp)(int)=g;voidf();void(*fp)();fp=f;gp=fp;/error,不同的函數(shù),16:02:39,105,函數(shù)指針作為參數(shù)傳遞(函數(shù)名看作是函數(shù)指

38、針),boollessThanBitSum(inta,intb)intsuma=0,sumb=0;for(intx=a;x;x/=10)suma+=x%10;for(intx=b;x;x/=10)sumb+=x%10;returnsumasumb;intmain()inta=33,61,12,19,14,71,78,59;sort(aa,aa+8,lessThanBitSum);for(inti=0;i8;+i)coutaai;coutn;/1214336171195978,16:02:39,106,指定函數(shù)指針類型,定義函數(shù)指針數(shù)組,typedefvoid(*MenuFun)();voidf

39、1()coutgood!n;voidf2()coutbetter!n;voidf3()coutab;)couta+bf0509abc.txt1721357,16:02:39,109,main函數(shù)參數(shù),/f0510.cpp#includeusinganmespacestd;intmain(intargc,char*argv)for(inti=0;iargc;+i)coutargvif0510a1a2a3f0510a1a2a3,16:02:39,110,6.遞歸函數(shù)(RecursiveFunctions),形式上:一個正在執(zhí)行的函數(shù)調用了自身(直接遞歸).或者,一個函數(shù)調用了另一個函數(shù),而另一個函

40、數(shù)卻調用了本函數(shù)(間接遞歸)本質上:程序在運行中調用了相同代碼實體的函數(shù),卻在函數(shù)棧中重新復制了該函數(shù)的整套數(shù)據(jù),由于每套數(shù)據(jù)中的參數(shù)也許不同,導致了計算條件發(fā)生變化,使得函數(shù)得以逐步逼近終極目標而運行,16:02:39,111,遞歸函數(shù)可以轉換為非遞歸函數(shù)例如,求最大公約數(shù),longgcd1(inta,intb)/遞歸版if(a%b=0)returnb;returngcd(b,a%b);/-longgcd2(inta,intb)/非遞歸版for(inttemp;b;a=b,b=temp)temp=a%b;returna;/-,16:02:39,112,7.函數(shù)重載(FunctionOverl

41、oad),函數(shù)重載:一組概念相同,處理對象(參數(shù))不同的過程,出于方便編程的目的,用同一個函數(shù)名字來命名的技術稱為函數(shù)重載參數(shù)默認:一個函數(shù),既可以嚴謹和地道的調用,也可以省略參數(shù),輕靈地調用,達到此種方便編程目的的技術稱為參數(shù)默認重載與參數(shù)默認:它們都是通過參數(shù)的變化來分辨處理任務的不同如果參數(shù)決定了不同的處理過程,則應重載,否則參數(shù)默認更簡捷一些,16:02:39,113,重載是不同的函數(shù),以參數(shù)的類型,個數(shù)和順序來分辨,voidprint(double);voidprint(int);voidfunc()print(1);/voidprint(int);print(1.0);/voidp

42、rint(double);print(a);/voidprint(int);print(3.1415f);/voidpirnt(double);,16:02:39,114,參數(shù)默認是通過不同參數(shù)來分辨一個函數(shù)調用中的行為差異,voiddelay(inta=2);/函數(shù)聲明時intmain()delay();/默認延遲秒delay(2);/延遲秒delay(5);/延遲秒voiddelay(inta)/函數(shù)定義時intsum=0;for(inti=1;i=a;+i)for(intj=1;jc/=,頻繁調用的函數(shù):用昂貴的開銷換取可讀性,16:02:39,120,/=#includeintmain

43、()for(charc;cinc/=,內嵌代碼:開銷雖少,但可讀性差,16:02:39,121,內聯(lián)方式:開銷少,可讀性也佳,/=#includeinlineboolisDigit(char);/小函數(shù)intmain()for(charc;cinc/=,內聯(lián)標記放在函數(shù)聲明的前面,16:02:39,122,內聯(lián)函數(shù)的使用經(jīng)驗:,函數(shù)體適當小,且無循環(huán)或開關語句,這樣就使嵌入工作容易進行,不會破壞原調用主體如:排序函數(shù)不能內聯(lián)程序中特別是在循環(huán)中反復執(zhí)行該函數(shù),這樣就使嵌入的代碼利用率較高如:上例中的isDigit函數(shù)程序并不多處出現(xiàn)該函數(shù)調用,這樣就使嵌入工作量相對較少,代碼量也不會劇增,16

44、:02:39,123,/=#include#includeusingnamespacestd;/-intcalc1(inta,intb)returna+b;inlineintcalc2(inta,intb)returna+b;/-intmain()intx1000,y1000,z1000;clock_tt=clock();for(inti=0;i1000*1000*1000;+i)zi=calc1(xi%1000,yi%1000);cout(clock()-t)/CLK_TCK“withoutinlinen;t=clock();for(inti=0;i1000*1000*1000;+i)zi=

45、calc2(xi%1000,yi%1000);cout(clock()-t)/CLK_TCKn/=,棧中若不存在讀入的元素,則應入棧,創(chuàng)建棧,讀入元素不在棧頂即為失敗,退棧即逐個逐個過,16:02:39,129,向量方式,/=intmain()ifstreamin(rail.txt);for(intn,line=0;inn/=,模仿棧操作,16:02:39,130,結論,不同的數(shù)據(jù)結構有不同的操作和性能應學習使用不同數(shù)據(jù)結構的經(jīng)驗,16:02:39,131,3.算法(Algorithms),揭示:確定了數(shù)據(jù)結構之后,所采用的算法將直接決定程序的性能;任何語言都有個性,算法的選擇使用是靈巧運用語

46、言的藝術,充分發(fā)揮語言的優(yōu)勢是活用算法的根本做法:培養(yǎng)經(jīng)驗,用測試的辦法對算法進行選擇,16:02:39,132,問題:,已知不太大的正整數(shù)n(n46),求Fibonacci數(shù)列0112358132134的第n項的值對于后面的四種算法:unsignedfibo1(unsignedn);unsignedfibo2(unsignedn);unsignedfibo3(unsignedn);unsignedfibo4(unsignedn);如何選擇其中之一,第0項,第1項,第2項,16:02:39,133,算法:遞歸法優(yōu)點:算法簡單,容易編程缺點:??臻g負擔過重,調用開銷過大,unsignedfibo

47、1(unsignedn)if(n=1)returnn;returnfibo1(n-1)+fibo1(n-2);,n=0或1,16:02:39,134,算法:迭代法優(yōu)點:節(jié)省空間,節(jié)省時間缺點:編程相對復雜,unsignedfibo2(unsignedn)intc=n;for(inta=0,b=1,i=2;ist;)比較輸出yes或no,16:02:39,146,分別排序,直接加以字串比較是直截了當?shù)乃悸罚?for(strings,t;inst;)sort(s.begin(),s.end();sort(t.begin(),t.end();coutst;)ints1=count(s.begin()

48、,s.end(),1);ints0=count(s.begin(),s.end(),0);intt1=count(t.begin(),t.end(),1);intt0=count(t.begin(),t.end(),0);coutst;)ints1=count(s.begin(),s.end(),1);intt1=count(t.begin(),t.end(),1);cout(s1=t1,C+標準算法,16:02:39,149,6.動態(tài)內存(DynamicMemory),揭示:許多問題不知道數(shù)據(jù)量的大小,需要所運用的數(shù)據(jù)結構具有擴容能力;許多問題要求時間性能甚于空間占用充分利用堆空間(動態(tài)內存

49、)是解決這些問題的關鍵做法:理解堆空間的使用場合,學習堆空間的使用方法,16:02:39,150,使用容器,便是自動使用堆內存,例如,從abc.txt中讀取諸段落:ifstreamin(abc.txt);vectorps;/ps.reserve(1100);可以預留for(strings;getline(in,s);)ps.push_back(s);預留是減小頻繁擴容造成的數(shù)據(jù)移動開銷,16:02:39,151,若每個數(shù)據(jù)的處理,都要用到已經(jīng)處理的數(shù)據(jù)時,保存歷史數(shù)據(jù),則可以改善時間性能,例如,統(tǒng)計一億之內的素數(shù)個數(shù)(原始版):boolisPrime(intn)intsqrtn=sqrt(n*

50、1.0);for(inti=2;i=sqrtn;+i)if(n%i=0)returnfalse;returntrue;/-intmain()intnum=0;for(inti=2;i=100000000;+i)if(isPrime(i)num+;coutnumreset(j);intnum=0;for(inti=2;itest(i)num+;coutnumMat;Matinput();Mattranspose(constMat,16:02:39,175,在多個程序文件組成的程序中共享數(shù)據(jù),要遵守一次定義規(guī)則,/item1.cpp#includeusingnamespacestd;intn=8;/definevoidf();intmain()coutn”n”;f();,/item2.cpp#includeusingnamespacestd;externintn;/declarevoidf()coutn”n”;,16:02:39,176,4.靜態(tài)數(shù)據(jù)(StaticData),靜態(tài)全局數(shù)據(jù):在一個程序文件中共享的數(shù)據(jù)注意:全局數(shù)據(jù)則在多個程序文件中共享數(shù)據(jù)靜態(tài)局部數(shù)據(jù):在屢次調用的同一個函數(shù)中共享的數(shù)據(jù),16:02:39,177,演示靜態(tài)局部變量,voidfunc()staticinta=2;a+;in

溫馨提示

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

評論

0/150

提交評論