东北大学软件学院C实验报告.doc
.课程编号:B080101020C+程序设计实验报告姓名学号班级指导教师实验名称C+ 程序设计综合实验开发与总结开设学期2016-2017学年第一学期开设时间第15周第18周报告日期XXXX评定成绩评定人XXX评定日期2016-01-12东北大学软件学院.1. 实验目的实验一1) 学习编写简单的C+程序,并掌握C+程序的基本格式与规范。2) 练习重载函数的使用,掌握指针的使用方法。3) 学习标准输人输出及格式控制。4) 学习使用VC +的debug调试功能,使用step into追踪到函数内部。实验二1) 学习并掌握类与对象的定义、使用、声明。2) 学习具有不同属性的数据成员与成员函数的访问方式。3) 理解构造函数和析构函数的定义与执行过程。4) 理解什么是运算符重载,掌握运算符重载的方法实验三1) 学习定义和使用类的继承关系,定义派生类。2) 熟悉不同继承方式下对基类成员的访问控制。3) 学习使用虚函数实现动态多态性。4) 学习利用虚基类解决二义性问题。实验四1) 加强对模板相关概念的理解,熟悉模板编程的语法。2) 学习编写简单的函数模板和类模板。3) 理解STL中容器、算法、迭代器的等概念,明确它们之间的关系。4) 掌握STL中Vector容器的使用方法。2. 实验环境编译器:Microsoft Visual C+ 6.0 操作系统:Windows 103. 实验内容与实验过程及分析实验一项目一:内容:使用动态数组完成编写并测试3X3矩阵转置函数,使用数组保存3X3矩阵,使用指针实现函数的功能。代码:main()int i,j; int *p; p=new int*3;cout输入矩阵的元素:endl;for(i=0;i3;i+)pi=new int3;for(j=0;jpij;transpose(p);cout 转置后的矩阵的为: endl;for(i=0; i3; i+)for (j=0; j3; j+)cout pij ;cout endl;delete p;void transpose (int *matrix)int i,k,j;for(i=0;i3;i+)for(j=0;ji)k=matrixji;matrixji=matrixij;matrixij=k;运行结果:总结:传递二维数组时候通过指针传递,可以对数组进行修改,方便了许多。项目二:内容:编写程序,读写指定的文件,在每一行前加行号后,将结果输出到屏幕代码:void write()ofstream out(test.txt);if (out.is_open()out 第一行n;out 第二行n;out 第三行n;out 第四行n;out 第五行n;out 第六行n;out.close();void read()char buffer88;ifstream in(test.txt);if (!in.is_open()cout Error opening file;exit(1);while (!in.eof()in.getline(buffer, 80);cout buffer endl;in.close();void main()cout 写文件 endl;write();cout 读文件 ”操作符的原型为:istream& operator(istream&, CPoint&);重载的“(ostream&, CPoint);思考一下,重载的“”操作符和“”操作符能否作为CPoint类的成员函数来实现。代码:#include#includeclass CPointprivate:int x,y;static int nCount ;/ nCount用于保存点的个数public:CPoint(int px=0,int py=0):x(px),y(py)/构造函数,这个地方一定要写函数体内容,不然没有初始化的话会导致运行出错。/CPoint(CPoint&);CPoint()/这是析构函数int GETX() constreturn x;int GETY() constreturn y;void SetX(int a)x=a;void SetY(int b)y=b;void ShowPoint()cout(x,y);CPoint operator+ (CPoint& cp2)return CPoint(GETX()+cp2.GETX(),GETY()+cp2.GETY();friend CPoint operator-(CPoint& cp1,CPoint& cp2);/声明为友元函数/输入输出运算符只能用友元函数重载friend ostream &operator(istream &is,CPoint &c);CPoint operator-(CPoint& cp1,CPoint& cp2)return CPoint(cp1.x-cp2.x,cp1.GETY()-cp2.GETY();/不要逗号ostream & operator(ostream &os,const CPoint &c)cout 重载直接输出对象得到: (c.GETX(),c.GETY()(istream &is,CPoint &c) is c.xc.y; return is;class CLineprivate:CPoint pt1, pt2;/pt1和pt2分别代表该线段的起点和终点public:CLine()/构造函数CLine(int x1,int y1,int x2,int y2):pt1(x1,y1),pt2(x2,y2)/必须以参数列表的形式来写,这样才能在声明的时候即初始化CLine(CPoint p1,CPoint p2):pt1(p1),pt2(p2)/必须以参数列表的形式来写,这样才能在声明的时候即初始化double Distance()int a=pt1.GETX()-pt2.GETX();int b=pt1.GETY()-pt2.GETY();double distance=sqrt(a*a+b*b);return distance; /计算该线段长度的成员函数void ShowLine()pt1.ShowPoint();cout-;pt2.ShowPoint();int main()CPoint cp1(2,4);CPoint cp2(3,6);CPoint cp;cout两个点分别是;cp1.ShowPoint();cp2.ShowPoint();cp=cp1+cp2;/两个点相加coutendl;cout两个点相加的结果是;cp.ShowPoint();cp=cp1-cp2;/两个点相减cout两个点相减的结果是;cp.ShowPoint();coutendl;CLine line1(1,3,5,0);CLine line2(cp1,cp2);cout线段1是;line1.ShowLine();coutendl;cout线段2是;line2.ShowLine();coutendl长度为line1.Distance()endl;cout 直接创建一个点,请输入两个值:;CPoint LoadPoint;cinLoadPoint;coutLoadPoint;/重载直接输出对象return 0;运行结果:总结:通过C+重载运算符的操作,可以让编程者自定义各个操作符的运算规则,简化了程序的编写逻辑和过程。实验三项目一:内容:使用实验2中的CPoint类,定义 “空间中点”类如下:class CThreePoint:public CPointprivate:int z;public:CThreePoint();CThreePoint(int, int, int);int GetZ();void SetZ(int pz);virtual void ShowPoint();完成该类中各成员函数的定义。并利用VC调试工具观察含有继承关系类的构造函数和析构函数的执行情况。代码:#include#includeclass CPointprivate:int x,y;static int nCount ;/ nCount用于保存点的个数public:CPoint(int px=0,int py=0):x(px),y(py)/构造函数,这个地方一定要写函数体内容,不然没有初始化的话会导致运行出错。/CPoint(CPoint&);CPoint()/这是析构函数int GetX() constreturn x;int GetY() constreturn y;void SetX(int a)x=a;void SetY(int b)y=b;virtualvoid ShowPoint()/只有把它设置为虚函数时候才会出现(8,9)(3,2,5)的输出结果。否则都是(8,9)(3,2)cout(x,y);class CThreePoint:public CPointprivate:int z;public:CThreePoint()/无参构造CThreePoint(int px=0,int py=0,int pz=0)SetX(px);SetY(py);z=pz;int GetZ()return z;void SetZ(int pz)z=pz;virtual void ShowPoint()cout(GetX(),GetY(),zShowPoint();pt=&ctp;pt-ShowPoint();return 0;运行结果:总结:C+中的继承、虚函数,多态,数据的封装,构造函数的实现等等各种面向对象程序设计的特性,方便进行现象化描述,通过对这一部分的学习,对于C+中的类的概念进一步巩固,基于对JAVA的学习,现在对于C+中多态、继承有了较多的了解。项目二:内容:定义一个车(vehicle)基类,具有MaxSpeed、Weight等成员变量,Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车(motorcar)类。自行车(bicycle)类有高度(Height)等属性,汽车(motorcar)类有座位数(SeatNum)等属性。从bicycle和motorcar派生出摩托车(motorcycle)类,它们都有Run、Stop等成员函数。代码:#includeclass vehiclepublic:int MaxSpeed;int Weight;virtualvoid Run()/执行该方法则开始运行cout开始运行,速度为MaxSpeedendl;virtualvoid Stop()/执行则停止运行cout停止运行endl;class bicycle:virtual public vehiclepublic:int Height;class motorcar:virtual public vehiclepublic:int SeatNum;class motorcycle:public bicycle,public motorcarpublic:int style;main()vehicle v;v.MaxSpeed=10;bicycle b;b.MaxSpeed=5;motorcar mcar;mcar.MaxSpeed=20;motorcycle mb;mb.MaxSpeed=15;/如果不设置成为虚基类的话则该行代码编译不通过vehicle *pt=&v;coutRun();pt-Stop();pt=&b;coutRun();pt-Stop();pt=&mcar;coutRun();pt-Stop();pt=&mb;coutRun();pt-Stop();/*vehicle开始运行,速度为10停止运行bicycle开始运行,速度为5停止运行motorcar开始运行,速度为20停止运行motorcycle开始运行,速度为15停止运行*/运行结果:总结:学习了虚函数以及虚基类的使用以及作用。虚函数、虚基类的使用对于C+的多态继承有更大的便利性。实验四项目一:内容:编写一个函数模板,要求它返回两个值中的最小者。但同时要确保正确处理字符串。代码:#include#include using namespace std;template T min(T a, T b)T c;c = (ab) ? a : b;return c;char *min(char *a, char *b)return strcmp(a, b)0 ? a : b;void main()cout 请输入两个整数: t1 t2;cout 最小的是: min(t1, t2) endl;system(pause);运行结果:总结:C+中模板的一个作用就是对同一类型的函数,进行不同参数类型的适配,比较人性化。同时也方便了编程者进行对类库的封装,写出一个框架来。项目二:内容:编写一程序,让用户自由地从键盘上输入整数,直到输入数字0时结束。把用户输入的数据保存在模板类Vector定义的对象中,并对用户输入的所有数进行排序输出。在向显示器进行输出时,要求用一下3种方式实现:a) 仅使用Vector的相关成员函数,不使用迭代器进行输出;b) 使用迭代器自己编程输出;c) 使用STL提供的通用算法for_each进行输出。代码:#include #include #include using namespace std;void show(int n);void main()vector a;int n = 0;docin n;a.push_back(n); while (n != 0);for (int x = 0; (unsigned int)xa.size(); x+)for (int y = x; (unsigned int)yay)int z = ax;ax = ay;ay = z;for (int i = 0; (unsigned int)i = a.size() - 1; i+)cout ai ;cout endl;vector:iterator start = a.begin();vector:iterator end = a.end();while (start != end)cout *start ;+start;cout endl;for_each(a.begin(), a.end(), show);cout endl;void show(int n)cout n ;运行结果:(输出结果包含三种实现方式)总结:C+中对于数据的存储有较多种方式,这里实现一种存储并排序输出。掌握了Vector的使用及其技巧。4. 实验总结从接触的第一门面向对象的语言JAVA开始,就对这种以对象形式来编程的方式产生了兴趣。现在,又学习了C+,我对C+这种面向对象的编程语言的语法有了大致的掌握,由于学过JAVA语言,所以面向对象的思想掌握的不是很慢,但是比较吃力的就是C+中既融合了C的指针思想,又具有JAVA的引用变量思想,还有就是析构函数的引入,编程人员自己在内存中分配内存,而且用完之后要自己调用相应的函数去释放,所以操作实现起来稍显困难,不过这也是C+不同于JAVA之处对机器配置要求不是太高。 C+编程的一些基本方法,是融合了C语言以及JAVA的,学会了C+语言的基本语法,面向对象类的设计思想,我也还学会了如何自己从网上寻找资源,如何自学新东西,相信这次实验学到的知识在我未来的学习个工作道路上都会是宝贵的财富,并且会在以后的编程之路上给予我较大的帮助。5. 思考题实验一:1.1. 重载函数是通过什么来区分?答:参数类型、数量、顺序。1.2. C+提供的输入输出操作与C语言的输入输出操作的异同点?答:同:都可以通过输入设备输入并将数据显示出来。异:C+不用指定输出类型。1.3. C+都定义了那些流?他们分别与什么设备相连?答:C+定义了io流,与输入输出设备相连。实验二:2.1. 类和结构体的区别是什么? 答:成员访问权限不同,继承方式不同。结构体不提供继承机制,类提供继承机制,实现代码复用;类可以实现多态,结构体不支持。结构体中的数据默认方式是public的,而类是private的。2.2. 类的成员函数与普通的函数有何区别? 答:类的成员函数是成员的特有方法,而普通函数能够随意被调用。2.3. 构造函数和析构函数的作用是什么? 答:初始化对象,分配内存空间,释放内存空间。2.4. 类的访问控制权限有何意义?答:保护成员变量,可以将类中的具体细节封装起来。实验三:3.1. C+中有哪几种派生方式?每种方式的派生类对基类成员的继承和访问控制属性是什么样的? 答:有public,private,protected派生。public派生,在派生类里和外面都可以直接调用基类的公有部分。protected保护派生,在派生类里可以直接调用,但是在派生外面不可以调用。private私有派生,在派生类里和外面都不可以直接调用,但可以用函数间接调用。3.2. 派生类对象和基类对象是什么样的关系?派生类对象的构造函数和析构函数的执行顺序是怎样的?答:派生类对象是基类对象的扩展;执行派生类构造函数时先执行基类构造函数,构造一个基类对象;执行派生类析构函数时先执行派生类析构函数,再执行基类析构函数。3.3. 什么是多态?在C+语言中,是如何实现多态的? 答:多态是指接口的不同实现形式。可以通过虚函数,抽象类,重载,覆盖,模板实现。实验四:4.1. 谈谈使用模版进行编程的优点?答:使用模板可以增加代码的可重用性,摸板可以创建一系列类或函数,完成很多相似的功能;可以交换变量值的类型,从而可以避免功能相同的变量类型不同的函数一遍又一遍的定义。4.2. 谈谈函数模板和模板函数两者之间的关系,以及类模板和模板类两者之间的关系? 答:函数模版:生产出可以处理相同事情,但参数不同的函数,它拓展了函数的重载功能。模版函数:由函数模版产生的函数。4.3. STL中容器、迭代器和算法三者之间的关系? 答:容器是储存数据的,算法是处理数据的,而算法是通过迭代器来处理、操作容器中的数据。6. 参考文献1、基于案例的Visual C+程序设计教程阎光伟、彭文等著 清华大学出版社2、dingyuanpu CSDN博主 博客链接http:/blog.csdn.net/dingyuanpu/article/details/58528253、Chwen CN博客园博主 博客链接http:/www.cnblogs.com/chwen/p/4055474.html.附录:C+程序设计实验成绩评定表评价内容具 体 要 求分值得分平时表现实验过程中,无缺勤现象,态度积极,具有严谨的学习态度和认真、踏实、一丝不苟的科学作风。20提交材料能够按时提交实验要求的所有材料(要求在以“学号-姓名”命名的文件夹中,包含实验报告电子版、和分别以实验源代码1、2、3、4等命名的存放四次实验源代码的四个子文件夹,源代码仅包含代码文件,不要包含工程维护文件等),材料完备,质量、格式、内容等符合要求。20报告质量实验报告格式规范,体例符合要求;报告内容充实、正确,实验目的归纳合理到位,思考题回答准确。30实验内容能够按实验要求合理设计并开发出程序,认真记录实验数据,原理及实验结果分析准确,归纳总结充分;实验方案有一定的创新性。30总 分
收藏