实验习题总结.docx_第1页
实验习题总结.docx_第2页
实验习题总结.docx_第3页
实验习题总结.docx_第4页
实验习题总结.docx_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

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

文档简介

c+程序设计实验讲义软件学院c+教学团队目录实验1 c+基础3实验2 类的定义与应用5实验3 this指针、常量和静态成员和友元函数的使用9实验4 运算符重载14实验5 派生与继承16实验6 多态性19实验7 模板23实验8 io流25实验9 windows程序设计27实验1 c+基础1 实验目的和要求目的:快速掌握c+语言编程的方法,了解c+的增强功能,主要内容有:(1)输入流、输出流的使用;(2)重载、默认参数;(3)引用;(4)new和delete运算符分配内存。2实验内容:(1) 编写一个用输入和输出流运算符进行的输入和输出的程序。从键盘输入两个数,分别对两个数进行加,减,乘和除的运算。并输出计算结果,如: 23+123=146。#includeusingnamespacestd;intmain()doublea,b;cout输入两个数ab;(2) couta+b=(a+b)endl;(3) couta-b=(a-b)endl;(4) couta*b=(a*b)endl;(5) if(b=0)(6) couterror,除数不能为0endl;(7) else(8) couta/b=(a/b)endl;(9) return0;(10) (2)用new和delete运算符动态分配内存空间的方法编写程序。从键盘输入33整型数组的数据,并计算出所有元素之和,打印出最大值和最小值。输入输出要用流运算符实现。(11) #include(12) usingnamespacestd;(13) intmain()(14) (15) int*a=(int*)newint*3;/申请空间(16) for(inti=0;i3;i+)(17) ai=newint3;/申请行空间(18) cout输入9(3*3)个整数endl;(19) for(inti=0;i3;i+)(20) for(intj=0;jaij;(22) (23) intmax=a00,min=a00,sum=0;(24) for(inti=0;i3;i+)(25) for(intj=0;j3;j+)(26) (27) sum+=aij;(28) if(maxaij)(31) min=aij;(32) (33) coutsum=sumendl;(34) coutmax=maxendl;(35) coutmin=minendl;(36) deletea;(37) (3)编写c+风格的程序,解决百钱问题:将1元人民币兑换成1,2,5分的人民币,有多少种换法?(38) #include(39) usingnamespacestd;(40) intmain()(41) (42) inti,j,k;(43) intcount=0;(44) for(i=0;i*5=100;i+)(45) for(j=0;j*2=100;j+)(46) for(k=0;k=100;k+)(47) (48) if(i*5+j*2+k=100)(49) (50) cout5fen:i2fen:j1fen:kendl;(51) count+;(52) (53) (54) cout共有阅换方法count种endl;(55) return0;(56) (4)在主函数中定义2个整型元素a,b,用引用作函数参数的方法,在函数void swap(int & x, int & y)中实现将数据交换存放,并在主函数中打印出来。1. #include2. usingnamespacestd;3. voidswap(int&x,int&y)/函数形参为引用4. 5. inttemp;6. temp=x;7. x=y;8. y=temp;9. 10. intmain()11. 12. inta=5,b=10;13. int&x=a,&y=b;/引用声明是必须进行初始化14. couta=ab=bendl;15. 16. coutafterswapendl;17. swap(x,y);18. couta=ab=bendl;19. return0;20. (57) 假设我们班有50名同学,每个同学都报出自己的生日, 每个同学的生日都不相重的概率只有0.0296,如果有100个同学,不相重的概率为3.072510-7。相重复的概率如此之大与我们主观想象不同。写一个程序,输入同学的人数n计算出其生日不重复的概率。然后在用彷真的方法, 利用随机数产生每个同学的生日,计算出生日不重复的概率并与前面的结果进行比较。学生的生日可以用随机数产生,rand()产生032767之间的伪随机数,因为此需要一个种子,种子不同产生的随机数列不同,rand()产生的随机数也不同,可以调用srand(long int *)函数设置种子,比如我们可以获得计算机中的时间获得随机数种子, 以上函数需要包含头文件 stdlib.h 1. #include2. #include/使用rand()所需头文件3. usingnamespacestd;4. intjudge(int*a,intn)/判断生日是否有重复的5. 6. for(inti=0;in;i+)7. for(intj=i+1;jn;j+)8. 9. if(ai=aj)10. return1;11. 12. return0;13. 14. intmain()15. 16. intn;17. cout输入同学人数n;19. int*birthday=newintn;20. longtimes=1000000;21. doublecount=0;22. for(intk=0;ktimes;k+)23. 24. for(inti=0;in;i+)25. 26. birthdayi=rand()%365+1;/随机产生生日27. 28. count+=judge(birthday,n);29. 30. cout生日不重复的概率为:1-(count/times)endl;31. 3 思考题:结合上机的体会,回答下列问题.(1)c+引入了i/o流运算符,与 c语言相比,它们好处是什么?(2)引用是c+的很重要的功能,在函数定义中,如何使用引用?(3)函数重载设计不当会产生二义性问题,二义性主要体现在参数隐式类型转换和默认参数两个方面,举例说明两个问题,你认为该如何解决。(4)c+中define与const定义常量有什么区别?实验2 类的定义与应用1、实验目的和要求: 掌握类定义的方法,理解类类型,实例的含义,体会面向对象程序设计中数据隐藏的概念。理解构造函数和析构函数的作用和运行时间,掌握拷贝构造函数的作用。并熟练掌握复杂对象类型的运用。2、实验内容:(1)定义一个时间类time,它能提供由时、分、秒组成的时间。要求能够修改时间和打印出时间。#includeusing namespace std;class timeprivate: int hour,minute,second;public: time(int h=0,int m=0,int s=0) if(h23|m59|s59) cout设定时间错误hour=h; this-minute=m; this-second=s; time() void settime() int h,m,s; cout输入想要修改的时间(h,m,s)hms; if(h23|m59|s59) cout输入时间错误hour=h; this-minute=m; this-second=s; void print() couthour时minute分second秒endl; ;int main() time t; cout初始时间为:endl; t.print(); t.settime(); cout修改后的时间为:endl; t.print();(2)编写一个计数器类,定义一个私有数据成员,通过两个成员函数,分别使其完成加1和减1操作。用构造函数数据成员初始化为0,输出函数可以输出数据成员的值。(3)设计一个时间类,要求包含以下功能:数据成员:时、分、秒成员函数:各种重载构造函数析构函数可以通过函数分别设置时间的各个组成部分也可以整体设置时间有一个tick函数,负责给当前时间加1秒钟,然后输出新的时间(4) 定义一个分数类如下,要求实现各个成员函数,并在主函数中测试两个分数的加减乘除等运算。class rationalpublic: rational(int nn=1,int mm=1); /构造函数rational r_add(rational & a); /加 rational r_sub(rational & a); /减 rational r_mul(rational & a); /乘 rational r_div(rational & a); /除 void print(); /以简分数形式显示,注意约分private:void simple( ); /约分 int m; /分母int n; /分子;class rationalpublic:rational(int nn=1,int mm=1); /构造函数 rational r_add(rational & a); /加rational r_sub(rational & a); /减rational r_mul(rational & a); /乘rational r_div(rational & a); /除 void print(); /以简分数形式显示,注意约分private: void simple( ); /约分int m; /分母 int n; /分子;#include#includeusing namespace std;class rationalpublic: rational(int nn=1,int mm=1); /构造函数 rational r_add(rational & a); /加 rational r_sub(rational & a); /减 rational r_mul(rational & a); /乘 rational r_div(rational & a); /除 void print(); /以简分数形式显示,注意约分private: void simple(); /约分 int m; /分母 int n; /分子;rational:rational(int nn,int mm) if(mm=0) cout分母不能为0m=mm; this-n=nn;void rational:simple() int a=m,b=n,r; while(r=a%b)/迭代法计算最大公约数 a=b; b=r; m=m/b; n=n/b;rational rational:r_add(rational & a) this-n=n*a.m+m*a.n; this-m=m*a.m; return *this;rational rational:r_sub(rational & a) this-n=n*a.m-m*a.n; this-m=m*a.m; return *this;rational rational:r_mul(rational & a) this-n=n*a.n; this-m=m*a.m; return *this;rational rational:r_div(rational & a) this-n=n*a.m; this-m=m*a.n; return *this;void rational:print() simple(); coutn/mendl;int main() rational r(3,9); r.print(); rational p(2,4); p.print(); /测试运算 r.r_add(p); r.print(); r.r_sub(p); r.print(); r.r_mul(p); r.print(); r.r_div(p); r.print(); (5) 定义一个类包含一个整型数的指针变量,在构造函数中用new分配10个整型数的内存空间,在析构函数中用delete释放内存空间,并编写给内存空间赋值和输出的成员函数。#includeusing namespace std;class integerprivate: int *p; int size;public: integer(int size=10) this-size=size; p=new intsize;/用new分配10个整型数的内存空间 integer()/用delete释放内存空间 delete p; void set() cout请输入size个整数:endl; for(int i=0;ipi; void print() for(int i=0;isize;i+) coutpi ; coutendl; ;int main() integer i; i.set(); i.print(); return 0;(6) 完成string类 class stringpublic:string(const char *str = null); /普通构造函数string(const string &other); /拷贝构造函数 string(); /析构函数private:char *m_data; / 用于保存字符串;完成string 的3个成员函数,并编写一个主函数,在主函数中对所编写的成员函数进行测试。#include#includeusing namespace std;class stringpublic: string(const char *str = null); /普通构造函数 string(const string &other); /拷贝构造函数 string(); /析构函数 void print();private: char *data; / 用于保存字符串;string:string(const char *str) if(str) data=new charstrlen(str)+1; strcpy(data,str); else data=new char8; strcpy(data,); coutdata constructingendl;string:string(const string &other) if(other.data) data=new charstrlen(other.data)+1; strcpy(data,other.data); else data=new char8; strcpy(data,); coutdata copy constructingendl;string:string() coutdata destructingendl; delete data;void string:print() coutdata=dataendl;int main() string s1(dut); string s2(s1); string s3; s1.print(); s2.print(); s3.print(); return 0;(7)完成array类class arraypublic: array(); /所有数组元素初始化为0 int& getdata(int i); /返回下标为i的数组元素的引用 void print(); /打印出所有数组元素的值 void input(); /对所有数组元素进行输入private: int m_data10;完成array 的成员函数,并编写一个主函数,在主函数中对所编写的成员函数进行测试。#includeusing namespace std;class arraypublic: array(); /所有数组元素初始化为0 int& getdata(int i); /返回下标为i的数组元素的引用 void print(); /打印出所有数组元素的值 void input(); /对所有数组元素进行输入private: int data10;array:array() for(int i=0; i10; i+) datai=0;int& array:getdata(int i) return datai;void array:input() coutplease input 10 numbersendl; for(int i=0; idatai;void array:print() for(int i=0; i10; i+) coutdatai ; coutendl;int main() array a; a.print(); a.input(); couta.getdata(5)endl; a.print(); return 0;(8) 定义圆类(由圆心坐标点类和半径组成),利用友元函数判断两个圆的位置关系(圆间关系包括相交、相切、相离)。 #include#includeusing namespace std;class pointprivate: double x,y; friend class circle;public: point():x(0),y(0) point(double xx,double yy):x(xx),y(yy) ;class circleprivate: point center; double radius;public: circle():radius(0) circle(double a,double b,double r):center(a,b),radius(r) void relation(circle &c1) double r=sqrt(c1.center.x-center.x)*(c1.center.x-center.x)+(c1.center.y-center.y)*(c1.center.y-center.y)-(c1.radius+radius); if(r0) cout两圆相离endl; else if(r=0) cout两圆相切endl; else cout两圆相交endl; ;int main() circle c1(10,10,2),c2(10,14,2); c1.relation(c2); return 0;(9) 定义类point.要求定义类对象时,可以有这样的定义语句: point p1(1,2),p2(p1);#include class point public: point (int a, int b) x=a;y=b;void fun (point &p);void fun (point * p); private: int x,y;; void fun (point &p)x=p.x ;y=p.y ;cout the fun(point &p) x ; y=p-y ;cout fun (point *p) endl ;void main()point p(1,2),q(3,4) ;p.fun(q) ;q.fun(&q) ;改正程序中小的错误,给出程序运行的结果,并对程序进行分析。3、思考题:结合编程实践回答下列的问题。(1) 结合第一个例子,说明什么是类?什么是对象?你是如何理解类和对象的?(2) 面向对象的程序设计与结构化程序设计有何不同?(3) 拷贝构造函数那些情况下会被调用,分别给出例子? 实验3 this指针、常量和静态成员和友元函数的使用1、 实验目的和要求:(1) 掌握显式使用this指针的方法(2) 掌握静态数据成员的意义及使用方法(3) 掌握常量数据成员和常量成员函数的意义和使用方法(4) 掌握友元函数和友元类的使用方法2、 实验内容:(1)有如下类的定义。类成员函数copy用于实现两个对象的相互拷贝,请完成该函数的实现。(有两种方法即不用this 指针和用this指针)include class myclass public: myclass (int a,int b) x=a;y=b; void copy(myclass & my);void print( ) cout“x=”xendl; cout”y=”yendl; private:int x,y; void main() myclass my(10,20),t(30,40); my.print( );my. copy(t);my.print( );1. #include2. usingnamespacestd;3. classmyclass4. 5. public:6. myclass(inta,intb)7. 8. x=a;9. y=b;10. 11. voidcopy(myclass&my);12. voidprint()13. 14. coutx=x;15. couty=yx=my.x;23. this-y=my.y;24. 25. /*voidmyclass:copy(myclass&my)26. 27. x=my.x;28. y=my.y;29. 30. */31. intmain()32. 33. myclassmy(10,20),t(30,40);34. my.print();35. my.copy(t);36. my.print();37. return0;38. (3) 设计一个类,实现两个复数的四则运算。实现加减乘除功能的函数用友元函数实现。1. #include2. usingnamespacestd;3. classcomplex4. 5. private:6. doublereal;7. doubleimag;8. public:9. complex()10. 11. real=0;imag=0;12. 13. complex(doublex,doubley)14. 15. real=x;16. imag=y;17. 18. complex(constcomplex&c)19. 20. real=c.real;21. imag=c.imag;22. 23. voidprint()24. 25. coutreal+imagiendl;26. 27. friendcomplexoperator+(constcomplexc1,constcomplexc2);28. friendcomplexoperator-(constcomplexc1,constcomplexc2);29. friendcomplexoperator*(constcomplexc1,constcomplexc2);30. friendcomplexoperator/(constcomplexc1,constcomplexc2);31. ;32. complexoperator+(constcomplexc1,constcomplexc2)33. 34. returncomplex(c1.real+c2.real,c1.imag+c2.imag);35. 36. complexoperator-(constcomplexc1,constcomplexc2)37. 38. returncomplex(c1.real-c2.real,c1.imag-c2.imag);39. 40. complexoperator*(constcomplexc1,constcomplexc2)41. 42. returncomplex(c1.real*c2.real-c1.imag*c2.imag,c1.real*c2.imag+c2.real*c1.imag);43. 44. complexoperator/(constcomplexc1,constcomplexc2)45. 46. doublem=c2.real*c2.real+c2.imag*c2.imag;47. returncomplex(c1.real*c2.real+c1.imag*c2.imag)/m,(c1.imag*c2.real-c1.imag*c2.imag)/m);48. 49. intmain()50. 51. complexc1(1,2),c2(3,4);52. c1.print();53. c2.print();54. complexc3;55. c3=c1+c2;56. c3.print();57. c3=c1-c2;58. c3.print();59. c3=c1*c2;60. c3.print();61. c3=c1/c2;62. c3.print();63. return0;64. (3)分析下面程序,给出横线部分的语句,写出程序的输出结果并分析m_count的功能。 #include using namespace std; class a static int m_counter; public:a();a();static void display(); /将m_counter初始化为0;a:a()m_counter+;a:a()m_counter-;void a:display()cout”there are:”a:m_counter”objects of class a.n”;int main()a a1;a a2;a a3; a:display();a1.display();1. #include2. usingnamespacestd;3. classa4. 5. staticintm_counter;6. public:7. a();8. a();9. staticvoiddisplay();10. ;11. inta:m_counter=0;/将m_counter初始化为012. /初始化静态数据成员的方法13. a:a()14. 15. m_counter+;16. 17. a:a()18. 19. m_counter-;20. 21. voida:display()22. 23. coutthereare:a:m_counterobjectsofclassa.n;24. 25. 26. intmain()27. 28. aa1;29. aa2;30. aa3;31. a:display();/3,每次调用构造函数m-counter加1,调用了三次32. a1.display();/3,静态的只依赖于类,而不依赖于对象33. (4)商店经销一种货物,货物成箱购进,成箱卖出,购进和卖出时以重量为单位,各箱的重量不一样,单价不一样,因此商店需要记录下目前库存的货物的总重量和总价值。编写一个程序,通过定义类carlo来模拟商店货物购进和卖出的情况。(本题目主要练习静态数据成员的使用,定义私有变量存每件货物的价格和重量,用静态数据成员存货物的总重量和总价钱,定义构造函数和析构函数,当定义新的对象完成初始化的功能和删除对象时,从总重量和总价钱中减去对象的重量和价格)(5) 静态成员练习1) 编写一个类node,声明一个数据成员member和已经静态成员count,另构造函数初始化数据成员,并把静态数据成员加1,另析构函数把静态数据成员减1。2) 在1)的基础上编写应用程序,创建3个对象,然后显示他们的数据成员和静态成员,再析构每个对象,并显示他们对静态数据成员的影响。3) 修改2),让静态成员函数访问静态数据成员,并让静态数据成员是私有的。(6)两个类分别为整型数集合类和实型数集合数类。将缺少的内容补齐。并完成要求的其它内容。如: class intset private:int num3;public:intset ( int x,int y, int z)/添加初始化内容void print( ) /打印数据 ; class floatset private:float num3;public:floatset ( float x,float y, float z)/添加初始化内容void print( ) /打印数据;(1) 在intset中再增加一个成员函数,将对象的整型数据拷贝的到floatset的对象中此成员函数的原型为:void settofloat(floatset &set); /形参为拷贝的目标对象(2)定义一个友元函数来实现上述的功能。请分别完成两个程序。(7) 分析以下程序的功能,把程序用三种方法(公有数据成员、友元、用成员函数访问私有数据成员)补充完整,实现对对象animal的成员#include class animal;void setvalue(animal&, int);void setvalue(animal&, int, int);class animalpublic:animal():itsweight(0),itsage(0)void show()coutitsweightendlitsageendl;protected:int itsweight;int itsage;void setva

温馨提示

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

评论

0/150

提交评论