《C++编程实例.pdf》由会员分享,可在线阅读,更多相关《C++编程实例.pdf(50页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、例 313 求 Fibonacci数列前 40 个数。这个数列有如下特点:第1、 2 个数为 1、1。从第 3 个数开始,每个数是其前面两个数之和。#include #include using namespace std; int main( ) long f1,f2; int i; f1=f2=1; for( i=1; i=20; i+ ) / 设备输出字段宽度为12,每次输出两个数coutsetw(12)f1setw(12)f2; / 每输出完4 个数后换行,使每行输出4 个数if(i%2=0) coutendl; f1=f1+f2; /左边的 f1 代表第 3 个数,是第1、2 个数之
2、和f2=f2+f1; /左边的 f2 代表第 4 个数,是第2、3 个数之和 return 0; 例 314 100200 间的素数#include #include #include using namespace std; int main() int m,k,i,n=0; bool prime; for(m=101;m=200;m=m+2) prime=true; k=int(sqrt(m); for(i=2;i=k;i+) if(m%i=0) prime =false; break; if(prime) cout setw(5) m; n=n+1; if(n%10=0) cout en
3、dl; cout endl;return 0; 例 315 译密码#include using namespace std; int main() char c; while (c=getchar()!=n) if(c=a&c=A&cZ&cz) c=c-26; coutc; coutendl; return 0; 习题:16、统计个数#include using namespace std; int main () char c; int letters=0,space=0,digit=0,other=0; coutenter one line:=a & c=A & c=0 & c=9) di
4、git+; else other+; coutletter:letters, space:space, digit:digit, other:otherendl; return 0; 17、求 Sn=a+aa+aaa+ +aaa(n 个 a)的值, n 由键盘输入。#include using namespace std; int main () int a,n,i=1,sn=0,tn=0; coutan; while (i=n) tn=tn+a; /赋值后的tn 为 i 个 a 组成数的值 sn=sn+tn; /赋值后的sn 为多项式前i 项之和 a=a*10; +i; couta+aa+a
5、aa+.=snendl; return 0; 18、 . 求 1!+2! +20! 、#include using namespace std; int main () float s=0,t=1; int n; for (n=1;n=20;n+) t=t*n; / 求 n! s=s+t; / 将各项累加 cout1!+2!+.+20!=sendl; return 0; 19、求“水仙花数”例153=13+33+53 #include using namespace std; int main () int i,j,k,n; coutnarcissus numbers are:endl; fo
6、r (n=100;n1000;n+) i=n/100; j=n/10-i*10; k=n%10; if (n = i*i*i + j*j*j + k*k*k) coutn ; coutendl; return 0; 20、找出 1000 之内所有的完数例如6 的因子是1.2.3而 6=1+2+3,所以 6 是完数#include using namespace std; int main() int m,s,i; for (m=2;m1000;m+) s=0; for (i=1;im;i+) if (m%i)=0) s=s+i; if(s=m) coutm is a完数 endl; couti
7、ts factors are:; for (i=1;im;i+) if (m%i=0) couti ; coutendl; return 0; 21、 2/1, 3/2, 5/3, 8/5, 13/8, 21/13,前 20 项之和#include using namespace std; int main() int i,t,n=20; double a=2,b=1,s=0; for (i=1;i=n;i+) s=s+a/b; t=a; a=a+b; / 将前一项分子与分母之和作为下一项的分子 b=t; / 将前一项的分子作为下一项的分母 coutsum=sendl; return 0; 2
8、4、输出图形#include using namespace std; int main() int i,k; for (i=0;i=3;i+) / 输出上面4 行*号 for (k=0;k=2*i;k+) cout*; / 输出 * 号 coutendl; /输出完一行 *号后换行 for (i=0;i=2;i+) / 输出下面3 行* 号 for (k=0;k=4-2*i;k+) cout*; / 输出 * 号 coutendl; / 输出完一行 * 号后换行 return 0; 习题:1、求最大公约数和最小公倍数,用主函数条用两个函数 #include using namespace s
9、td; int main() int hcf(int,int); int lcd(int,int,int); int u,v,h,l; cinuv; h=hcf(u,v); coutH.C.F=hendl; l=lcd(u,v,h); coutL.C.D=lu) t=u;u=v;v=t; while (r=u%v)!=0) u=v; v=r; return(v); int lcd(int u,int v,int h) return(u*v/h); 3、判别素数的函数 #include using namespace std; int main() int prime(int); /* 函数原型
10、声明 */ int n; coutn; if (prime(n) coutn is a prime.endl; else coutn is not a prime.endl; return 0; int prime(int n) int flag=1,i; for (i=2;in/2 & flag=1;i+) if (n%i=0) flag=0; return(flag); 4、. 求 a!+b!+c!的值,用一个函数fac (n)求 n! 。4 #include using namespace std; int main() int fac(int); int a,b,c,sum=0; co
11、utabc; sum=sum+fac(a)+fac(b)+fac(c); couta!+b!+c!=sumendl; return 0; int fac(int n) int f=1; for (int i=1;i=n;i+) f=f*i; return f; 7、. 验证哥德巴赫猜想:一个不小于6 的偶数可以表示为两个素数之和。7 #include #include using namespace std; int main() void godbaha(int); int n; coutn; godbaha(n); return 0; void godbaha(int n) int pri
12、me(int); int a,b; for(a=3;a=n/2;a=a+2) if(prime(a) b=n-a; if (prime(b) coutn=a+bendl; int prime(int m) int i,k=sqrt(m); for(i=2;ik) return 1; else return 0; 11、用递归方法求f(n)=12+22+ +n2 #include using namespace std; int main() int f(int); int n,s; coutn; s=f(n); coutThe result is sendl; return 0; int f(
13、int n) if (n=1) return 1; else return (n*n+f(n-1); 例 52 用数组 Fibonacci数列#include #include using namespace std; int main () int i; int f20=1,1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i=0;i20;i+) if(i%5=0)coutendl; coutsetw(8)fi; coutendl; return 0; 例 5.3 用冒泡法对10 个数排序#include using namespace std; int main(
14、) int a10; int i,j,t; coutinput 10 numbers :endl; for (i=0;iai; coutendl; for (j=0;j9;j+) /共进行 9 趟比较for(i=0;iai+1) /如果前面的数大于后面的数 t=ai;ai=ai+1;ai+1=t; /交换两个数的位置,使小数上浮 coutthe sorted numbers :endl; for(i=0;i10;i+) /输出 10 个数 coutai ; coutendl; return 0; 例 54 将二维数组行列元素互换,存到另一个数组中a=1 2 3 5 6 b=1 4 2 5 3
15、6 #include using namespace std; int main() int a23=1,2,3,4,5,6; int b32,i,j; coutarray a:endl; for(i=0;i=1;i+) for(j=0;j=2;j+) coutaij ; bji=aij; coutendl; coutarray b:“endl; for(i=0;i=2;i+) for(j=0;j=1;j+) coutbij ; coutendl; return 0; 例 55 求 3 4 二维数组中最大元素值及其行列号#include using namespace std; int mai
16、n() int i,j,row=0,colum=0,max; int a34=5,12,23,56,19,28,37,46,-12,-34,6,8; max=a00; /使 max开始时取a0 0的值 for(i=0;i=2;i+) /从第 0 行第 2 行for(j=0;jmax) /如果某元素大于max max=aij; /max将取该元素的值row=i; /记下该元素的行号i colum=j; /记下该元素的列号j coutmax= max ,row=row ,colum=columendl; return 0; 例 5.7 用选择法对数组中10 个整数按由小到大排序#include u
17、sing namespace std; int main( ) void select_sort(int array,int n); /函数声明int a10,i; coutenter the originl array: endl; for(i=0;iai; coutendl; select_sort( a ,10); /函数调用,数组名作实参 coutthe sorted array: endl; for(i=0;i10;i+) /输出 10 个已排好序的数 coutai ; coutendl; return 0; void select_sort(int array,int n) /形参
18、 array 是数组名 int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; t=arrayk;arrayk=arrayi;arrayi=t; 习题:6、打印出杨辉三角(要求打印出10 行)#include #include using namespace std; int main() const int n=11; int i,j,ann; for (i=1;in;i+) aii=1; ai1=1; for (i=3;in;i+) for (j=2;j=i-1;j+) aij=ai-1j-1+ai
19、-1j; for (i=1;in;i+) for (j=1;j=i;j+) coutsetw(5)aij ; coutendl; coutendl; return 0; C语言部分1. 编程计算1, 1+2, 1+2+3, , 1+2+3+ +n 各项值的积答案:#include using namespace std; void main() int i,n,mul=1,sum=0; coutn; for (i=1;i=n;i+) sum+=i; mul*=sum; coutThe multiple is:mulj) return i; else return j; char max(cha
20、r c1,char c2,char c3) char ch; if (c1c2) ch=c1; else ch=c2; if (c3ch) ch=c3; return ch; float max(float x,float y) if (xy) return x; else return y; double max(double x1,double x2,double x3) double y; if (x1x2) y=x1; else y=x2; if (x3y) y=x3; return y; 3. 请编写一个函数int find(char s,char t),该函数在字符串s 中查找字符
21、串t ,如果找到,则返回字符串t 在字符串s 中的位置(整数值) ;否则返回 -1。注意:用数组方式及两重循环来实现该函数。答案:int find(char s,char t) int i,j,slen,tlen; slen=strlen(s); tlen=strlen(t); i=0;j=0; while (islen & j=tlen) return i-tlen+1; else return -1; 4. 写一程序,将字符串 a 的所有字符传送到字符串b中, 要求每传送3个字符后放一个空格,例如,字符串a 为” abcdefg ” ,则 b 为” abc deg g ” 。答案:#inc
22、lude #include #define N 40 void fun(char s,char t) int i=0,j=0; while(si) tj=si; i+; j+; if (i)%3=0) tj= ; j+; tj=0; main() char aN,bN; printf(请输入原始字符串a: ); gets(a); fun(a,b); printf(加入空格后的字符串b: ); puts(b); 5. 编程判断一个数是否为素数。答案:#include #include using namespace std; int prime(int m) int i,flag=1; for
23、(i=2;i=int(sqrt(m);i+) if (m%i=0) flag=0; break; return flag; int main(void) int n; coutn; if (prime(n) coutn 是素数 !endl; else coutn 不是素数 !endl; return 0; 6. 编程打印九九乘法表: 1 1=1 1 2=2 2 2=4 1 3=3 2 3=6 3 3=9 . 答案:#include using namespace std; void main() int i,j; for (i=1;i=9;i+) for (j=1;j=i;j+) printf
24、(%1d*%1d=%2d ,j,i,i*j); printf(n); 7. 请编写一个程序,程序的功能是打印以下图案。 * * * * * * * 答案:#include using namespace std; void main() int i,j; for (i=1;i=4;i+) for (j=1;j=4-i;j+) cout ; for (j=1;j=2*i-1;j+) cout*; cout=1;i-) for (j=1;j=4-i;j+) cout ; for (j=1;j=2*i-1;j+) cout*; coutendl; 8. 写出下面程序的运行结果:#include vo
25、id average(float*p, int n) int i; float sum=0; for(i=0;in;i+,p+) sum+=(*p); coutsum/n; void main() float score22= 1,2,3,4 ; average(*score, 4); 答案:2.5 C+ 部分1定义一个满足如下要求的Date 类。(1)用下面的格式输出日期:日/ 月/年(2)可运行在日期上加一天操作;(3)设置日期。答案:#include using namespace std; extern int i = 0; class Date public: set(int y,i
26、nt m, int d); add(); print(); private: int year; int month; int day; ; Date:set(int y, int m, int d) year = y; month = m; day = d; Date:add() switch(month) case 1: case 3: case 5: case 7: case 8: case 10: if(day 31) day += 1; else if(day = 31) day = 1; month += 1; break; case 12: if(day 31) day += 1
27、; else if(day = 31) day = 1; month = 1; year += 1; break; case 4: case 6: case 9: case 11: if(day 30) day += 1; else if(day = 30) day = 1; month += 1; break; case 2: if(year % 4 = 0 & year % 100 != 0 | year % 400 = 0) if(day 29) day += 1; else if(day = 29) day = 1; month+= 1; else if(day 28) day +=
28、1; else if(day = 28) day = 1; month += 1; break; Date:print() cout day / month / year endl; void main() Date d1; int year; int month; int day; cout year month day; d1.set(year, month, day); d1.print(); d1.add(); cout 下一天是: ; d1.print(); 2定义一个时间类Time,能提供和设置由时、分、秒组成的时间,并编出应用程序,定义时间对象,设置时间,输出该对象提供的时间。答
29、案:/Time.h class Time public: Time(); Time(); bool SetTime(int h,int m,int s); void GetTime(int &h,int &m,int &s); void Print(); private: int iHour,iMinute,iSecond; ; /*/ /Time.cpp #include #include Time.h using namespace std; Time:Time() iHour=1;iMinute=1;iSecond=1; Time:Time() bool Time:SetTime(int
30、 h,int m,int s) if(h23) return false; if(m59) return false; if(s59) return false; iHour =h;iMinute= m;iSecond =s;return true; void Time:GetTime(int &h,int &m,int &s) h=iHour;m=iMinute;s=iSecond; void Time:Print() coutiHour:iMinute:iSecondendl; /*/ /mainfunction.cpp #include #include Time.h using nam
31、espace std; void main() Time t; t.SetTime(23,44,59); t.Print(); 3. 编写一个矩形的类,要求类中具有长和宽2 个数据成员,具有构造函数、计算矩形的面积即及周长这3 个成员函数。答案:class rectangle float width; float heigth; public: rectangle(float w, float h) width=w;heigth=h; float area()return width*heigth; float circulm()return 2*(width+heigth); ; 4. 设计
32、一个人的类,要求包含姓名、身份证号、年龄、以及人的总数和所有人的平均年龄这 5 个数据成员,然后编写一个测试程序,输入n 个人的信息(姓名、身份证号和年龄),要求输出这些人的信息和平均年龄。答案:#include #include using namespace std; const int n=3; class Person private: char name20; char id18; int age; public: static int count; /人数 static float aveage; Person(void) Person(const char* names,char
33、 *ids,int ages) strcpy(name,names);/初始化姓名 strcpy(id,ids); age = ages;/初始化年龄 aveage+=age; count+; void display() cout姓名: nameendl; cout身份证: idendl; cout年龄: ageendl; friend void ModifyAveage();/修改平均年龄的友元函数; int Person:count = 0; float Person:aveage=0; void ModifyAveage() Person:aveage=Person:aveage/Pe
34、rson:count; void main() int ages,i; char namestr20,idstr18; Person pern; for (i=0;in;i+) coutnamestr; coutidstr; coutages; Person temp(namestr,idstr,ages); peri=temp; ModifyAveage(); for (i=0;in;i+) peri.display(); cout人的数量: Person:countendl; cout 平均年龄: Person:aveageendl; 5. 编写一个圆的类,再使用派生类的机制,编写一个圆柱
35、的类,求每个类都包含具有初始化功能的构造函数和相关数据的输出函数。答案:#include #define pi 3.1416 using namespace std; class circle protected: float r; float area; public: circle() r=0; circle(float radius)r=radius; void print() area=r*r*pi; coutr=r area=areaendl; ; class column:circle protected: float h; float v; public : column(flo
36、at radius,float height):circle(radius) h=height; void print() circle:print(); couth=h volume=area*hendl; ; void main() column col (3.0,2.0); col.print(); 6. 重载一个函数模板,要求它可以返回两个值中的较大者,也可以求三个数的最大值。答案:/ 求两个任意类型值中的最大者template inline T const& max (T const& a, T const& b) return a b ? b : a; / 求 3 个任意类型值中的
37、最大者template inline T const& max (T const& a, T const& b, T const& c) return :max (:max(a,b), c); 7. 下面是整型安全数组类的一部分:试完善类的定义,使下段程序能够正常运行且不会出现内存泄漏。#include class Array public: Array(int x) count=x; p=new intcount; int & operator (int x) return *(p+x); protected: int count; int *p; 答案:#include class Arr
38、ay public: Array(int x); Array(Array &); Array(); void SetAt(int pos, int value); int GetAt(int pos); protected: int count; int *p; ; Array:Array(int x) count=x; p=new intcount; Array:Array(Array &a) int i; count=a.count; p=new intcount; for (i=0;icount;i+) *(p+i)=*(a.p+i); Array:Array() delete p; v
39、oid Array:SetAt(int pos, int value) *(p+pos)=value; int Array:GetAt(int pos) return *(p+pos); 8、编写类String 的构造函数、析构函数和赋值函数已知类 String 的原型为:class String public: String(const char *str = NULL); / 普通构造函数String(const String &other); / 拷贝构造函数 String(void); / 析构函数String & operate =(const String &other); / 赋
40、值函数private: char *m_data; / 用于保存字符串; 请编写 String 的上述 4 个函数。答案:String:String(const char *str) cout构造函数被调用了endl; if(str=NULL)/避免出现野指针 m_data=new char1; *m_data=0; else int length=strlen(str); m_data=new charlength+1; strcpy(m_data,str); String:String(void) delete m_data; cout析构函数被调用了endl; String:String
41、(const String &other) cout赋值构造函被调用了endl; int length=strlen(other.m_data); m_data=new charlength+1; strcpy(m_data,other.m_data); String & String:operator =(const String &other) if(this=&other) return *this; delete m_data; int length=strlen(other.m_data); m_data=new charlength+1; strcpy(m_data,other.m
42、_data); return *this; ; 9、写出下面程序的运行结果:#include class A public: A()coutA; A()coutA; ; void main() A a5; 答案:AAAAAAAAAA 10、写出下面程序的运行结果:#include class A public: virtual void show()coutAendl; ; class D:public A public: virtual void show()coutDendl; ; void fun(A& a)a.show(); void main() D d; fun(d); 答案:D
43、1 设计一个类string要求 string类包括私有成员函数,char *str,在构造函数中初始化这个数据。写出它的两个构造函数(有参和拷贝), 析构函数,并能显示的声明和是调用构造函数(使用数组作为数据成员不给分)#include using namespace std; class String private: char *str; int len; public: void showstr() coutString:str,length:lenendl; String() len=0; str=NULL; String(char *p) len=strlen(p); if(len!
44、=0) str=new charlen+1; strcpy(str,p); cout 构造函数 endl; String() if(str!=NULL) deletestr; str=NULL; len=0; cout析构函数 endl; String(const String &r) len=r.len; if(len!=0) str=new charlen+1; strcpy(str,r.str); cout 拷贝构造函数 endl; ; void main() String s1(nihao); s1.showstr(); String s2=s1; s2.showstr(); 2 编写
45、一个求两个正整数m和 n 最大公约数的程序并测试程序。#include void main() int m,n,t,r; cinmn; while (n!=0) r=m%n; m=n; n=r; cout 最大公约数是:mendl; 3 编写一个求一个整形数组an 最大值所在下标的函数,并在主函数中调用该函数1- #include #define n 5 int max(int a,int l) int i,k,m; m=a0;k=0; for(i=0;il-1;i+) if (mai)m=ai;k=i; return k; void main() int an,i,M; for (i=0;i
46、ai; M=max(a,n); coutMendl; 4 将 fibnacial 序列 1,1,2,3,5,的前20 项存放在an 中,并显示出相应的元素#include #include void main() int i,a20=1,1; for (i=2;i20;i+) ai=ai-1+ai-2; for (i=0;i20;i+) if(i%5=0) coutendl; coutsetw(6)ai; coutendl; 5 设计一个类person 要求 person 类包括私有成员函数,char *Name, 在构造函数中初始化这个数据。写出它的两个构造函数(一般参数和对象的引用) ,析
47、构函数, 并能显示的声明和是调用构造函数(使用数组作为数据成员不给分)#include using namespace std; class Person private: char *Name; int len; public: void showName() coutPerson:Name ,length:lenendl; Person () len=0; Name=NULL; Person (char *x) len=strlen(x); if(len!=0) Name=new charlen+1; strcpy(Name,x); cout 构造函数 endl; Person () if
48、(Name!=NULL) deleteName; Name=NULL; len=0; cout析构函数 endl; Person (Person &xm) len=xm.len; if(len!=0) Name=new charlen+1; strcpy(Name,xm.Name); cout 拷贝构造函数endl; ; void main() Person s1(Liming); s1.showName (); Person s2=s1; s2.showName(); 6 输出 100200 之间能被 3 整除,但不能被7 整除的数及其个数。#include #include void main() int i,j,count;int a100; count=0; for(i=100,j=0;i=200 & j100;i+) if (i%3=0 & i%7!=0) aj=i; j+; count+; for (i=0;icount;i+) if(i%6=0)coutendl; coutsetw(6)ai; coutendl; cout ”个数为 : ”countendl;