二级C++实例编程.docx
- 文档编号:7824463
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:67
- 大小:59.21KB
二级C++实例编程.docx
《二级C++实例编程.docx》由会员分享,可在线阅读,更多相关《二级C++实例编程.docx(67页珍藏版)》请在冰豆网上搜索。
二级C++实例编程
C++冒泡排序基本应用技巧分享
对于学过C语言的朋友来说,可能对于里面的冒泡排序还是有很深印象的。
那么今天我们将会为大家介绍一下具有C语言特性的C++语言中冒泡排序的实现方法。
接下来就让我们一起来看看C++冒泡排序的具体操作方法吧。
C++冒泡排序代码示例:
#include
#include
/*
冒泡排序
paramter:
int*pData:
指针数组
intCount:
数组大小
returnvalue:
返回数组的指针
*/
int*BubbleSort(int*pData,intCount)
{intiTemp;for(inti=1;i for(intj=Count-1;j>=i;j--) {if(pData[j] { iTemp=pData[j-1]; pData[j-1]=pData[j]; pData[j]=iTemp; } } } returnpData; } voidmain() { inta[10]={3,2,94,23,34,65,22,33,432,34}; intcount=sizeof(a)/sizeof(a[0]); int*b=BubbleSort(a,count); //定义指针 for(inti=0;i { cout<<*(b+i)< } } 以上就是对C++冒泡排序的相关介绍。 随机化算法——随机数 概率算法的一个基本特征是对所求解问题的同一实例用同一概率算法求解两次可能得到完全不同的效果。 这两次求解问题所需的时间甚至所得到的结果可能会有相当大的差别。 一般情况下,可将概率算法大致分为四类: 数值概率算法,蒙特卡罗(MonteCarlo)算法,拉斯维加斯(LasVegas)算法和舍伍德(Sherwood)算法。 随机数在概率算法设计中扮演着十分重要的角色。 在现实计算机上无法产生真正的随机数,因此在概率算法中使用的随机数都是一定程度上随机的,即伪随机数。 产生随机数最常用的方法是线性同余法。 由线性同余法产生的随机序列a1,a2,…,an满足 1.a0=d 2.an=(b*an-1+c)modm(n=1,2…….) 其中,b>0,c>=0,d>=m。 d称为该随机序列的种子。 一般情况下,取gcd(m,b)=1,因此可取b为一素数。 这是一个随机数类: 代码 constunsignedlongmaxshort=65535L; constunsignedlongmultiplier=1194211693L; constunsignedlongadder=12345L; classRandomNumber{ private: //当前种子 unsignedlongrandSeed; public: //构造函数,默认值0表示由系统自动产生种子 RandomNumber(unsignedlongs=0); //产生0~n-1之间的随机整数 unsignedshortRandom(unsignedlongn); //产生[0,1)之间的随机实数 doublefRandom(); }; //产生种子 RandomNumber: : RandomNumber(unsignedlongs) { if(s==0) randSeed=time(0);//用系统时间产生种子 else randSeed=s; } //产生0~n-1之间的随机整数 unsignedshortRandomNumber: : Random(unsignedlongn) { randSeed=multiplier*randSeed+adder; return(unsignedshort)((randSeed>>16)%n); } //产生[0,1)之间的随机实数 doubleRandomNumber: : fRandom() { returnRandom(maxshort)/double(maxshort); } 利用这个随机数类,写一个程序,模拟抛硬币的实验。 抛10次硬币构成一个事件,每次事件记录得到正面的个数。 反复模拟这个事件50,000次,然后对这50,000L次进行输出频率图,比较每次事件得到正面次数的比例。 以下是总的代码: 头文件RandomNumber.h: 代码 //RandomNumber.h constunsignedlongmaxshort=65535L; constunsignedlongmultiplier=1194211693L; constunsignedlongadder=12345L; #ifndefRANDOMNUMBER_H #defineRANDOMNUMBER_H classRandomNumber{ private: //当前种子 unsignedlongrandSeed; public: //构造函数,默认值0表示由系统自动产生种子 RandomNumber(unsignedlongs=0); //产生0~n-1之间的随机整数 unsignedshortRandom(unsignedlongn); //产生[0,1)之间的随机实数 doublefRandom(); }; #endif 类实现文件RandomNumber.cpp: 代码 //RandomNumber.cpp #include"RandomNumber.h" #include #include #include usingnamespacestd; //产生种子 RandomNumber: : RandomNumber(unsignedlongs) { if(s==0) randSeed=time(0);//用系统时间产生种子 else randSeed=s; } //产生0~n-1之间的随机整数 unsignedshortRandomNumber: : Random(unsignedlongn) { randSeed=multiplier*randSeed+adder; return(unsignedshort)((randSeed>>16)%n); } //产生[0,1)之间的随机实数 doubleRandomNumber: : fRandom() { returnRandom(maxshort)/double(maxshort); } 主文件Main: 代码 //主文件main /* *Author: Tankywoo *Blog: www.WuTianQ *Date: 2010.12.7 *代码来至王晓东《计算机算法设计与分析》 */ #include"RandomNumber.h" #include #include #include usingnamespacestd; intTossCoins(intnumberCoins) { //随机抛硬币 staticRandomNumbercoinToss; inti,tosses=0; for(i=0;i tosses+=coinToss.Random (2); returntosses; } intmain() { //模拟随机抛硬币事件 constintNCOINS=10; constlongNTOSSES=50000L; //heads[i]得到的i次正面的次数 longi,heads[NCOINS+1]; intj,position; //初始化数组heads for(j=0;j heads[j]=0; //重复50,000次模拟事件 for(i=0;i heads[TossCoins(NCOINS)]++; //输出频率图 for(i=0;i<=NCOINS;++i) { position=int(float(heads[i])/NTOSSES*72); cout< for(j=0;j<> cout<<""; cout<<"*"< } return0; } 输出频率图: 两个数论的算法 #include usingnamespacestd; structresult { intd; intx; inty; }; //d=gcd(a,b)=ax+by resultExtendeEuclid(inta,intb) { resultres; if(! b) { res.d=a; res.x=1; res.y=0; 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同余的x voidModularLinearEquationSolver(inta,intb,intn) { if(a<=0||n<=0) { cout<<"参数有错"< } resultre=ExtendeEuclid(a,n); if(b%re.d==0) { intx0=mod(re.x*(b/re.d),n); for(inti=0;i<=re.d-1;i++) { cout<< } } else { cout<<"无解"< } intmain() { ModularLinearEquationSolver(14,30,100); return0; } 常用算法之插入排序(C++版) 1vectorInsertSort(vectorvec) 2{ 3cout<<"请输入整数数列,crtl+z结束输入"< 5while(cin>>a) 6vec.push_back(a); 7intCount=vec.size(); 8 9 10for(inti=1;i 12//将vec[i]插入到正确的位置 13for(intj=i;j>0;j--) 14{ 15vectortemp (1); 16if(vec[j] 18temp[0]=vec[j-1]; 19vec[j-1]=vec[j]; 20vec[j]=temp[0]; 21} 22else 23continue; 24 25} 26} 27for(inti=0;i 30returnvec; 31 32} 常用算法之选择排序(C++版) 1vectorselectSort(vectorivec) 2{ 3intnum; 4cout<<"请输入需要排序的整数序列按下ctrl+z结束输入"< 6ivec.push_back(num); 7intn=ivec.size(); 8 9for(inti=0;i 11intMin=i; 12 13//求ivec[i]与ivec[n]之间的最小值ivec[Min]; 14for(intj=i;j 16 17if(ivec[Min]>ivec[j+1]) 18Min=j+1; 19continue; 20 21} 22 23//交换顺序 24vectortemp (1); 25temp[0]=ivec[i]; 26ivec[i]=ivec[Min]; 27ivec[Min]=temp[0]; 28 29} 30for(inti=0;i 32cout< 34returnivec; 35} 常用算法之冒泡排序(C++版) 其实我认为冒泡是最没有必要说的一个算法,如果连冒泡都不知道的话,我觉得就不能谓之学过算法。 这个应该是属于特别简单的一个算法,很基本,我记得当时我们是讲算法的时候,讲的第一个就是这个冒泡排序。 我也就不多说其他了,我这里写上纯粹是为了一个完整性。 效率O(n*n),稳定排序。 1#include 2usingnamespacestd; 3 4intBubbleSort(int*nData,intlen) 5{ 6boolisOk=false; 7for(inti=0;i 8isOk=true; 9for(intj=len-1;j>i;--j){ 10if(nData[j] 11inttemp=nData[j]; 12nData[j]=nData[j-1]; 13nData[j-1]=temp; 14isOk=false; 15} 16} 17} 18} 19 20intmain() 21{ 22intpData[10]={1,5,9,3,4,7,8,2,6,10}; 23for(inti=0;i<10;++i) 24cout< 输入一个字符串,将其逆序后输出 01#include 02#include 03usingnamespacestd; 04 05voidSetStr(string&str) 06{ 07intlen=str.length(); 08chartemp; 09for(inti=0;i 10{//把字符串的两边一一调换 11temp=str[i]; 12str[i]=str[len-1-i]; 13str[len-1-i]=temp; 14} 15} 16 17intmain() 18{ 19stringa; 20cout<<"input"< 21cin>>a; 22SetStr(a); 23cout< 24return0; 25} C++重载类型转换操作符(typecastoperator) boost: : ref和boost: : cref使用了重载“类型转换(typecast)”操作符来实现使用引用类型来替换模版参数,本文就介绍一下这种操作符的重载方法。 函数原型 T1: : operatorT2()[const]; //T1的成员函数,重载"(T2)a"操作符 1.类型转换重载函数的返回值是隐含的,并且不能显示声明,返回值是与转换的类型相同的,即为上面原型中的T2。 2.不能有参数; 3.支持继承,可以为虚函数; 4.支持使用typedef定义的类型; 先通过一个简单的例子来说明如何使用类型转换重载 1#include 2 3classD{ 4public: 5D(doubled): d_(d){} 6 7/*重载“(int)D”*/ 8operatorint()const{ 9std: : cout<<"(int)dcalled! "< : endl; 10returnstatic_cast(d_); 11} 12 13private: 14doubled_; 15}; 16 17intadd(inta,intb){ 18returna+b; 19} 20 21intmain(){ 22Dd1=1.1; 23Dd2=2.2; 24std: : cout< : endl; 25 26return0; 27} 28 29 在24行执行add(d1,d2)函数时“(int)D”重载函数将被调用,程序运行的输出为: (int)dcalled! (int)dcalled! 3 类型转换操作符vs类型转换构造函数(conversionconstructor) 有时候使用conversionconstructor就能实现类型转换,这种方式效率更高而且也更直观,下面举例说明: 1#include 2 3classA 4{ 5public: 6A(intnum=0): dat(num){} 7 8/*重载"(int)a"*/ 9operatorint(){returndat;} 10 11private: 12intdat; 13}; 14 15 16classX 17{ 18public: 19X(intnum=0): dat(num){} 20 21/*重载"(int)a"*/ 22operatorint(){returndat;} 23 24/*重载"(A)a"*/ 25operatorA(){ 26Atemp=dat; 27returntemp; 28} 29 30private: 31intdat; 32}; 33 34 35intmain() 36{ 37Xstuff=37; 38Amore=0; 39inthold; 40 41hold=stuff;//convertX: : stufftoint 42std: : cout< : endl; 43 44more=stuff;//convertX: : stufftoA: : more 45std: : cout< : endl;//convertA: : moretoint 46 47return0; 48} 49 上面这个程序中X类通过重载“operatorA()”来实现将X类型对象转换成A类型,这种方式需要先创建一个临时A对象再用它去赋值目标对象;更好的方式是为A类增加一个构造函数: A(constX&rhs): dat(rhs){} 同时,请注意上面程序的第45行more的类型在调用std: : cout时被隐式地转成了int! 一个简单boost: : ref实现 通过重载typecastoperator,我们就可以自己实现一个简版的boost: : ref。 1#include 2 3template 4classRefHolder 5{ 6public: 7RefHolder(T&ref): ref_(ref){} 8 9/*重载“(T&)A”操作符*/ 10operatorT&()const{ 11returnref_; 12} 13 14private: 15T&ref_; 16}; 17 18 19template 20inlineRefHolderByRef(T&t){ 21returnRefHolder(t); 22} 23 24intinc(int&num){ 25num++; 26returnnum; 27} 28 29 30intmain(){ 31intn=1; 32std: : cout< : endl;//RefHolder被转换成了"int&"类型 33 34retu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二级 C+ 实例 编程
![提示](https://static.bdocx.com/images/bang_tan.gif)