东北大学软件学院C实验报告.doc

举报
资源描述
.\ 课程编号:B080101020 《C++程序设计》 实验报告 姓名 学号 班级 指导教师 实验名称 《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 10 3. 实验内容与实验过程及分析 实验一 项目一: 内容: 使用动态数组完成编写并测试3X3矩阵转置函数,使用数组保存3X3矩阵,使用指针实现函数的功能。 代码: main() { int i,j; int **p; p=new int*[3]; cout<<"输入矩阵的元素:"<>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; } void transpose (int **matrix) { int i,k,j; for(i=0;i<3;i++) { for(j=0;j<3;j++){ if(j>i){ k=matrix[j][i]; matrix[j][i]=matrix[i][j]; matrix[i][j]=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 buffer[88]; 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 << "读文件" << endl; read(); system("pause"); } 运行结果: 总结:学会了C++如何进行文件读写操作。 实验二 项目一: 内容: 以成员函数方式重载的“+”操作符的原型为:CPoint CPoint::operator+ (CPoint pt); 以全局函数方式重载的“-”操作符的原型为:CPoint operator- (CPoint pt1, CPoint pt2); 分析以成员函数方式和全局函数方式重载运行符的异同点。重载的“>>”操作符的原型为:istream& operator>>(istream&, CPoint&);重载的“<<”操作符的原型为:ostream& operator>>(ostream&, CPoint);思考一下,重载的“>>”操作符和“<<”操作符能否作为CPoint类的成员函数来实现。 代码: #include #include class CPoint { private: int x,y; static int nCount ;// nCount用于保存点的个数 public: CPoint(int px=0,int py=0):x(px),y(py) { }//构造函数,这个地方一定要写函数体内容,不然没有初始化的话会导致运行出错。 //CPoint(CPoint&); ~CPoint(){}//这是析构函数 int GETX() const { return x; } int GETY() const { return y; } void SetX(int a) { x=a; } void SetY(int b) { y=b; } void ShowPoint() { cout<<"("<>(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 <<"重载<<直接输出对象得到:"<< "("<>(istream &is,CPoint &c) { is >>c.x>>c.y; return is; } class CLine { private: 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;//两个点相加 cout<>直接创建一个点,请输入两个值:"; CPoint LoadPoint; cin>>LoadPoint; cout< #include class CPoint { private: int x,y; static int nCount ;// nCount用于保存点的个数 public: CPoint(int px=0,int py=0):x(px),y(py) { }//构造函数,这个地方一定要写函数体内容,不然没有初始化的话会导致运行出错。 //CPoint(CPoint&); ~CPoint(){}//这是析构函数 int GetX() const { return x; } int GetY() const { return y; } void SetX(int a) { x=a; } void SetY(int b) { y=b; } virtual void ShowPoint()//只有把它设置为虚函数时候才会出现(8,9)(3,2,5)的输出结果。否则都是(8,9)(3,2) { cout<<"("<ShowPoint(); 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等成员函数。 代码: #include class vehicle { public: int MaxSpeed; int Weight; virtual void Run(){ //执行该方法则开始运行 cout<<"开始运行,速度为"<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 #include using namespace std; template T min(T a, T b) { T c; c = (a> 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; do { cin >> n; a.push_back(n); } while (n != 0); for (int x = 0; (unsigned int)xa[y]) { int z = a[x]; a[x] = a[y]; a[y] = z; } for (int i = 0; (unsigned int)i <= a.size() - 1; i++) cout << a[i] << " "; 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/5852825 3、Chwen CN博客园博主 博客链接http://www.cnblogs.com/chwen/p/4055474.html .\ 附录: 《C++程序设计》实验成绩评定表 评价内容 具 体 要 求 分值 得分 平时表现 实验过程中,无缺勤现象,态度积极,具有严谨的学习态度和认真、踏实、一丝不苟的科学作风。 20 提交材料 能够按时提交实验要求的所有材料(要求在以“学号-姓名”命名的文件夹中,包含实验报告电子版、和分别以实验源代码1、2、3、4等命名的存放四次实验源代码的四个子文件夹,源代码仅包含代码文件,不要包含工程维护文件等),材料完备,质量、格式、内容等符合要求。 20 报告质量 实验报告格式规范,体例符合要求;报告内容充实、正确,实验目的归纳合理到位,思考题回答准确。 30 实验内容 能够按实验要求合理设计并开发出程序,认真记录实验数据,原理及实验结果分析准确,归纳总结充分;实验方案有一定的创新性。 30 总 分
展开阅读全文
温馨提示:
得力文库 - 分享文档赚钱的网站所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
相关搜索

当前位置:首页 > 教育专区 > 教案示例


本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com