北邮小学期c实验报告

上传人:新** 文档编号:502718403 上传时间:2024-01-03 格式:DOCX 页数:41 大小:1.83MB
返回 下载 相关 举报
北邮小学期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(unsigned)time(NULL)2)

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

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

4、没有跟面向的对象结合,导致编译出错,而后从distance()改为p.distance()就正确了。4) 计算两点距离和面积运用开方和绝对值函数,前面若没有加头文件math.h则会报错。5) 输入左上角右下角坐标时,若输入不当,可能会出现面积为负值的情况,所以加上绝对值函数保证面积非负。6) 起初不知道构造函数和析构函数的定义和用法,经翻阅书籍和运行程序得知构造函数在创建对象时调用,可以有多个。而析构函数则在释放对象时调用,一般每一个class中都只有一个默认析构函数。且构造函数与类名称一致,析构函数则在类名称前加。2. 友元编写C+程序完成以下功能:(1) 定义一个Boat和Car两个类,他

5、们都具有私用属性重量;(2) 编写一个函数,计算两者的重量和。double TotalWeight(Boat& b, Car& c);题目2-3总结:1) 友元函数:在两个对象中都使用到时,可以使用友元函数,并在类外单独定义。友元函数是允许在类外访问类中的任何成员的。开始在类外单独定义时跟类的成员函数单独定义混淆,写成了double Boat:TotalWeight(),导致编译错误,而后发现友元函数直接用函数名和函数返回值类型定义即可,不需要加上class类的名称。2) 起初定义完class Boat和class Car后发现编译错误,在友元函数的声明那一行出错,而后发现在这行之前没有定义C

6、ar类,于是将其在最开头声明出来,通过。3) 起初并没有加上boat和car类的构造函数和析构函数,可是经上网查阅,默认构造函数和析构函数可以系统自动生成,但析构函数只能删除成员指针,并不能释放指针指向的空间,所以若没有申请动态内存,析构函数可不写出,若申请,则需自行在析构函数中delete。实验三 数组与指针1. 矩阵(一)编写C+程序完成以下功能:(1) 假定矩阵大小为45(整型数组表示);(2) 定义矩阵初始化函数,可以从cin中输入矩阵元素;(3) 定义矩阵输出函数,将矩阵格式化输出到cout;(4) 定义矩阵相加的函数,实现两个矩阵相加的功能,结果保存在另一个矩阵中;(5) 定义矩阵

7、相减的函数,实现两个矩阵相减的功能,结果保存在另一个矩阵中;(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。经单步调试,发现并没有赋值成功。经查阅书籍,了解到this指针是指向类的对象的地址,便改用this-matrixij作为赋值对象,最后程序正确。2) 个人改进:将行数列数在文件开头用define定义,可以随时更改。3) 经多次调试后,程序运行结果正

8、确,但矩阵看起来非常混乱,因为并没有行列对齐,于是在打印矩阵中每列直接用table空格隔开,保证美观。2. 矩阵(二)编写C+程序完成以下功能:(1) 假定矩阵大小为45(整型);(2) 矩阵空间采用new动态申请,保存在指针中;(3) 定义矩阵初始化函数,可以从cin中输入矩阵元素;(4) 定义矩阵输出函数,将矩阵格式化输出到cout;(5) 定义矩阵相加的函数,实现两个矩阵相加的功能,结果保存在另一个矩阵中;(6) 定义矩阵相减的函数,实现两个矩阵相减的功能,结果保存在另一个矩阵中;(7) 动态申请三个矩阵:A1、A2、A3;(8) 初始化A1、A2;(9) 计算并输出A3 = A1加A2

9、,A3 = A1减A2;(10) 释放矩阵空间。题目3-2总结:1) 与3-1题目的区别在int main中用new函数动态申请内存,然后析构函数需要释放申请的空间而不只是自动删除指向空间的指针。析构函数如图。一开始并不知道该怎么动态申请内存,在c中使用malloc可是c中并不一样。经查阅书籍,发现c中申请释放内存用new和delete非常简便。2) 指针调用类成员函数一开始不知道该怎么写,写成A1.input()结果编译错误。经查阅书籍,得知指针调用成员函数需写成A1-input()的形式。3) 在释放动态内存时,用到delete函数。但开始的时候写delete matrix时候会出问题。上

10、网查询后得到以下delete用法。Delete用法:当释放内部类型,如int double型时,直接delete a 即可。若是释放自己定义的class类型,需用deletematrix来释放内存。3. 矩阵(三)编写C+程序完成以下功能:(1) 用类来实现矩阵,定义一个矩阵的类,属性包括:l 矩阵大小,用 lines, rows(行、列来表示);l 存贮矩阵的数组指针,根据矩阵大小动态申请(new)。(2) 矩阵类的方法包括:l 构造函数,参数是矩阵大小,需要动态申请存贮矩阵的数组;l 析构函数,需要释放矩阵的数组指针;l 拷贝构造函数,需要申请和复制数组;l 输入,可以从cin中输入矩阵元

11、素;l 输出,将矩阵格式化输出到cout;l 矩阵相加的函数,实现两个矩阵相加的功能,结果保存在另一个矩阵类,但必须矩阵大小相同;l 矩阵相减的函数,实现两个矩阵相减的功能,结果保存在另一个矩阵类,但必须矩阵大小相同。(3) 定义三个矩阵:A1、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) 拿到这道题我认为要定义一个矩阵类对象,

12、其中包括3-1和3-2一样的input函数,print函数,plus函数,subtract函数,还有新增的构造函数析构函数。一上来我认为class中属性不再是之前的某行某列的数值,而是行数和列数还有矩阵的头指针。根据输入的行数列数来申请内存,再将数值存入不同的位置。然后在主函数中分为两个部分,一个是直接创建对象,另一个是创建矩阵数组指针。2) 第一部分跟前两题类似,所以很快就调试完成并且得到了正确的结果,但是指针部分一直出现问题。最开始是三个矩阵分别申请内存,这样的后果就是要输入三次行数和列数的数值,有可能出现行列数不相等的情况,给之后的加减操作带来麻烦。因此想到让A1矩阵申请内存,而让A2、

13、A3矩阵都与A1相等,就可以避免多次输入行列数,且保证了矩阵大小相等。但这样输入第一个矩阵数值后,矩阵元素获取正常。可当输入第二个矩阵的数值以后,A1和A2矩阵的元素都变为第二个矩阵的元素,即第一个矩阵的元素被覆盖掉。导致和矩阵为第二个矩阵的2倍,差矩阵都是零。经过反复调试,曾经试过将含参构造函数中输入行列数改到主函数中,再给A1申请动态内存。但是因为A2和A3还是初始化跟A1相等,结果并没有改变,还是错误的。而后想到用含参构造函数来申请动态内存,输入固定的行列数后,用确定的行列数来new Matrix(x,y),这样一来不仅矩阵大小相等,而且也不会存在前一个矩阵的值被后一个覆盖掉的问题。经过

14、调试,终于得到了正确的结果。3) 调试过程中我了解到指针初始化和赋值过程中是容易发生树脂覆盖的,所以尽量不要将指针初始化成跟某个指针相等。实验四 继承与派生1、 形状(一)编写C+程序完成以下功能:(1) 声明一个基类Shape(形状),其中包含一个方法来计算面积;(2) 从Shape派生两个类矩形和圆形;(3) 从矩形派生正方形;(4) 分别实现派生类构造函数、析构函数和其他方法;(5) 创建派生类的对象,观察构造函数、析构函数调用次序;(6) 不同对象计算面积。题目4-1总结:1) 这一题主要是函数的派生方法使用,经过查阅书籍,得知在class定义后加上: public(基类名称)便是作为

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

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

当前位置:首页 > 幼儿/小学教育 > 小学课件

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