2011计算机等级考试二级C++辅导实例编程汇总_第1页
2011计算机等级考试二级C++辅导实例编程汇总_第2页
2011计算机等级考试二级C++辅导实例编程汇总_第3页
2011计算机等级考试二级C++辅导实例编程汇总_第4页
免费预览已结束,剩余120页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

201I年计算机等级考试二级C++辅导实例编程(1)C++冒泡排序基本应用技巧分享对于学过C语言的朋友来说,可能对于里面的冒泡排序还是有很深印象的。那么今天我们将会为大家介绍一下具有C语言特性的C++语言中冒泡排序的实现方法。接下来就让我们ー起来看看C++冒泡排序的具体操作方法吧。C++冒泡排序代码示例:#include<iostream.h>#include<stdio.h>俨冒泡排序paramter:int*pDala:指针数组intCount:数组大小returnvalue:返回数组的指针ツ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;)}以上就是对C++冒泡排序的相关介绍201I年计算机等级考试二级C++辅导实例编程(2)随机化算法——随机数概率算法的一个基本特征是对所求解问题的同一实例用同・概率算法求解两次可能得到完全不同的效果。这两次求解问题所需的时间甚至所得到的结果可能会有相当大的差别。一般情况下,可将概率算法大致分为四类:数值概率算法,蒙特卡罗(MonteCarlo)算法,拉斯维加斯(LasVegas)算法和舍伍徳(Sherwood)算法。随机数在概率算法设计中扮演着十分重要的角色。在现实计算机上无法产生真正的随机数,因此在概率算法中使用的随机数都是一定程度上随机的,即伪随机数。产生随机数最常用的方法是线性同余法。由线性同余法产生的随机序列a1,a2,...,an满足.aO=d.an=(b*an-1+c)modm(n=l,2 )其中,b>0,c>=0,d>=m0d称为该随机序列的种子。一”般情况下,取gcd(m,b)=l,因此可取b为一素数。这是一个随机数类:代码constunsignedlongmaxshort=65535L;constunsignedlongmultiplier=1194211693L;constunsignedlongadder=12345L;classRandomNumber{private:/Z当前种子unsignedlongrandSeed;public:〃构造函数,默认值〇表示山系统自动产生种子RandomNumber(unsignedlongs=0);〃产生〇〜n-1之间的随机整数unsignedshortRandom(unsignedlongn);/Z产生[〇,1)之间的随机实数double(RandomO;};/Z产生种子RandomNumber::RandoniNumber(unsignedlongs)(if(s=0)randSeed=time(0);〃用系统时间产生种子elserandSeed=s;)〃产生0~n-1之间的随机整数unsignedshortRandomNumber::Random(unsignedlongn)(randSeed=multiplier*randSeed+adder;return(unsignedshort)((randSeed»16)%n);/Z产生[0,1)之间的随机实数doubleRandomNumber::fRandom(){returnRandom(maxshort)/double(maxshort);}利用这个随机数类,写ー个程序,模拟抛硬币的实验。抛1。次硬币构成一个事件,每次事件记录得到正面的个数。反复模拟这个事件50,000次,然后对这50,000L次进行输出频率闇,比较每次事件得到正面次数的比例。以下是总的代码:头文件RandomNumber.h:代码//RandomNumber.hconstunsignedlongmaxshort=65535L;constunsignedlongmultiplier=1194211693L;constunsignedlongadder=12345L;#ifndefRANDOMNUMBER.H#defineRANDOMNUMBERHclassRandomNumber{private:/Z当前种子unsignedlongrandSeed;public:〃构造函数,默认值〇表示由系统自动产生种子RandomNumber(unsignedlongs=0);〃产生〇〜n-1之间的随机整数unsignedshortRandom(unsignedlongn);/Z产生[0,1)之间的随机实数doublefRandom();#endif类实现文件RandomNumber.cpp:代码//RandomNumber.cpp#include"RandomNumber.h1'#include#include#includeusingnamespacestd;/Z产生种子RandomNumber::RandomNumber(unsignedlongs){if(s=0)randSeed=time(〇);〃用系统时间产生种子elserandSeed=s;}〃产生〇~n-1之间的随机整数unsignedshortRandomNumber::Random(unsignedlongn)randSeed=multiplier*randSeed+adder;return(unsignedshort)((randSeed»16)%n);}/Z产生[0,1)之间的随机实数doubleRandomNumber::fRandom(){returnRandom(maxshort)/double(maxshort);}主文件Main:代码//主文件main*Author:Tankywoo*Blog:www.WuTianQ*Date:2010.12.7・代码来至王晓东《计算机算法设计与分析》*/#include"RandomNumber.h"#include#include#includeusingnamespacestd;intTossCoins(intnumberCoins){/Z随机抛硬帀staticRandomNumbercoinToss;inti,tosses=0;for(i=0;i<numberCoins;++i)tosses+=coinToss.Random(2);returntosses;intmain()/Z模拟随机抛硬币事件constintNCOINS=10;constlongNTOSSES=50000L;//heads【i]得到的i次正面的次数longi,heads[NCOINS+1];intj,position;/Z初始化数组headsfor(j=0;j<NCOINS+1;++j)heads[j]=0;/Z重复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年计算机等级考试二级C++辅导实例编程(3)两个数论的算法#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;}〃计算满足ax和b关于n同余的xvoidModularLinearEquationSolver(intajntb,intn)if(a<=0lln<=0)coutvv”参数有错"<<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年计算机等级考试二级C++辅导实例编程(4)常用算法之插入排序(C++版)vectorInsertSort(vectorvec){cout«”请输入整数数列,crtl+z结束输入"<<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年计算机等级考试二级C++辅导实例编程⑸常用算法之选择排序(C++版)1vectorselectSort(vectorivec)cout<<”请输入需要排序的整数序列按下ctrl+z结束输入,«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年计算机等级考试二级C++辅导实例编程⑹常用算法之冒泡排序(C++版)其实我认为冒泡是最没有必要说的ー个算法,如果连冒泡都不知道的话,我觉得就不能谓之学过算法。这个应该是属于特别简单的ー个算法,很基本,我记得当时我们是讲算法的时候,讲的第一个就是这个冒泡排序。我也就不多说其他了,我这里写上纯粹是为了一个完整性。效率O(n*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年计算机等级考试二级C++辅导实例编程⑺输入ー个字符串,将其逆序后输出

#mcludeusingnamespacestd;voidSetStr(string&str)(intlen=str.length();chartemp;for(inti=0;i{〃把字符串的两边ーー调换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年计算机等级考试二级C++辅导实例编程(8)C++重载类型转换操作符(typecastoperator)boost::ref和boost::cref使用了重载“类型转换(typecast)”操作符来实现使用引用类型来替换模版参数,本文就介绍一下这种操作符的重载方法。函数原型Tl::operatorT2()[const];//T1的成员函数,重载"(T2)a"操作符1.类型转换重载函数的返回值是隐含的,并且不能显示声明,返回值是与转换的类型相同的,即为上面原.支持继承,可以为虚函数;.支持使用typedef定义的类型;先通过一个简单的例子来说明如何使用类型转换重载#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行执行add(dl,d2)函数时"(int)D”重我函数将被调用,程序运行的输出为:(int)dcalled!(int)dcalled!3类型转换操作符vs类型转换构造函数(conversionconstructor)有时候使用conversionconstructor就能实现类型转换,这种方式效率更高而且也更直观,下面举例说明:#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上面这个程序中X类通过重载“operatorA()”来实现将X类型对象转换成A类型,这种方式需耍先创建一个临时A对象再用它去赋值H标対象;更好的方式是为A类增加一个构造函数:A(constX&rhs):dat(rhs){}同时,请注意上面程序的第45行more的类型在调用std::cout时被隐式地转成了int!ー个简单boost::ref实现通过重载typecastoperator»我们就可以自己实现ー个简版的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被转换成了“int&”类型return0;201I年计算机等级考试二级C++辅导实例编程⑼大整数阶乘问题的递推算法〃:========="大整数阶乘,问题的递推算法=========#defineMAXN1000 〃最大数据位数〃用递推法求取整数k的阶乖,将结果放入数组array中voidpnext(intarray[],intk){int*temp;〃动态数组[临时存储运算大整数]inti,j,num_len=array[0],carry,t;〃循环变量,长整数位数,进位标志,临时变量if(array[0]>=MAXN){printfT数据处理位数超过程序设计上限,程序将自动中断运行!'n)exit(l);}temp=(int*)malloc(sizeof(int)*(num_len+1));〃创建动态数组for(i=1;i<=num_len;i++)temp[i]=ai-ray[il; 〃保存原始数据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;//处理最高位〃数据位调整array[i]=t%10;carry=t/10;)if(carry)aiTay[++num_len]=carry;〃在最高位记录进位标志free(temp);array[0]=num_len;〃显示阶乖结果voidShow_Result(intarray[],intbase_number)(inti;printf("M!=n,base_number);for(i=array[0];i>0;i-)printf(”%d”,array国);printf(''\n\nM);}〃计算数据的阶乘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);}}〃:========="大整数阶乘”问题的递推算法=====201I年计算机等级考试二级C++辅导实例编程(10)大整数阶乘的算法思路这里的大整数指大于500以上的整数,当然更大也可以。由于整数阶乘递增的很快,远大于指数式递增,对于小整数,比如20,30左右,可以直接使用比如递归的方式进行,这很基本。但是当整数较大时,阶乘的结果很大,远非ー个int或者long就能存的下的,比如1000的阶乘结果有上千位。所以大整数阶乘设计的关键点就是存储大整数,当选择了存储大整数,那么整数的乘法运算也不能再依靠・了,所以还要重新设计大整数的惩罚运算。上面是我的设计思路。网上找过相关的文章,有高手以4行代码完成了该算法,确实佩服!当然这涉及了算法的优化,不管那么多J',这里要的就是以尽量清晰地思路快速设计该算法,这是使用了STL标准库的容器。下面是我的算法代码,直接贴这里了,注意看相关的注释:#include#includeusingnamespacestd;〃传入整数:int,和整数」的阶乘结果,进行相乘的结果/Z结构依然存储到容器中voidCalc(intnum,vector&calcresult){vectortempnum;vectorrest;/Z将传入的int拆分之后保存到容器中do(tempnum.push_back(num%10);num=num/10;}while(num);/Z将分拆之后的num进行乘法计算unsignedinti=0,j=0;for(i=0;i<tempnum.size();++i)(intcarry=O-J!存储每位计算时来自低位的进位for(j=0;j<calcresult.size();++j){intbitl=0,bit2=0,res=0;bitl=calcresult[j];bit2=tempnum[i];res=bitl*bi⑵//保存当前位if((i+j){/Z临时结果中有对应位存在,则直接更新rest[i+j]+=(res+carry)%10;else(/Z没有对应位则需要添加rest.push_back((res+carry)%10);}/Z有进位,则更新进位carry=(res+carry)/10;}//如果计算之后还有最高位的进位,那么则直接添加进去if(carry){//保存当前位if((i+j)/Z临时结果中有对应位存在,则直接更新rest[i+j]+=carry;else/Z没有对应位则需要添加rest.push_back(carry);}|}//上述计算之后,会出现有些位的数字超过了10,那是因为在处理每一位运算结果之后//相加时地位向高位可能存在进位,上面没有考虑,所以需要进行调整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将计算结果存储到原来的容器中calcresult.clear();for(i=0;i<rest.size();++i)calcresull.push_back(rest[i]);}intmain(){intnum=0;vectorcalcresult;/Z将初值1赋进去calcresult.push_back(1);/Z获取欲求阶乘的整数coutcぐ输入欲求阶乘的整数:"<cin»num;for(inti=0;i<num;++i)Calc(i+1,calcresult);/Z输出计算结果cout<for(unsignedinti=calcresult.size();i>0i)(cout<}cout<return0;}2011年计算机等级考试二级C++辅导实例编程(11)动态生成二维数组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年计算机等级考试二级C++辅导实例编程(12)数组中第二大数01〃找出数组中第二大数。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年计算机等级考试二级C++辅导实例编程(13)C++异常处理机制示例及讲解ド面的代码直接贴到你的console工程中,可以运行调试看看效果,并分析C++的异常机制。#include"stdafx.h"#include#include#include//内存泄露检测机制#define_CRTDBG_MAP_ALLOC#ifdef-DEBUG#definenewnew(_NORMAL_BLOCK,_FILE_,_LINE_)#endif//自定义异常类classMyExcepction|public://构造函数,参数为错误代码MyExcepction(interrorld){/Z输出构造函数被调用信息std::cout«',MyExcepctioniscalled"«std::endl;m_errorld=errorld;/Z拷贝构造函数MyExcepction(MyExcepction&myExp){/Z输出拷贝构造函数被调用信息std::cout«”copyconstructiscalled"«std::endl;this->m_errorld=myExp.m_errorld;|-MyExcepction(){/Z输出析构函数被调用信息std::cout«"~MyExcepctioniscalled"«std::endl;}/Z获取错误码intgetErrorId()returnm_errorld;private:/Z错误码intm_errorld;};intmain(intargc,char*argv[]){//内存泄露检测机制_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DFI_CRTDBG_LEAK_CHECK_DF);/Z可以改变错误码,以便抛出不同的异常进行测试intthrowErrorCode=110;std::cout«”inputtestcode:"«std::endl;std::cin»throwErrorCode;tryif(throwErrorCode=110)MyExcepctionmyStru(l10);/Z抛出对象的地址•>山catch(MyExcepction*pMyExcepction)捕获/Z这里该对象的地址抛出给catch语句,不会调用对象的拷贝构造函数/Z传地址是提倡的做法,不会频繁地调用该对象的构造函数或拷贝构造函数//catch语句执行结束后,myStru会被析构掉throw&myStru;}elseif(throwErrorCode=119)(MyExcepctionmyStru(l19);/Z抛出对象,这里会通过拷贝构造函数创建一个临时的对象传出给catch/Z由catch(MyExcepctionmyExcepction)捕获//在catch语句中会再次调用通过拷贝构造函数创建临时对象复制这里传过去的对象//throw结束后myStru会被析构掉throwmyStru;elseif(throwErrorCode==120)(/Z不提倡这样的抛出方法/Z这样做的话,如果calch(MyExcepction*pMyExcepction)中不执行delete操作则会发生内存泄露//illcatch(MyExcepction*pMyExcepction)捕获MyExcepction*pMyStru=newMyExcepction(120);throwpMyStru;}else{//直接创建新对象抛出//相当于创建了临时的对象传递给了catch语句/Z由catch接收时通过拷贝构造函数再次创建临时对象接收传递过去的对象throwMyExcepction(throwErrorCode);catch(MyExcepction*pMyExcepction)(/Z输出本语句被执行信息std::cout«"执行了catch(MyExcepction*pMyExcepction)"«std::endl;/Z输出错误信息std::cout«"errorCode:"«pMyExcepction->getErrorId()«std::endl;/Z异常抛出的新对象并非创建在函数栈上,而是创建在专用的异常栈上,不需要进行delete//deletepMyExcepction;)catch(MyExcepctionmyExcepction){/Z输出本语句被执行信息std::cout«”执イ丁Tcatch(MyExcepctionmyExcepction)”«std::endl;/Z输出错误信息std::cout«”errorCode:“«myExcepction.getErrorId()«std::endl;}catch(...)(/Z输出本语句被执行信息std::cout«”执仃了catch(...)”«std::endl;/Z处理不了,重新抛出给上级throw;}/Z暂停inttemp;std::cin»temp;return0;}知识点:C++异常机制ー、概述C++自身有着非常强的纠错能力,发展到如今,已经建立了比较完善的异常处理机制。C++的异常情况无非两种,ー种是语法错误,即程序中出现了错误的语句,函数,结构和类,致使编译程序无法进行。另ー种是运行时发生的错误,一般与算法有关。关于语法错误,不必多说,写代码时心细一点就可以解决。C++编译器的报错机制可以让我们轻松地解决这些错误。第二种是运行时的错误,常见的有文件打开失败、数组下标溢出、系统内存不足等等。而・旦出现这些问题,引发算法失效、程序运行时无故停止等故障也是常有的。这就要求我们在设计软件算法时要全面。比如针对文件打开失败的情况,保护的方法有很多种,最简单的就是使用“return”命令,告诉上层调用者函数执行失败;另外一种处理策略就是利用C++的异常机制,抛出异常。二、C++异常处理机制C++异常处理机制是ー个用来有效地处理运行错误的非常强大且灵活的工具,它提供了更多的弹性、安全性和稳固性,克服了传统方法所带来的问题.异常的抛出和处理主要使用了以下三个关键字:try、throw、catch〇抛出异常即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常。该语句的格式为:throw表达式;如果在try语句块的程序段中(包括在其中调用的函数)发现了异常,且抛弃了该异常,则这全异常就可以被try语句块后的某个catch语句所捕获并处理,捕获和处理的条件是被抛弃的异常的类型与catch语句的异常类型相匹配。由于C++使用数据类型来区分不同的异常,因此在判断异常时,throw语句中的表达式的值就没有实际意义,而表达式的类型就特别重要。try-catch语句形式如下:try(包含可能抛出异常的语句;)catch(类型名【形参名])〃捕获特定类型的异常()catch(类型名[形参名])〃捕获特定类型的异常catch(...)//三个点则表示捕获所有类型的异常[范例]]处理除数为0的异常。该范例将上述除数为0的异常可以用try/catch语句来捕获异常,并使用throw语句来抛出异常,从而实现异常处理,实现代码如代码淸单1-1所示。〃代码清单1-1include〃包含头文件#includedoublefuc(doublex,doubley)〃定义函数{if(y==O){throwy;〃除数为0,抛出异常}returnx/y;〃否则返回两个数的商)voidmain(){doubleres;try〃定义异常1516res=fuc(2,3);cout«nTheresultofx/yis:n«RES«ENDL;<p>res=fuc(4,0);〃出现异常,函数内部会抛出异常)catch(double)〃捕获并处理异常(cerr«Herrorofdividingzero.'n";exit(l);〃异常退出程序})【范例2】自定义异常类型(在本文开始的代码中已经给出示范)三、异常的接口声明为了加强程序的可读性,使函数的用户能够方便地知道所使用的函数会抛出哪些异常,可以在函数的声明中列出这个函数可能抛出的所有异常类型,例如:voidfun()throw(A,B,C,D);这表明函数fun()可能并且只可能抛出类型(A,B,C,D)及其子类型的异常。如果在函数的声明中没有包括异常的接口声明,则此函数可以抛出任何类型的异常,例如:voidfun();ー个不会抛出任何类型异常的函数可以进行如下形式的声明:voidfun()thow();五、异常处理中需要注意的问题.如果抛岀的异常一直没有函数捕获(catch),则会一直上传到C++运行系统那里,导致整个程序的终止.一般在异常抛出后资源可以正常被释放,但注意如果在类的构造函数中抛出异常,系统是不会调用它的析构函数的,处理方法是:如果在构造函数中要抛出异常,则在抛出前要记得删除申请的资源。.异常处理仅仅通过类型而不是通过值来匹配的,所以catch块的参数可以没有参数名称,只需要参数类型。.函数原型中的异常说明要与实现中的异常说明・致,否则容易引起异常冲突。.应该在throw语句后写上异常对象时,throw先通过Copy构造函数构造ー个新对象,再把该新对象传递给catch.那么当异常抛出后新对象如何释放?异常处理机制保证:异常抛出的新对象并非创建在函数栈上,而是创建在专用的异常栈上,因此它オ可以跨接多个函数而传递到上层,否则在栈清空的过程中就会被销毁。所有从try到throw语句之间构造起来的对象的析构函数将被自动调用。但如果一直上溯到main函数后还没有找到匹配的catch块,那么系统调用terminate()终止整个程序,这种情况下不能保证所有局部对象会被正确地销毁。.catch块的参数推荐采用地址传递而不是值传递,不仅可以提高效率,还可以利用对象的多态性。另外,派生类的异常扑获要放到父类异常扑获的前面,否则,派生类的异常无法被扑获。.编写异常说明时,耍确保派生类成员函数的异常说明和基类成员函数的异常说明一致,即派生类改写的虚函数的异常说明至少要和对应的基类虚函数的异常说明相同,甚至更加严格,更特殊。201I年计算机等级考试二级C++辅导实例编程(14)生成手机号码文本C++程序源码//makeyqm.cpp:定义控制台应用程序的入口点。//#include"stdafx.h*'includenstdio.hn#include"stdlib.h"inti=l;int_tmain(intargc,_TCHAR*argv[])//主程序」main支持unicode别名,定义一个整形argc记录参数个数//-TCHAR*argv[]则是所有参数的一个数组(if(argc!=3){printf(nUSAGE:MAKEYQMphonefileyqmfile");return1;)〃如果发现参数不等于3个就提示USAGE:MAKEYQMphonefileyqmfileHLE*fpl,*fp2,*fp3;if((fpl=fdpen(argv[l],V))==NULL){printf(Bcan,topenfile:%sH,argv[l]);return1;)〃如果读取第一个参数为空,就打印不能打开该文件if((fp2=fopen(argv[2],Hr"))==NULL){printf("can*topenfile:%sM,argv[2]);return1;}〃如果读取第二个参数为空,就打印不能打开该文件charphone[255],yqm[255];〃定义两个数组phone,yqmwhile(fgets(phone,255,fpl)&&fgets(yqm,255,fp2)){〃当从fpl和fP2流中读取255个字符串数据长度时phone[strlen(phone)-2]=0;〃把〇赋值给phone的长度・2strcat(phone,".txt");〃把txt的内容追加给到phone结尾处(覆盖dest结尾处的へ(D并添加、〇’.if((fp3=fopen(phone,"aH))==NULL){printfC'can^openfile:%sH,phone);return1;}〃如果追加打开或创建文本为空fputs(yqm,fp3);〃把fp3的字节流送到yqm参数中fclose(fp3);〃关闭fp3参数内容printf(n%d-Write%s...OK\n",i,phone);i++;)〃递增输出phone的字符内容fclose(fp2);〃关闭fp2参数内容fclose(fpl);〃关闭fpl参数内容printf("Complete!");〃打印完成return〇;〃结束参数}文章中涉及到的一些参考fputs函数名:fputs功能:送ー个字符串到ー个流中用法:intfputs(char*string,FILE*stream);程序例:#includeintmain(void){/*writeastringtostandardoutput*/fputs("HelloworldXn”,stdout);return0;)fp=fopen(filename,"a");fseek(fp,O,SEEK_SET);〃我以为此时光标位置是文件开头,结果发现光标位置是文件的末尾,也就是说“a”只能以追加方式写,只能定位到原文件末尾,而不能是原文件中间的某个位置“r”打开文本文件用于读“w”创建文本文件用于写,并删除已存在的内容(如果有的话)“a”追加,打开或创建文本文件,并向文件末尾追加内容“r+”打开文件用于更新(即读和写)“w+”创建文本文件用于更新,并删除已存在的内容(如果有的话)“a+”追加:打开或创建文本文件用于更新,写文件是追加到文件末尾。strcat原型:externchar*strcat(char*dest,char*src);用法:#include功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的‘、〇')并添加へ〇、说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。举例://strcat.c#include#includemain()chard[201=HGoldenGlobal";char來sゴView”;c)rscr();strcat(d,s);printf(u%sn,d);getchar();return0;)程序执行结果为:GoldenGlobalView不知道哪里出了问题程序最后生成的是10位的手机号码。有点郁闷⑴201I年计算机等级考试二级C++辅导实例编程(15)快速实现MFC类浏览器使用过VB的人一定会对它的对象浏览器有深刻的印象,在VB的对象浏览器中可以方便的查看每个对象的属性、方法和事件,学习起VB对象来非常方便。VC在Windows编程中功能强大,但VC中没有象VB那样的对象浏览器,要了解MFC中各个类的成员时,往往要另外去查ー些资料,查看MFC的源文件也很不方便。我在使用VC的过程中,发现ー个快速实现类浏览的方法,使用它不仅可以浏览MFC中的各个类而且可以查看类的各种成员及其源文件。同时,实现起来又非常简单,各位VC的爱好者不妨ー试。首先,在VC中新建一个空的“Win32Application”工程,然后,把MFC的源文件都加入到工程中,即可在VC中实现以上功能。具体操作过程如下:运行VC,选择“File”菜单中的“New”;在出现的对话框中选择“Win32Application”,填上其它信息后,按“OK”;在出现的对话框中选择“Anemptyproject”,按“Finish”;在VC的“Project”菜单中选择“AddToProject”子菜单中的“Files”;在出的文件对话框中,找到以下路径:“VC安装目录\MFC\include”,把其中所有扩展名为“.h”、".ini”的文件选中(将文件按类型排序时,选择起来比较容易),按“0k”;同上,再把“VC安装目录\MFC\src”中的所有扩展名为“.cpp”的文件加入到工程中。(如没有这个目录,请在安装VC时,选择安装源文件)这时在/r/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论