2011計(jì)算機(jī)等級(jí)考試二級(jí)C++輔導(dǎo)實(shí)例編程匯總_第1頁
2011計(jì)算機(jī)等級(jí)考試二級(jí)C++輔導(dǎo)實(shí)例編程匯總_第2頁
2011計(jì)算機(jī)等級(jí)考試二級(jí)C++輔導(dǎo)實(shí)例編程匯總_第3頁
2011計(jì)算機(jī)等級(jí)考試二級(jí)C++輔導(dǎo)實(shí)例編程匯總_第4頁
已閱讀5頁,還剩119頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

201I年計(jì)算機(jī)等級(jí)考試二級(jí)C++輔導(dǎo)實(shí)例編程(1)C++冒泡排序基本應(yīng)用技巧分享對(duì)于學(xué)過C語言的朋友來說,可能對(duì)于里面的冒泡排序還是有很深印象的。那么今天我們將會(huì)為大家介紹一下具有C語言特性的C++語言中冒泡排序的實(shí)現(xiàn)方法。接下來就讓我們ー起來看看C++冒泡排序的具體操作方法吧。C++冒泡排序代碼示例:#include<iostream.h>#include<stdio.h>儼冒泡排序paramter:int*pDala:指針數(shù)組intCount:數(shù)組大小returnvalue:返回?cái)?shù)組的指針ツint*BubbleSort(int*pData,intCount){intiTemp;fbr(inti=l;i<Count;i++){for(intj=Count-1;j>=i;j){if(pData[j]<pData[j-l])iTemp=pData[j-l];pData[j-1]=pData[jJ;pData[j]=iTemp;}|}returnpData;}voidmain(){inta[l0]={3294,23,34,65,22,33,432,34);intcount=sizeof(a)/sizeof(a[0]);int*b=BubbleSort(a,count);〃定義指針for(inti=O;i<count;i++){cout<<*(b+i)<<endl;)}以上就是對(duì)C++冒泡排序的相關(guān)介紹201I年計(jì)算機(jī)等級(jí)考試二級(jí)C++輔導(dǎo)實(shí)例編程(2)隨機(jī)化算法——隨機(jī)數(shù)概率算法的一個(gè)基本特征是對(duì)所求解問題的同一實(shí)例用同?概率算法求解兩次可能得到完全不同的效果。這兩次求解問題所需的時(shí)間甚至所得到的結(jié)果可能會(huì)有相當(dāng)大的差別。一般情況下,可將概率算法大致分為四類:數(shù)值概率算法,蒙特卡羅(MonteCarlo)算法,拉斯維加斯(LasVegas)算法和舍伍徳(Sherwood)算法。隨機(jī)數(shù)在概率算法設(shè)計(jì)中扮演著十分重要的角色。在現(xiàn)實(shí)計(jì)算機(jī)上無法產(chǎn)生真正的隨機(jī)數(shù),因此在概率算法中使用的隨機(jī)數(shù)都是一定程度上隨機(jī)的,即偽隨機(jī)數(shù)。產(chǎn)生隨機(jī)數(shù)最常用的方法是線性同余法。由線性同余法產(chǎn)生的隨機(jī)序列a1,a2,...,an滿足.aO=d.an=(b*an-1+c)modm(n=l,2 )其中,b>0,c>=0,d>=m0d稱為該隨機(jī)序列的種子。一”般情況下,取gcd(m,b)=l,因此可取b為一素?cái)?shù)。這是一個(gè)隨機(jī)數(shù)類:代碼constunsignedlongmaxshort=65535L;constunsignedlongmultiplier=1194211693L;constunsignedlongadder=12345L;classRandomNumber{private:/Z當(dāng)前種子unsignedlongrandSeed;public:〃構(gòu)造函數(shù),默認(rèn)值〇表示山系統(tǒng)自動(dòng)產(chǎn)生種子RandomNumber(unsignedlongs=0);〃產(chǎn)生〇?n-1之間的隨機(jī)整數(shù)unsignedshortRandom(unsignedlongn);/Z產(chǎn)生[〇,1)之間的隨機(jī)實(shí)數(shù)double(RandomO;};/Z產(chǎn)生種子RandomNumber::RandoniNumber(unsignedlongs)(if(s=0)randSeed=time(0);〃用系統(tǒng)時(shí)間產(chǎn)生種子elserandSeed=s;)〃產(chǎn)生0~n-1之間的隨機(jī)整數(shù)unsignedshortRandomNumber::Random(unsignedlongn)(randSeed=multiplier*randSeed+adder;return(unsignedshort)((randSeed?16)%n);/Z產(chǎn)生[0,1)之間的隨機(jī)實(shí)數(shù)doubleRandomNumber::fRandom(){returnRandom(maxshort)/double(maxshort);}利用這個(gè)隨機(jī)數(shù)類,寫ー個(gè)程序,模擬拋硬幣的實(shí)驗(yàn)。拋1。次硬幣構(gòu)成一個(gè)事件,每次事件記錄得到正面的個(gè)數(shù)。反復(fù)模擬這個(gè)事件50,000次,然后對(duì)這50,000L次進(jìn)行輸出頻率闇,比較每次事件得到正面次數(shù)的比例。以下是總的代碼:頭文件RandomNumber.h:代碼//RandomNumber.hconstunsignedlongmaxshort=65535L;constunsignedlongmultiplier=1194211693L;constunsignedlongadder=12345L;#ifndefRANDOMNUMBER.H#defineRANDOMNUMBERHclassRandomNumber{private:/Z當(dāng)前種子unsignedlongrandSeed;public:〃構(gòu)造函數(shù),默認(rèn)值〇表示由系統(tǒng)自動(dòng)產(chǎn)生種子RandomNumber(unsignedlongs=0);〃產(chǎn)生〇?n-1之間的隨機(jī)整數(shù)unsignedshortRandom(unsignedlongn);/Z產(chǎn)生[0,1)之間的隨機(jī)實(shí)數(shù)doublefRandom();#endif類實(shí)現(xiàn)文件RandomNumber.cpp:代碼//RandomNumber.cpp#include"RandomNumber.h1'#include#include#includeusingnamespacestd;/Z產(chǎn)生種子RandomNumber::RandomNumber(unsignedlongs){if(s=0)randSeed=time(〇);〃用系統(tǒng)時(shí)間產(chǎn)生種子elserandSeed=s;}〃產(chǎn)生〇~n-1之間的隨機(jī)整數(shù)unsignedshortRandomNumber::Random(unsignedlongn)randSeed=multiplier*randSeed+adder;return(unsignedshort)((randSeed?16)%n);}/Z產(chǎn)生[0,1)之間的隨機(jī)實(shí)數(shù)doubleRandomNumber::fRandom(){returnRandom(maxshort)/double(maxshort);}主文件Main:代碼//主文件main*Author:Tankywoo*Blog:www.WuTianQ*Date:2010.12.7?代碼來至王曉東《計(jì)算機(jī)算法設(shè)計(jì)與分析》*/#include"RandomNumber.h"#include#include#includeusingnamespacestd;intTossCoins(intnumberCoins){/Z隨機(jī)拋硬帀staticRandomNumbercoinToss;inti,tosses=0;for(i=0;i<numberCoins;++i)tosses+=coinToss.Random(2);returntosses;intmain()/Z模擬隨機(jī)拋硬幣事件constintNCOINS=10;constlongNTOSSES=50000L;//heads【i]得到的i次正面的次數(shù)longi,heads[NCOINS+1];intj,position;/Z初始化數(shù)組headsfor(j=0;j<NCOINS+1;++j)heads[j]=0;/Z重復(fù)50,000次模擬事件for(i=0;i<NTOSSES;++i)heads[TossCoins(NCOINS)J++;/Z輸出頻率圖for(i=0;i<=NCOINS;++i)position=int(float(heads[i])/NTOSSES*72);cout?setw(6)?i?for(j=0;jocout?cout?H*n?endl;}return0;}輸出頻率圖:201I年計(jì)算機(jī)等級(jí)考試二級(jí)C++輔導(dǎo)實(shí)例編程(3)兩個(gè)數(shù)論的算法#includeusingnamespacestd;structresult(intd;intx;inty;};//d=gcd(a,b)=ax+byresultExtendeEuclid(inta,intb){resultres;if(!b)res.d=a;res.x=l;res.y=O;returnres;}resulttemp=ExtendeEuclid(b,a%b);res.d=temp.d;res.x=temp.y;res.y=temp.x-a/b*temp.y;returnres;}inlinelongmod(longa,longb)(return(a%b+b)%b;}〃計(jì)算滿足ax和b關(guān)于n同余的xvoidModularLinearEquationSolver(intajntb,intn)if(a<=0lln<=0)coutvv”參數(shù)有錯(cuò)"<<ENDL;vp>return;resultre=ExtendeEuclid(a,n);if(b%re.d==0)intxO=mod(re.x*(b/re.d),n);for(inti=O;i<=re.d-l;i++)cout?<endl;<>elsecoutvv”無解”《ENDL;<p>}}intmain(){ModularLinearEquationSolver(14,30,100);return0;}201I年計(jì)算機(jī)等級(jí)考試二級(jí)C++輔導(dǎo)實(shí)例編程(4)常用算法之插入排序(C++版)vectorInsertSort(vectorvec){cout?”請(qǐng)輸入整數(shù)數(shù)列,crtl+z結(jié)束輸入"<<ENDC<p>5while(cin?a)vec.push_back(a);intCount=vec.size();for(inti=l;i<COUNT;I++)<p>{〃將vec[i]插入到正確的位置for(intj=i;j>0;j—){vectortemp(l);if(vec[j]vVEC卩ーl])vp>{temp[0]=vec[j-l];vec[j-l]=vec[j];elsecontinue;})for(inti=0;i<COUNT;I++)<p>cout?VEC[I]?ENDL;<p>returnvec;)201I年計(jì)算機(jī)等級(jí)考試二級(jí)C++輔導(dǎo)實(shí)例編程⑸常用算法之選擇排序(C++版)1vectorselectSort(vectorivec)cout<<”請(qǐng)輸入需要排序的整數(shù)序列按下ctrl+z結(jié)束輸入,?ENDL;<p>while(cin?num)ivec.push_back(num);intn=ivec.size();for(inti=O;i<N-l;1++)<p>io{intMin=i;〃求ivec[i]與ivec[n]之間的最小值ivec[Min];for(intj=i;j<N-l;J++)<p>{if(ivec[Min]>ivec[j+1])19202122232425262728293031323334continue;〃交換順序vectortemp(l);temp[0]=ivec[i];ivec[i]=ivec[Min];ivec[Min]=temp[0];)for(inti=0;i<N;1++)<p>(cout?IVEC[I]?ENDL;<p>)returnivec;

35)2011年計(jì)算機(jī)等級(jí)考試二級(jí)C++輔導(dǎo)實(shí)例編程⑹常用算法之冒泡排序(C++版)其實(shí)我認(rèn)為冒泡是最沒有必要說的ー個(gè)算法,如果連冒泡都不知道的話,我覺得就不能謂之學(xué)過算法。這個(gè)應(yīng)該是屬于特別簡(jiǎn)單的ー個(gè)算法,很基本,我記得當(dāng)時(shí)我們是講算法的時(shí)候,講的第一個(gè)就是這個(gè)冒泡排序。我也就不多說其他了,我這里寫上純粹是為了一個(gè)完整性。效率O(n*n),穩(wěn)定排序。#includeusingnamespacestd;intBubbleSort(int*nData,intlen){boolisOk=false;for(inti=0;iisOk=true;for(intj=len-l;j>i;-j){nData|j]=nData[j-l];nData[j-l]=temp;isOk=false;)}})intmain(){intpData[10]={1,5,9,3,4,7,8,2,6,10};for(inti=0;i<10;++i)cout<201I年計(jì)算機(jī)等級(jí)考試二級(jí)C++輔導(dǎo)實(shí)例編程⑺輸入ー個(gè)字符串,將其逆序后輸出

#mcludeusingnamespacestd;voidSetStr(string&str)(intlen=str.length();chartemp;for(inti=0;i{〃把字符串的兩邊ーー調(diào)換temp=str[i];str[i]=str[len-l-i];str[len-l-i]=temp;020304050607080910111213141516){stringa;cout?',input,'<cin?a;SetStr(a);cout<return0;}201I年計(jì)算機(jī)等級(jí)考試二級(jí)C++輔導(dǎo)實(shí)例編程(8)C++重載類型轉(zhuǎn)換操作符(typecastoperator)boost::ref和boost::cref使用了重載“類型轉(zhuǎn)換(typecast)”操作符來實(shí)現(xiàn)使用引用類型來替換模版參數(shù),本文就介紹一下這種操作符的重載方法。函數(shù)原型Tl::operatorT2()[const];//T1的成員函數(shù),重載"(T2)a"操作符1.類型轉(zhuǎn)換重載函數(shù)的返回值是隱含的,并且不能顯示聲明,返回值是與轉(zhuǎn)換的類型相同的,即為上面原.支持繼承,可以為虛函數(shù);.支持使用typedef定義的類型;先通過一個(gè)簡(jiǎn)單的例子來說明如何使用類型轉(zhuǎn)換重載#includeclassD{public:D(doubled):d_(d){}/?重載“(int)D"*/operatorint()const{std::cout?H(int)dcalled!"?std::endl;returnstatic_cast(d_);)13private:doubled_;);intadd(inta,intb){returna+b;)intmain(){Ddl=1.1;Dd2=2.2;std::cout?add(dl,d2)?std::endl;return0;)在24行執(zhí)行add(dl,d2)函數(shù)時(shí)"(int)D”重我函數(shù)將被調(diào)用,程序運(yùn)行的輸出為:(int)dcalled!(int)dcalled!3類型轉(zhuǎn)換操作符vs類型轉(zhuǎn)換構(gòu)造函數(shù)(conversionconstructor)有時(shí)候使用conversionconstructor就能實(shí)現(xiàn)類型轉(zhuǎn)換,這種方式效率更高而且也更直觀,下面舉例說明:#includeclassA{public:A(intnum=0):dat(num){}/?重載”(int)a”?/private:intdat;);classX{public:X(intnum=0):dat(num){}/?重載”(inl)a”*/operatorint(){returndat;}/*重載"(A)a"*/26272829303132333435363738394041Atemp=dat;returntemp;)private:intdat;};intmain()(Xstuff=37;Amore=0;inthold;hold=stuff;//convertX::stufftoint

42std::cout?hold?std::endl;4344more=stuff;//convertX::stufftoA::more45std::cout?more?std::endl;//convertA::moretoint4647return0;48)49上面這個(gè)程序中X類通過重載“operatorA()”來實(shí)現(xiàn)將X類型對(duì)象轉(zhuǎn)換成A類型,這種方式需耍先創(chuàng)建一個(gè)臨時(shí)A對(duì)象再用它去賦值H標(biāo)対象;更好的方式是為A類增加一個(gè)構(gòu)造函數(shù):A(constX&rhs):dat(rhs){}同時(shí),請(qǐng)注意上面程序的第45行more的類型在調(diào)用std::cout時(shí)被隱式地轉(zhuǎn)成了int!ー個(gè)簡(jiǎn)單boost::ref實(shí)現(xiàn)通過重載typecastoperator?我們就可以自己實(shí)現(xiàn)ー個(gè)簡(jiǎn)版的boost::refo#includeclassRefHolder{public:RefHolder(T&ref):ref一(ref){}/?重載“(T&)A”操作符?/operatorT&()const{returnre匚;}private:T&ref_;);20inlineRefHolderByRef(T&t){returnRefHolder(t);}intinc(int&num){num++;returnnum;}intmain(){intn=1;std::cout?inc(ByRef(n))?std::endl;//RefHolder被轉(zhuǎn)換成了“int&”類型return0;201I年計(jì)算機(jī)等級(jí)考試二級(jí)C++輔導(dǎo)實(shí)例編程⑼大整數(shù)階乘問題的遞推算法〃:========="大整數(shù)階乘,問題的遞推算法=========#defineMAXN1000 〃最大數(shù)據(jù)位數(shù)〃用遞推法求取整數(shù)k的階乖,將結(jié)果放入數(shù)組array中voidpnext(intarray[],intk){int*temp;〃動(dòng)態(tài)數(shù)組[臨時(shí)存儲(chǔ)運(yùn)算大整數(shù)]inti,j,num_len=array[0],carry,t;〃循環(huán)變量,長(zhǎng)整數(shù)位數(shù),進(jìn)位標(biāo)志,臨時(shí)變量if(array[0]>=MAXN){printfT數(shù)據(jù)處理位數(shù)超過程序設(shè)計(jì)上限,程序?qū)⒆詣?dòng)中斷運(yùn)行!'n)exit(l);}temp=(int*)malloc(sizeof(int)*(num_len+1));〃創(chuàng)建動(dòng)態(tài)數(shù)組for(i=1;i<=num_len;i++)temp[i]=ai-ray[il; 〃保存原始數(shù)據(jù)for(J=l;j{for(carry=O,i=l;i<=num_len;i++)(if(i<=array[0])t=array[i]+temp[i]+carry;elset=arrayfi]+carry;//處理最高位〃數(shù)據(jù)位調(diào)整array[i]=t%10;carry=t/10;)if(carry)aiTay[++num_len]=carry;〃在最高位記錄進(jìn)位標(biāo)志free(temp);array[0]=num_len;〃顯示階乖結(jié)果voidShow_Result(intarray[],intbase_number)(inti;printf("M!=n,base_number);for(i=array[0];i>0;i-)printf(”%d”,array國(guó));printf(''\n\nM);}〃計(jì)算數(shù)據(jù)的階乘voidCount_Result(intarray[],intbase__number){intk;arrayfO]=1;array!1]=1;for(k=2;k<=base_number;k+4-)(pnext(array,k);Show_Result(array,k);}}〃:========="大整數(shù)階乘”問題的遞推算法=====201I年計(jì)算機(jī)等級(jí)考試二級(jí)C++輔導(dǎo)實(shí)例編程(10)大整數(shù)階乘的算法思路這里的大整數(shù)指大于500以上的整數(shù),當(dāng)然更大也可以。由于整數(shù)階乘遞增的很快,遠(yuǎn)大于指數(shù)式遞增,對(duì)于小整數(shù),比如20,30左右,可以直接使用比如遞歸的方式進(jìn)行,這很基本。但是當(dāng)整數(shù)較大時(shí),階乘的結(jié)果很大,遠(yuǎn)非ー個(gè)int或者long就能存的下的,比如1000的階乘結(jié)果有上千位。所以大整數(shù)階乘設(shè)計(jì)的關(guān)鍵點(diǎn)就是存儲(chǔ)大整數(shù),當(dāng)選擇了存儲(chǔ)大整數(shù),那么整數(shù)的乘法運(yùn)算也不能再依靠?了,所以還要重新設(shè)計(jì)大整數(shù)的懲罰運(yùn)算。上面是我的設(shè)計(jì)思路。網(wǎng)上找過相關(guān)的文章,有高手以4行代碼完成了該算法,確實(shí)佩服!當(dāng)然這涉及了算法的優(yōu)化,不管那么多J',這里要的就是以盡量清晰地思路快速設(shè)計(jì)該算法,這是使用了STL標(biāo)準(zhǔn)庫的容器。下面是我的算法代碼,直接貼這里了,注意看相關(guān)的注釋:#include#includeusingnamespacestd;〃傳入整數(shù):int,和整數(shù)」的階乘結(jié)果,進(jìn)行相乘的結(jié)果/Z結(jié)構(gòu)依然存儲(chǔ)到容器中voidCalc(intnum,vector&calcresult){vectortempnum;vectorrest;/Z將傳入的int拆分之后保存到容器中do(tempnum.push_back(num%10);num=num/10;}while(num);/Z將分拆之后的num進(jìn)行乘法計(jì)算unsignedinti=0,j=0;for(i=0;i<tempnum.size();++i)(intcarry=O-J!存儲(chǔ)每位計(jì)算時(shí)來自低位的進(jìn)位for(j=0;j<calcresult.size();++j){intbitl=0,bit2=0,res=0;bitl=calcresult[j];bit2=tempnum[i];res=bitl*bi⑵//保存當(dāng)前位if((i+j){/Z臨時(shí)結(jié)果中有對(duì)應(yīng)位存在,則直接更新rest[i+j]+=(res+carry)%10;else(/Z沒有對(duì)應(yīng)位則需要添加rest.push_back((res+carry)%10);}/Z有進(jìn)位,則更新進(jìn)位carry=(res+carry)/10;}//如果計(jì)算之后還有最高位的進(jìn)位,那么則直接添加進(jìn)去if(carry){//保存當(dāng)前位if((i+j)/Z臨時(shí)結(jié)果中有對(duì)應(yīng)位存在,則直接更新rest[i+j]+=carry;else/Z沒有對(duì)應(yīng)位則需要添加rest.push_back(carry);}|}//上述計(jì)算之后,會(huì)出現(xiàn)有些位的數(shù)字超過了10,那是因?yàn)樵谔幚砻恳晃贿\(yùn)算結(jié)果之后//相加時(shí)地位向高位可能存在進(jìn)位,上面沒有考慮,所以需要進(jìn)行調(diào)整for(i=0;i<rest.size();++i){if(rest[ij>9)if((i+l)!=rest.size())//高位存在,則直接更新高位rest[i+l]+=rest[i]/10;rest[i]=rest[i]%10;}else{//高位不存在,則需要插入rest.push_back(rest[i]/10);rest[i]=rest[i]%10;}}}/Z將計(jì)算結(jié)果存儲(chǔ)到原來的容器中calcresult.clear();for(i=0;i<rest.size();++i)calcresull.push_back(rest[i]);}intmain(){intnum=0;vectorcalcresult;/Z將初值1賦進(jìn)去calcresult.push_back(1);/Z獲取欲求階乘的整數(shù)coutcぐ輸入欲求階乘的整數(shù):"<cin?num;for(inti=0;i<num;++i)Calc(i+1,calcresult);/Z輸出計(jì)算結(jié)果cout<for(unsignedinti=calcresult.size();i>0i)(cout<}cout<return0;}2011年計(jì)算機(jī)等級(jí)考試二級(jí)C++輔導(dǎo)實(shí)例編程(11)動(dòng)態(tài)生成二維數(shù)組intmain(){inta,b,ij,k=0;cin?aメ行值cin?b;〃列值int**p;p=(int**)malloc(sizeof(int*)*a);for(i=0;i<A;I++)<p>(p[i]=(int*)malloc(sizeof(int)*b);)for(i=0;i<A;I++)<p>{for(j=O;j<B;J++)<p>{*(*(p+i)+j)=k++;}}for(i=0;i<A;I++)<p>cout?*(*(p+i)+j)?nn;}cout?ENDL;<p>}return0;}201I年計(jì)算機(jī)等級(jí)考試二級(jí)C++輔導(dǎo)實(shí)例編程(12)數(shù)組中第二大數(shù)01〃找出數(shù)組中第二大數(shù)。02//0304#include05usingnamespacestd;07intfind_second_max(intdata[],intcount)08(09intmax,s_max=0;max二data[〇];for(inti=l;i<COUNT;I++)<p>{if(max<DATA[I])<p>{s_max二max;max=data[i];)elseif(max>data[i]&&(s_max<DATA[I]))<p>s_max=data[i];)returns_max;2324intmain()25(26cout?"Input10numbers:"?ENDL;<p>27intal10];28for(inti=0;i<10;i++)29cin?a[i];cout?Mthesencond_maxnumberisM?FIND_SECOND_MAX(AJO)?ENDL;<p>return0;}201I年計(jì)算機(jī)等級(jí)考試二級(jí)C++輔導(dǎo)實(shí)例編程(13)C++異常處理機(jī)制示例及講解ド面的代碼直接貼到你的console工程中,可以運(yùn)行調(diào)試看看效果,并分析C++的異常機(jī)制。#include"stdafx.h"#include#include#include//內(nèi)存泄露檢測(cè)機(jī)制#define_CRTDBG_MAP_ALLOC#ifdef-DEBUG#definenewnew(_NORMAL_BLOCK,_FILE_,_LINE_)#endif//自定義異常類classMyExcepction|public://構(gòu)造函數(shù),參數(shù)為錯(cuò)誤代碼MyExcepction(interrorld){/Z輸出構(gòu)造函數(shù)被調(diào)用信息std::cout?',MyExcepctioniscalled"?std::endl;m_errorld=errorld;/Z拷貝構(gòu)造函數(shù)MyExcepction(MyExcepction&myExp){/Z輸出拷貝構(gòu)造函數(shù)被調(diào)用信息std::cout?”copyconstructiscalled"?std::endl;this->m_errorld=myExp.m_errorld;|-MyExcepction(){/Z輸出析構(gòu)函數(shù)被調(diào)用信息std::cout?"~MyExcepctioniscalled"?std::endl;}/Z獲取錯(cuò)誤碼intgetErrorId()returnm_errorld;private:/Z錯(cuò)誤碼intm_errorld;};intmain(intargc,char*argv[]){//內(nèi)存泄露檢測(cè)機(jī)制_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DFI_CRTDBG_LEAK_CHECK_DF);/Z可以改變錯(cuò)誤碼,以便拋出不同的異常進(jìn)行測(cè)試intthrowErrorCode=110;std::cout?”inputtestcode:"?std::endl;std::cin?throwErrorCode;tryif(throwErrorCode=110)MyExcepctionmyStru(l10);/Z拋出對(duì)象的地址?>山catch(MyExcepction*pMyExcepction)捕獲/Z這里該對(duì)象的地址拋出給catch語句,不會(huì)調(diào)用對(duì)象的拷貝構(gòu)造函數(shù)/Z傳地址是提倡的做法,不會(huì)頻繁地調(diào)用該對(duì)象的構(gòu)造函數(shù)或拷貝構(gòu)造函數(shù)//catch語句執(zhí)行結(jié)束后,myStru會(huì)被析構(gòu)掉throw&myStru;}elseif(throwErrorCode=119)(MyExcepctionmyStru(l19);/Z拋出對(duì)象,這里會(huì)通過拷貝構(gòu)造函數(shù)創(chuàng)建一個(gè)臨時(shí)的對(duì)象傳出給catch/Z由catch(MyExcepctionmyExcepction)捕獲//在catch語句中會(huì)再次調(diào)用通過拷貝構(gòu)造函數(shù)創(chuàng)建臨時(shí)對(duì)象復(fù)制這里傳過去的對(duì)象//throw結(jié)束后myStru會(huì)被析構(gòu)掉throwmyStru;elseif(throwErrorCode==120)(/Z不提倡這樣的拋出方法/Z這樣做的話,如果calch(MyExcepction*pMyExcepction)中不執(zhí)行delete操作則會(huì)發(fā)生內(nèi)存泄露//illcatch(MyExcepction*pMyExcepction)捕獲MyExcepction*pMyStru=newMyExcepction(120);throwpMyStru;}else{//直接創(chuàng)建新對(duì)象拋出//相當(dāng)于創(chuàng)建了臨時(shí)的對(duì)象傳遞給了catch語句/Z由catch接收時(shí)通過拷貝構(gòu)造函數(shù)再次創(chuàng)建臨時(shí)對(duì)象接收傳遞過去的對(duì)象throwMyExcepction(throwErrorCode);catch(MyExcepction*pMyExcepction)(/Z輸出本語句被執(zhí)行信息std::cout?"執(zhí)行了catch(MyExcepction*pMyExcepction)"?std::endl;/Z輸出錯(cuò)誤信息std::cout?"errorCode:"?pMyExcepction->getErrorId()?std::endl;/Z異常拋出的新對(duì)象并非創(chuàng)建在函數(shù)棧上,而是創(chuàng)建在專用的異常棧上,不需要進(jìn)行delete//deletepMyExcepction;)catch(MyExcepctionmyExcepction){/Z輸出本語句被執(zhí)行信息std::cout?”執(zhí)イ丁Tcatch(MyExcepctionmyExcepction)”?std::endl;/Z輸出錯(cuò)誤信息std::cout?”errorCode:“?myExcepction.getErrorId()?std::endl;}catch(...)(/Z輸出本語句被執(zhí)行信息std::cout?”執(zhí)仃了catch(...)”?std::endl;/Z處理不了,重新拋出給上級(jí)throw;}/Z暫停inttemp;std::cin?temp;return0;}知識(shí)點(diǎn):C++異常機(jī)制ー、概述C++自身有著非常強(qiáng)的糾錯(cuò)能力,發(fā)展到如今,已經(jīng)建立了比較完善的異常處理機(jī)制。C++的異常情況無非兩種,ー種是語法錯(cuò)誤,即程序中出現(xiàn)了錯(cuò)誤的語句,函數(shù),結(jié)構(gòu)和類,致使編譯程序無法進(jìn)行。另ー種是運(yùn)行時(shí)發(fā)生的錯(cuò)誤,一般與算法有關(guān)。關(guān)于語法錯(cuò)誤,不必多說,寫代碼時(shí)心細(xì)一點(diǎn)就可以解決。C++編譯器的報(bào)錯(cuò)機(jī)制可以讓我們輕松地解決這些錯(cuò)誤。第二種是運(yùn)行時(shí)的錯(cuò)誤,常見的有文件打開失敗、數(shù)組下標(biāo)溢出、系統(tǒng)內(nèi)存不足等等。而?旦出現(xiàn)這些問題,引發(fā)算法失效、程序運(yùn)行時(shí)無故停止等故障也是常有的。這就要求我們?cè)谠O(shè)計(jì)軟件算法時(shí)要全面。比如針對(duì)文件打開失敗的情況,保護(hù)的方法有很多種,最簡(jiǎn)單的就是使用“return”命令,告訴上層調(diào)用者函數(shù)執(zhí)行失敗;另外一種處理策略就是利用C++的異常機(jī)制,拋出異常。二、C++異常處理機(jī)制C++異常處理機(jī)制是ー個(gè)用來有效地處理運(yùn)行錯(cuò)誤的非常強(qiáng)大且靈活的工具,它提供了更多的彈性、安全性和穩(wěn)固性,克服了傳統(tǒng)方法所帶來的問題.異常的拋出和處理主要使用了以下三個(gè)關(guān)鍵字:try、throw、catch〇拋出異常即檢測(cè)是否產(chǎn)生異常,在C++中,其采用throw語句來實(shí)現(xiàn),如果檢測(cè)到產(chǎn)生異常,則拋出異常。該語句的格式為:throw表達(dá)式;如果在try語句塊的程序段中(包括在其中調(diào)用的函數(shù))發(fā)現(xiàn)了異常,且拋棄了該異常,則這全異常就可以被try語句塊后的某個(gè)catch語句所捕獲并處理,捕獲和處理的條件是被拋棄的異常的類型與catch語句的異常類型相匹配。由于C++使用數(shù)據(jù)類型來區(qū)分不同的異常,因此在判斷異常時(shí),throw語句中的表達(dá)式的值就沒有實(shí)際意義,而表達(dá)式的類型就特別重要。try-catch語句形式如下:try(包含可能拋出異常的語句;)catch(類型名【形參名])〃捕獲特定類型的異常()catch(類型名[形參名])〃捕獲特定類型的異常catch(...)//三個(gè)點(diǎn)則表示捕獲所有類型的異常[范例]]處理除數(shù)為0的異常。該范例將上述除數(shù)為0的異??梢杂胻ry/catch語句來捕獲異常,并使用throw語句來拋出異常,從而實(shí)現(xiàn)異常處理,實(shí)現(xiàn)代碼如代碼淸單1-1所示?!ùa清單1-1include〃包含頭文件#includedoublefuc(doublex,doubley)〃定義函數(shù){if(y==O){throwy;〃除數(shù)為0,拋出異常}returnx/y;〃否則返回兩個(gè)數(shù)的商)voidmain(){doubleres;try〃定義異常1516res=fuc(2,3);cout?nTheresultofx/yis:n?RES?ENDL;<p>res=fuc(4,0);〃出現(xiàn)異常,函數(shù)內(nèi)部會(huì)拋出異常)catch(double)〃捕獲并處理異常(cerr?Herrorofdividingzero.'n";exit(l);〃異常退出程序})【范例2】自定義異常類型(在本文開始的代碼中已經(jīng)給出示范)三、異常的接口聲明為了加強(qiáng)程序的可讀性,使函數(shù)的用戶能夠方便地知道所使用的函數(shù)會(huì)拋出哪些異常,可以在函數(shù)的聲明中列出這個(gè)函數(shù)可能拋出的所有異常類型,例如:voidfun()throw(A,B,C,D);這表明函數(shù)fun()可能并且只可能拋出類型(A,B,C,D)及其子類型的異常。如果在函數(shù)的聲明中沒有包括異常的接口聲明,則此函數(shù)可以拋出任何類型的異常,例如:voidfun();ー個(gè)不會(huì)拋出任何類型異常的函數(shù)可以進(jìn)行如下形式的聲明:voidfun()thow();五、異常處理中需要注意的問題.如果拋岀的異常一直沒有函數(shù)捕獲(catch),則會(huì)一直上傳到C++運(yùn)行系統(tǒng)那里,導(dǎo)致整個(gè)程序的終止.一般在異常拋出后資源可以正常被釋放,但注意如果在類的構(gòu)造函數(shù)中拋出異常,系統(tǒng)是不會(huì)調(diào)用它的析構(gòu)函數(shù)的,處理方法是:如果在構(gòu)造函數(shù)中要拋出異常,則在拋出前要記得刪除申請(qǐng)的資源。.異常處理僅僅通過類型而不是通過值來匹配的,所以catch塊的參數(shù)可以沒有參數(shù)名稱,只需要參數(shù)類型。.函數(shù)原型中的異常說明要與實(shí)現(xiàn)中的異常說明?致,否則容易引起異常沖突。.應(yīng)該在throw語句后寫上異常對(duì)象時(shí),throw先通過Copy構(gòu)造函數(shù)構(gòu)造ー個(gè)新對(duì)象,再把該新對(duì)象傳遞給catch.那么當(dāng)異常拋出后新對(duì)象如何釋放?異常處理機(jī)制保證:異常拋出的新對(duì)象并非創(chuàng)建在函數(shù)棧上,而是創(chuàng)建在專用的異常棧上,因此它オ可以跨接多個(gè)函數(shù)而傳遞到上層,否則在棧清空的過程中就會(huì)被銷毀。所有從try到throw語句之間構(gòu)造起來的對(duì)象的析構(gòu)函數(shù)將被自動(dòng)調(diào)用。但如果一直上溯到main函數(shù)后還沒有找到匹配的catch塊,那么系統(tǒng)調(diào)用terminate()終止整個(gè)程序,這種情況下不能保證所有局部對(duì)象會(huì)被正確地銷毀。.catch塊的參數(shù)推薦采用地址傳遞而不是值傳遞,不僅可以提高效率,還可以利用對(duì)象的多態(tài)性。另外,派生類的異常撲獲要放到父類異常撲獲的前面,否則,派生類的異常無法被撲獲。.編寫異常說明時(shí),耍確保派生類成員函數(shù)的異常說明和基類成員函數(shù)的異常說明一致,即派生類改寫的虛函數(shù)的異常說明至少要和對(duì)應(yīng)的基類虛函數(shù)的異常說明相同,甚至更加嚴(yán)格,更特殊。201I年計(jì)算機(jī)等級(jí)考試二級(jí)C++輔導(dǎo)實(shí)例編程(14)生成手機(jī)號(hào)碼文本C++程序源碼//makeyqm.cpp:定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。//#include"stdafx.h*'includenstdio.hn#include"stdlib.h"inti=l;int_tmain(intargc,_TCHAR*argv[])//主程序」main支持unicode別名,定義一個(gè)整形argc記錄參數(shù)個(gè)數(shù)//-TCHAR*argv[]則是所有參數(shù)的一個(gè)數(shù)組(if(argc!=3){printf(nUSAGE:MAKEYQMphonefileyqmfile");return1;)〃如果發(fā)現(xiàn)參數(shù)不等于3個(gè)就提示USAGE:MAKEYQMphonefileyqmfileHLE*fpl,*fp2,*fp3;if((fpl=fdpen(argv[l],V))==NULL){printf(Bcan,topenfile:%sH,argv[l]);return1;)〃如果讀取第一個(gè)參數(shù)為空,就打印不能打開該文件if((fp2=fopen(argv[2],Hr"))==NULL){printf("can*topenfile:%sM,argv[2]);return1;}〃如果讀取第二個(gè)參數(shù)為空,就打印不能打開該文件charphone[255],yqm[255];〃定義兩個(gè)數(shù)組phone,yqmwhile(fgets(phone,255,fpl)&&fgets(yqm,255,fp2)){〃當(dāng)從fpl和fP2流中讀取255個(gè)字符串?dāng)?shù)據(jù)長(zhǎng)度時(shí)phone[strlen(phone)-2]=0;〃把〇賦值給phone的長(zhǎng)度?2strcat(phone,".txt");〃把txt的內(nèi)容追加給到phone結(jié)尾處(覆蓋dest結(jié)尾處的へ(D并添加、〇’.if((fp3=fopen(phone,"aH))==NULL){printfC'can^openfile:%sH,phone);return1;}〃如果追加打開或創(chuàng)建文本為空fputs(yqm,fp3);〃把fp3的字節(jié)流送到y(tǒng)qm參數(shù)中fclose(fp3);〃關(guān)閉fp3參數(shù)內(nèi)容printf(n%d-Write%s...OK\n",i,phone);i++;)〃遞增輸出phone的字符內(nèi)容fclose(fp2);〃關(guān)閉fp2參數(shù)內(nèi)容fclose(fpl);〃關(guān)閉fpl參數(shù)內(nèi)容printf("Complete!");〃打印完成return〇;〃結(jié)束參數(shù)}文章中涉及到的一些參考fputs函數(shù)名:fputs功能:送ー個(gè)字符串到ー個(gè)流中用法:intfputs(char*string,FILE*stream);程序例:#includeintmain(void){/*writeastringtostandardoutput*/fputs("HelloworldXn”,stdout);return0;)fp=fopen(filename,"a");fseek(fp,O,SEEK_SET);〃我以為此時(shí)光標(biāo)位置是文件開頭,結(jié)果發(fā)現(xiàn)光標(biāo)位置是文件的末尾,也就是說“a”只能以追加方式寫,只能定位到原文件末尾,而不能是原文件中間的某個(gè)位置“r”打開文本文件用于讀“w”創(chuàng)建文本文件用于寫,并刪除已存在的內(nèi)容(如果有的話)“a”追加,打開或創(chuàng)建文本文件,并向文件末尾追加內(nèi)容“r+”打開文件用于更新(即讀和寫)“w+”創(chuàng)建文本文件用于更新,并刪除已存在的內(nèi)容(如果有的話)“a+”追加:打開或創(chuàng)建文本文件用于更新,寫文件是追加到文件末尾。strcat原型:externchar*strcat(char*dest,char*src);用法:#include功能:把src所指字符串添加到dest結(jié)尾處(覆蓋dest結(jié)尾處的‘、〇')并添加へ〇、說明:src和dest所指內(nèi)存區(qū)域不可以重疊且dest必須有足夠的空間來容納src的字符串。返回指向dest的指針。舉例://strcat.c#include#includemain()chard[201=HGoldenGlobal";char來sゴView”;c)rscr();strcat(d,s);printf(u%sn,d);getchar();return0;)程序執(zhí)行結(jié)果為:GoldenGlobalView不知道哪里出了問題程序最后生成的是10位的手機(jī)號(hào)碼。有點(diǎn)郁悶⑴201I年計(jì)算機(jī)等級(jí)考試二級(jí)C++輔導(dǎo)實(shí)例編程(15)快速實(shí)現(xiàn)MFC類瀏覽器使用過VB的人一定會(huì)對(duì)它的對(duì)象瀏覽器有深刻的印象,在VB的對(duì)象瀏覽器中可以方便的查看每個(gè)對(duì)象的屬性、方法和事件,學(xué)習(xí)起VB對(duì)象來非常方便。VC在Windows編程中功能強(qiáng)大,但VC中沒有象VB那樣的對(duì)象瀏覽器,要了解MFC中各個(gè)類的成員時(shí),往往要另外去查ー些資料,查看MFC的源文件也很不方便。我在使用VC的過程中,發(fā)現(xiàn)ー個(gè)快速實(shí)現(xiàn)類瀏覽的方法,使用它不僅可以瀏覽MFC中的各個(gè)類而且可以查看類的各種成員及其源文件。同時(shí),實(shí)現(xiàn)起來又非常簡(jiǎn)單,各位VC的愛好者不妨ー試。首先,在VC中新建一個(gè)空的“Win32Application”工程,然后,把MFC的源文件都加入到工程中,即可在VC中實(shí)現(xiàn)以上功能。具體操作過程如下:運(yùn)行VC,選擇“File”菜單中的“New”;在出現(xiàn)的對(duì)話框中選擇“Win32Application”,填上其它信息后,按“OK”;在出現(xiàn)的對(duì)話框中選擇“Anemptyproject”,按“Finish”;在VC的“Project”菜單中選擇“AddToProject”子菜單中的“Files”;在出的文件對(duì)話框中,找到以下路徑:“VC安裝目錄\MFC\include”,把其中所有擴(kuò)展名為“.h”、".ini”的文件選中(將文件按類型排序時(shí),選擇起來比較容易),按“0k”;同上,再把“VC安裝目錄\MFC\src”中的所有擴(kuò)展名為“.cpp”的文件加入到工程中。(如沒有這個(gè)目錄,請(qǐng)?jiān)诎惭bVC時(shí),選擇安裝源文件)這時(shí)在/r/

溫馨提示

  • 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)論