东北大学软件学院C++实验报告_第1页
东北大学软件学院C++实验报告_第2页
东北大学软件学院C++实验报告_第3页
东北大学软件学院C++实验报告_第4页
东北大学软件学院C++实验报告_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

-.z.课程B080101020《C++程序设计》实验报告**班级指导教师实验名称《C++程序设计》综合实验开发与总结开设学期2016-2017学年第一学期开设时间第15周——第18周报告日期****评定成绩评定人***评定日期2016-01-12东北大学软件学院-.z.1.实验目的实验一学习编写简单的C++程序,并掌握C++程序的基本格式与规。练习重载函数的使用,掌握指针的使用方法。学习标准输人输出及格式控制。学习使用VC++的debug调试功能,使用stepinto追踪到函数部。实验二学习并掌握类与对象的定义、使用、声明。学习具有不同属性的数据成员与成员函数的访问方式。理解构造函数和析构函数的定义与执行过程。理解什么是运算符重载,掌握运算符重载的方法实验三学习定义和使用类的继承关系,定义派生类。熟悉不同继承方式下对基类成员的访问控制。学习使用虚函数实现动态多态性。学习利用虚基类解决二义性问题。实验四加强对模板相关概念的理解,熟悉模板编程的语法。学习编写简单的函数模板和类模板。理解STL中容器、算法、迭代器的等概念,明确它们之间的关系。掌握STL中Vector容器的使用方法。2.实验环境编译器:MicrosoftVisualC++6.0操作系统:Windows103.实验容与实验过程及分析实验一项目一:容:使用动态数组完成编写并测试3*3矩阵转置函数,使用数组保存3*3矩阵,使用指针实现函数的功能。代码:main(){ inti,j;int**p;p=newint*[3]; cout<<"输入矩阵的元素:"<<endl; for(i=0;i<3;i++) { p[i]=newint[3]; for(j=0;j<3;j++) { cin>>p[i][j]; } } transpose(p); cout<<"转置后的矩阵的为:"<<endl; for(i=0;i<3;i++) { for(j=0;j<3;j++) cout<<p[i][j]<<""; cout<<endl; } delete[]p;}voidtranspose(int**matri*){ inti,k,j; for(i=0;i<3;i++) { for(j=0;j<3;j++){ if(j>i){ k=matri*[j][i]; matri*[j][i]=matri*[i][j]; matri*[i][j]=k; } } }}运行结果:总结: 传递二维数组时候通过指针传递,可以对数组进行修改,方便了许多。项目二:容:编写程序,读写指定的文件,在每一行前加行号后,将结果输出到屏幕代码:voidwrite(){ ofstreamout("test.t*t"); if(out.is_open()) { out<<"第一行\n"; out<<"第二行\n"; out<<"第三行\n"; out<<"第四行\n"; out<<"第五行\n"; out<<"第六行\n"; } out.close();}voidread(){ charbuffer[88]; ifstreamin("test.t*t"); if(!in.is_open()) { cout<<"Erroropeningfile"; e*it(1); } while(!in.eof()) { in.getline(buffer,80); cout<<buffer<<endl; } in.close();}voidmain(){ cout<<"写文件"<<endl; write(); cout<<"读文件"<<endl; read(); system("pause");}运行结果:总结:学会了C++如何进行文件读写操作。实验二项目一:容:以成员函数方式重载的“+”操作符的原型为:CPointCPoint::operator+(CPointpt);以全局函数方式重载的“-”操作符的原型为:CPointoperator-(CPointpt1,CPointpt2);分析以成员函数方式和全局函数方式重载运行符的异同点。重载的“>>”操作符的原型为:istream&operator>>(istream&,CPoint&);重载的“<<”操作符的原型为:ostream&operator>>(ostream&,CPoint);思考一下,重载的“>>”操作符和“<<”操作符能否作为CPoint类的成员函数来实现。代码:*include<iostream.h>*include<math.h>classCPoint{private: int*,y; staticintnCount;//nCount用于保存点的个数public: CPoint(intp*=0,intpy=0):*(p*),y(py) { }//构造函数,这个地方一定要写函数体容,不然没有初始化的话会导致运行出错。 //CPoint(CPoint&); ~CPoint(){}//这是析构函数 intGET*()const { return*; } intGETY()const { returny; } voidSet*(inta) { *=a; } voidSetY(intb) { y=b; } voidShowPoint() { cout<<"("<<*<<","<<y<<")"; } CPointoperator+(CPoint&cp2) { returnCPoint(GET*()+cp2.GET*(),GETY()+cp2.GETY()); }; friendCPointoperator-(CPoint&cp1,CPoint&cp2);//声明为友元函数 //输入输出运算符只能用友元函数重载 friendostream&operator<<(ostream&os,constCPoint&c);friendistream&operator>>(istream&is,CPoint&c);};CPointoperator-(CPoint&cp1,CPoint&cp2){ returnCPoint(cp1.*-cp2.*,cp1.GETY()-cp2.GETY());}//不要逗号ostream&operator<<(ostream&os,constCPoint&c){ cout<<"重载<<直接输出对象得到:"<<"("<<c.GET*()<<","<<c.GETY()<<")"<<endl; returnos;}istream&operator>>(istream&is,CPoint&c){is>>c.*>>c.y;returnis;}classCLine{private: CPointpt1,pt2;//pt1和pt2分别代表该线段的起点和终点public: CLine(){}//构造函数 CLine(int*1,inty1,int*2,inty2) :pt1(*1,y1),pt2(*2,y2) { }//必须以参数列表的形式来写,这样才能在声明的时候即初始化 CLine(CPointp1,CPointp2) :pt1(p1),pt2(p2) { }//必须以参数列表的形式来写,这样才能在声明的时候即初始化 doubleDistance() { inta=pt1.GET*()-pt2.GET*(); intb=pt1.GETY()-pt2.GETY(); doubledistance=sqrt(a*a+b*b); returndistance; }//计算该线段长度的成员函数 voidShowLine() { pt1.ShowPoint(); cout<<"-"; pt2.ShowPoint(); }};intmain(){ CPointcp1(2,4); CPointcp2(3,6); CPointcp; cout<<"两个点分别是"; cp1.ShowPoint(); cp2.ShowPoint(); cp=cp1+cp2;//两个点相加 cout<<endl; cout<<"两个点相加的结果是"; cp.ShowPoint(); cp=cp1-cp2;//两个点相减 cout<<"两个点相减的结果是"; cp.ShowPoint(); cout<<endl; CLineline1(1,3,5,0); CLineline2(cp1,cp2); cout<<"线段1是"; line1.ShowLine(); cout<<endl; cout<<"线段2是"; line2.ShowLine(); cout<<endl<<"长度为"<<line1.Distance()<<endl; cout<<"重载>>直接创建一个点,请输入两个值:"; CPointLoadPoint; cin>>LoadPoint; cout<<LoadPoint;//重载<<直接输出对象 return0;}运行结果:总结:通过C++重载运算符的操作,可以让编程者自定义各个操作符的运算规则,简化了程序的编写逻辑和过程。实验三项目一:容:使用实验2中的CPoint类,定义“空间中点”类如下:classCThreePoint:publicCPoint{private: intz;public: CThreePoint(); CThreePoint(int,int,int); intGetZ(); voidSetZ(intpz); virtualvoidShowPoint();};完成该类中各成员函数的定义。并利用VC调试工具观察含有继承关系类的构造函数和析构函数的执行情况。代码:*include<iostream.h>*include<math.h>classCPoint{private: int*,y; staticintnCount;//nCount用于保存点的个数public: CPoint(intp*=0,intpy=0):*(p*),y(py) { }//构造函数,这个地方一定要写函数体容,不然没有初始化的话会导致运行出错。 //CPoint(CPoint&); ~CPoint(){}//这是析构函数 intGet*()const { return*; } intGetY()const { returny; } voidSet*(inta) { *=a; } voidSetY(intb) { y=b; } virtual voidShowPoint()//只有把它设置为虚函数时候才会出现(8,9)(3,2,5)的输出结果。否则都是(8,9)(3,2) { cout<<"("<<*<<","<<y<<")"; }};classCThreePoint:publicCPoint{private: intz;public: CThreePoint(){}//无参构造 CThreePoint(intp*=0,intpy=0,intpz=0) { Set*(p*); SetY(py); z=pz; } intGetZ(){ returnz;} voidSetZ(intpz){ z=pz;} virtualvoidShowPoint() { cout<<"("<<Get*()<<","<<GetY()<<","<<z<<")"; }};intmain(){ CPointcp(8,9); CThreePointctp(3,2,5); CPoint*pt=&cp; pt->ShowPoint(); pt=&ctp; pt->ShowPoint(); return0;}运行结果:总结:C++中的继承、虚函数,多态,数据的封装,构造函数的实现等等各种面向对象程序设计的特性,方便进行现象化描述,通过对这一部分的学习,对于C++中的类的概念进一步巩固,基于对JAVA的学习,现在对于C++中多态、继承有了较多的了解。项目二:容:定义一个车(vehicle)基类,具有Ma*Speed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。从bicycle和motorcar派生出摩托车(motorcycle)类,它们都有Run、Stop等成员函数。代码:*include<iostream.h>classvehicle{public: intMa*Speed; intWeight;virtual voidRun(){ //执行该方法则开始运行 cout<<"开始运行,速度为"<<Ma*Speed<<endl; }virtual voidStop() { //执行则停止运行 cout<<"停止运行"<<endl; }};classbicycle:virtualpublicvehicle{public: intHeight;};classmotorcar:virtualpublicvehicle{public: intSeatNum;};classmotorcycle:publicbicycle,publicmotorcar{public:intstyle;};main(){vehiclev;v.Ma*Speed=10;bicycleb;b.Ma*Speed=5;motorcarmcar;mcar.Ma*Speed=20;motorcyclemb;mb.Ma*Speed=15;//如果不设置成为虚基类的话则该行代码编译不通过vehicle*pt=&v;cout<<"vehicle";pt->Run();pt->Stop();pt=&b;cout<<"bicycle";pt->Run();pt->Stop();pt=&mcar;cout<<"motorcar";pt->Run();pt->Stop();pt=&mb;cout<<"motorcycle";pt->Run();pt->Stop();}/**vehicle开始运行,速度为10停止运行bicycle开始运行,速度为5停止运行motorcar开始运行,速度为20停止运行motorcycle开始运行,速度为15停止运行*/运行结果:总结: 学习了虚函数以及虚基类的使用以及作用。虚函数、虚基类的使用对于C++的多态继承有更大的便利性。实验四项目一:容:编写一个函数模板,要求它返回两个值中的最小者。但同时要确保正确处理字符串。代码:*include<iostream>*include<cstring>usingnamespacestd;template<typenameT>Tmin(Ta,Tb){ Tc; c=(a<b)"a:b; returnc;}char*min(char*a,char*b){ returnstrcmp(a,b)<0"a:b;}voidmain(){ cout<<"请输入两个整数:"<<endl; chart1[100],t2[100]; cin>>t1>>t2; cout<<"最小的是:"<<min(t1,t2)<<endl; system("pause");}运行结果:总结: C++中模板的一个作用就是对同一类型的函数,进行不同参数类型的适配,比较人性化。同时也方便了编程者进行对类库的封装,写出一个框架来。项目二:容:编写一程序,让用户自由地从键盘上输入整数,直到输入数字0时结束。把用户输入的数据保存在模板类Vector<int>定义的对象中,并对用户输入的所有数进行排序输出。在向显示器进行输出时,要求用一下3种方式实现:仅使用Vector<int>的相关成员函数,不使用迭代器进行输出;使用迭代器自己编程输出;使用STL提供的通用算法for_each进行输出。代码:*include<vector>*include<algorithm>*include<iostream>usingnamespacestd;voidshow(intn);voidmain(){ vector<int>a; intn=0; do { cin>>n; a.push_back(n); }while(n!=0); for(int*=0;(unsignedint)*<a.size();*++) for(inty=*;(unsignedint)y<a.size();y++) if(a[*]>a[y]) { intz=a[*]; a[*]=a[y]; a[y]=z; } for(inti=0;(unsignedint)i<=a.size()-1;i++) cout<<a[i]<<""; cout<<endl; vector<int>::iteratorstart=a.begin(); vector<int>::iteratorend=a.end(); while(start!=end) { cout<<*start<<""; ++start; } cout<<endl; for_each(a.begin(),a.end(),show); cout<<endl;}voidshow(intn){ cout<<n<<"";}运行结果:(输出结果包含三种实现方式)总结: C++中对于数据的存储有较多种方式,这里实现一种存储并排序输出。掌握了Vector的使用及其技巧。4.实验总结从接触的第一门面向对象的语言JAVA开始,就对这种以对象形式来编程的方式产生了兴趣。现在,又学习了C++,我对C++这种面向对象的编程语言的语法有了大致的掌握,由于学过JAVA语言,所以面向对象的思想掌握的不是很慢,但是比较吃力的就是C++中既融合了C的指针思想,又具有JAVA的引用变量思想,还有就是析构函数的引入,编程人员自己在存中分配存,而且用完之后要自己调用相应的函数去释放,所以操作实现起来稍显困难,不过这也是C++不同于JAVA之处——对机器配置要求不是太高。C++编程的一些基本方法,是融合了C语言以及JAVA的,学会了C++语言的基本语法,面向对象类的设计思想,我也还学会了如何自己从网上寻找资源,如何自学新东西,相信这次实验学到的知识在我未来的学习个工作道路上都会是宝贵的财富,并且会在以后的编程之路上给予我较大的帮助。5.思考题实验一:重载函数是通过什么来区分?答:参数类型、数量、顺序。C++提供的输入输出操作与C语言的输入输出操作的异同点?答:同:都可以通过输入设备输入并将数据显示出来。异:C++不用指定输出类型。C++都定义了那些流?他们分别与什么设备相连?答:C++定义了io流,与输入输出设备相连。实验二:类和结构体的区别是什么?答:成员访问权限不同,继承方式不同。结构体不提供继承机制,类提供继承机制,实现代码复用;类可以实现多态,结构体不支持。结构体中的数据默认方式是public的,而类是private的。类的成员函数与普通的函数有何区别?答:类的成员函数是成员的特有方法,而普通函数能够随意被调用。构造函数和析构函数的作用是什么?答:初始化对象,分配存空间,释放存空间。类的访问控制权限有何意义?答:保护成员变量,可以将类中的具体细节封装起来。实验三:C++中有哪几种派生方式?每种方式的派生类对基类成员的继承和访问控制属性是什么样的?答:有public,private,protected派生。 public派生,在派生类里和外面都可以直接调用基类的公有部分。 protected保护派生,在派生类里可以直接调用,但是在派生外面不可以调用

温馨提示

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

评论

0/150

提交评论