北邮小学期c++实验报告

上传人:ji****72 文档编号:37631647 上传时间:2018-04-20 格式:DOCX 页数:41 大小:2.09MB
返回 下载 相关 举报
北邮小学期c++实验报告_第1页
第1页 / 共41页
北邮小学期c++实验报告_第2页
第2页 / 共41页
北邮小学期c++实验报告_第3页
第3页 / 共41页
北邮小学期c++实验报告_第4页
第4页 / 共41页
北邮小学期c++实验报告_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《北邮小学期c++实验报告》由会员分享,可在线阅读,更多相关《北邮小学期c++实验报告(41页珍藏版)》请在金锄头文库上搜索。

1、面向对象程序设计与实践c+实验总结报告网络工程 14 班饶思哲学号:2013211574 实验一实验一 简单简单 C程序设计程序设计 1.猜价格游戏 编写 C+程序完成以下功能: (1)假定有一件商品,程序用随机数指定该商品的价格(1-1000 的整数) ; (2)提示用户猜价格,并输入:若用户猜的价格比商品价格高或低,对用户作出相应的 提示; (3)直到猜对为止,并给出提示。题目 1-1 总结: 1)本题需要随机生成整数,我开始只使用 rand(),即 price=rand();来生成随机整数 但这样只是一个伪随机函数,每一次重新打开程序生成的数都是一致的。 因此加入时间随机种子:srand

2、(unsigned)time(NULL) 2)个人改进 1:定义最大值最小值,在每次猜测数字时显示应猜的数字范围,作为提示。 想到这个是因为有一次猜了很多遍都没猜到,一时突然忘记猜到什么范围,然后往前 翻猜过的数字和大小感觉相当麻烦,所以就添上了应猜范围,方便再一次猜数。3)个人改进 2:本来有一个判断条件判断生成的随机数是不是 11000 范围内,而后更进 为随机生成整数对 1000 取余得到 0999 整数,再+1 得到 11000 的整数。实验二实验二 类与对象类与对象 1.矩形 编写 C+程序完成以下功能: (1)定义一个 Point 类,其属性包括点的坐标,提供计算两点之间距离的方法

3、; (2)定义一个矩形类,其属性包括左上角和右下角两个点,提供计算面积的方法; (3)创建一个矩形对象,提示用户输入矩形左上角和右下角的坐标; (4)观察矩形对象以及 Point 类成员的构造函数与析构函数的调用; (5)计算其面积,并输出。题目 2-1 总结: 1)这一题是第一次用到 class 类的题目,开始并不明白为何要定义 class,然后还需要区分 public 和 private。而后来去图书馆借了书看到 c最大特色就是可以封装,定义私有 属性和公有函数,以确保有些函数和参数不会被轻易访问到,降低错误率。2)class 类在最起初定义时总是在 class Rectangle 那一行

4、报错,经查书发现 class 定义最后 一个大括号后有分号,开始并没有加上。 3)起初在调用 class 中函数时用 c 调用的方式,没有跟面向的对象结合,导致编译出错, 而后从 distance()改为 p.distance()就正确了。 4)计算两点距离和面积运用开方和绝对值函数,前面若没有加头文件 math.h 则会报错。 5)输入左上角右下角坐标时,若输入不当,可能会出现面积为负值的情况,所以加上绝 对值函数保证面积非负。 6)起初不知道构造函数和析构函数的定义和用法,经翻阅书籍和运行程序得知构造函数 在创建对象时调用,可以有多个。而析构函数则在释放对象时调用,一般每一个 class

5、中都只有一个默认析构函数。且构造函数与类名称一致,析构函数则在类名称前加。2.友元 编写 C+程序完成以下功能: (1)定义一个 Boat 和 Car 两个类,他们都具有私用属性重量; (2)编写一个函数,计算两者的重量和。double TotalWeight(Boat题目 2-3 总结: 1)友元函数:在两个对象中都使用到时,可以使用友元函数,并在类外单独定义。 友元函数是允许在类外访问类中的任何成员的。开始在类外单独定义时跟类的成员函 数单独定义混淆,写成了 double Boat:TotalWeight(),导致编译错误,而后发现友元函数 直接用函数名和函数返回值类型定义即可,不需要加上

6、 class 类的名称。 2)起初定义完 class Boat 和 class Car 后发现编译错误,在友元函数的声明那一行出错,而 后发现在这行之前没有定义 Car 类,于是将其在最开头声明出来,通过。 3)起初并没有加上 boat 和 car 类的构造函数和析构函数,可是经上网查阅,默认构造函 数和析构函数可以系统自动生成,但析构函数只能删除成员指针,并不能释放指针指 向的空间,所以若没有申请动态内存,析构函数可不写出,若申请,则需自行在析构 函数中 delete。实验三实验三 数组与指针数组与指针 1.矩阵(一) 编写C+程序完成以下功能: (1)假定矩阵大小为 45(整型数组表示)

7、; (2)定义矩阵初始化函数,可以从 cin 中输入矩阵元素; (3)定义矩阵输出函数,将矩阵格式化输出到 cout; (4)定义矩阵相加的函数,实现两个矩阵相加的功能,结果保存在另一个矩阵中; (5)定义矩阵相减的函数,实现两个矩阵相减的功能,结果保存在另一个矩阵中; (6)定义三个矩阵:A1、A2、A3; (7)初始化 A1、A2; (8)计算并输出:A3 = A1 加 A2,A3 = A1 减 A2。题目 3-1 总结: 1)起初在矩阵相加相减的赋值中所用语句为:m.matrixij=a.matrixij+b.matrixij但是运行程序发现 m 矩阵所有元素都是 0。经单步调试,发现并

8、没有赋值成功。经查 阅书籍,了解到 this 指针是指向类的对象的地址,便改用 this-matrixij作为赋值对象, 最后程序正确。 2)个人改进:将行数列数在文件开头用 define 定义,可以随时更改。 3)经多次调试后,程序运行结果正确,但矩阵看起来非常混乱,因为并没有行列对齐, 于是在打印矩阵中每列直接用 table 空格隔开,保证美观。 2.矩阵(二) 编写C+程序完成以下功能: (1)假定矩阵大小为 45(整型) ; (2)矩阵空间采用 new 动态申请,保存在指针中; (3)定义矩阵初始化函数,可以从 cin 中输入矩阵元素; (4)定义矩阵输出函数,将矩阵格式化输出到 co

9、ut; (5)定义矩阵相加的函数,实现两个矩阵相加的功能,结果保存在另一个矩阵中; (6)定义矩阵相减的函数,实现两个矩阵相减的功能,结果保存在另一个矩阵中; (7)动态申请三个矩阵:A1、A2、A3; (8)初始化 A1、A2; (9)计算并输出 A3 = A1 加 A2,A3 = A1 减 A2; (10) 释放矩阵空间。题目 3-2 总结: 1)与 3-1 题目的区别在 int main 中用 new 函数动态申请内存,然后析构函数需要释放申 请的空间而不只是自动删除指向空间的指针。析构函数如图。一开始并不知道该怎么动态申请内存,在 c 中使用 malloc 可是 c中并不一样。经查 阅

10、书籍,发现 c中申请释放内存用 new 和 delete 非常简便。 2)指针调用类成员函数一开始不知道该怎么写,写成 A1.input()结果编译错误。经查阅书 籍,得知指针调用成员函数需写成 A1-input()的形式。 3)在释放动态内存时,用到 delete 函数。但开始的时候写 delete matrix 时候会出问题。 上网查询后得到以下 delete 用法。 Delete 用法:当释放内部类型,如 int double 型时,直接 delete a 即可。若是释放自己 定义的 class 类型,需用 deletematrix 来释放内存。 3.矩阵(三) 编写C+程序完成以下功能

11、: (1)用类来实现矩阵,定义一个矩阵的类,属性包括: 矩阵大小,用 lines, rows(行、列来表示) ; 存贮矩阵的数组指针,根据矩阵大小动态申请(new) 。 (2)矩阵类的方法包括: 构造函数,参数是矩阵大小,需要动态申请存贮矩阵的数组; 析构函数,需要释放矩阵的数组指针; 拷贝构造函数,需要申请和复制数组; 输入,可以从 cin 中输入矩阵元素; 输出,将矩阵格式化输出到 cout; 矩阵相加的函数,实现两个矩阵相加的功能,结果保存在另一个矩阵类,但必须 矩阵大小相同; 矩阵相减的函数,实现两个矩阵相减的功能,结果保存在另一个矩阵类,但必须 矩阵大小相同。 (3)定义三个矩阵:A

12、1、A2、A3; (4)初始化 A1、A2; (5)计算并输出 A3 = A1 加 A2,A3=A1 减 A2; (6)用 new 动态创建三个矩阵类的对象:pA1、pA1、pA3; (7)初始化 pA1、pA2; (8)计算并输出 pA3=pA1 加 pA2,pA3=pA1 减 pA2; (9)释放 pA1、pA1、pA3。题目 3-3 总结: 1)拿到这道题我认为要定义一个矩阵类对象,其中包括 3-1 和 3-2 一样的 input 函数, print 函数,plus 函数,subtract 函数,还有新增的构造函数析构函数。一上来我认为 class 中属性不再是之前的某行某列的数值,而是

13、行数和列数还有矩阵的头指针。根据 输入的行数列数来申请内存,再将数值存入不同的位置。然后在主函数中分为两个部 分,一个是直接创建对象,另一个是创建矩阵数组指针。 2)第一部分跟前两题类似,所以很快就调试完成并且得到了正确的结果,但是指针部分 一直出现问题。最开始是三个矩阵分别申请内存,这样的后果就是要输入三次行数和 列数的数值,有可能出现行列数不相等的情况,给之后的加减操作带来麻烦。因此想 到让 A1 矩阵申请内存,而让 A2、A3 矩阵都与 A1 相等,就可以避免多次输入行列数, 且保证了矩阵大小相等。但这样输入第一个矩阵数值后,矩阵元素获取正常。可当输 入第二个矩阵的数值以后,A1 和 A

14、2 矩阵的元素都变为第二个矩阵的元素,即第一个 矩阵的元素被覆盖掉。导致和矩阵为第二个矩阵的 2 倍,差矩阵都是零。经过反复调 试,曾经试过将含参构造函数中输入行列数改到主函数中,再给 A1 申请动态内存。但 是因为 A2 和 A3 还是初始化跟 A1 相等,结果并没有改变,还是错误的。而后想到用含 参构造函数来申请动态内存,输入固定的行列数后,用确定的行列数来 new Matrix(x,y), 这样一来不仅矩阵大小相等,而且也不会存在前一个矩阵的值被后一个覆盖掉的问题。 经过调试,终于得到了正确的结果。 3)调试过程中我了解到指针初始化和赋值过程中是容易发生树脂覆盖的,所以尽量不要 将指针初

15、始化成跟某个指针相等。实验四实验四 继承与派生继承与派生 1、 形状(一) 编写C+程序完成以下功能: (1)声明一个基类 Shape(形状) ,其中包含一个方法来计算面积; (2)从 Shape 派生两个类矩形和圆形; (3)从矩形派生正方形; (4)分别实现派生类构造函数、析构函数和其他方法; (5)创建派生类的对象,观察构造函数、析构函数调用次序; (6)不同对象计算面积。题目 4-1 总结: 1)这一题主要是函数的派生方法使用,经过查阅书籍,得知在 class 定义后加上: public(基类名称)便是作为一个派生类的定义,可以沿用基类中的成员函数。 2)并且经过对构造函数和析构函数调

16、用,得知是先调用基类的构造函数,再调用派生类 的构造函数创建派生类对象,在程序结束时,先调用派生类的析构函数释放派生类对 象,再调用基类的析构函数释放基类对象。 2、 形状(二)虚函数 (1)将【形状(一) 】 中的基类计算面积的方法定义为虚函数,比较与【形状(一) 】 程序的差异; (2)将【形状(一) 】中的基类定义抽象类,比较与【形状(一) 】程序的差异。题目 4-2 总结: 1)起初并不知道虚函数的作用,后来经过查阅书籍得知在基类中定义虚函数,是为了在 派生类中定义这一函数的不同操作方式。并且起初只改变了基类中 area 函数,在其前 面加了 virtual,但并没有体现出虚函数的运用。而后看到书上虚函数的应用,发现虚 函数是可以让一个基类指针调用派生类相应函数的。于是经过改进,在主函数中定义 了 3 个基类指针,分别指向派生矩形类对象、派生圆形类对象、派生正方形对象,然 后并非通过对象名称调用成员函数,而是用基类指针调用派生类中的 area 函数

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号