ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:258.42KB ,
资源ID:2148020      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/2148020.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(面向对象程序设计实验报告04.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

面向对象程序设计实验报告04.docx

1、面向对象程序设计实验报告04课 程 实 验 报 告课程名称:面向对象程序设计实验名称:面向对象的整型队列编程院 系 :计算机科学与技术 专业班级 : CS1305 学 号 : U201314933 姓 名 : 严铭 指导教师 : 马光志 2015 年 12 月 30 日1、需求分析1. 题目要求整型队列是一种先进后出的存储结构,对其进行的操作通常包括判断队列是否为空、向队列顶添加一个整型元素、出队列等。整型队列类型及其操作函数采用面向对象的C+语言定义,请将完成上述操作的所有函数采用C+编程, 然后写一个main函数对队列的所有操作函数进行测试。class QUEUE int *const e

2、lems; /申请内存用于存放队列的元素 const int max; /队列能存放的最大元素个数 int head, tail; /队列头和尾,队列空时head=tail;初始时head=tail=0public:QUEUE(int m); /初始化队列:最多m个元素QUEUE(const QUEUE &s); /用队列s拷贝初始化队列virtual operator int ( ) const; /返回队列的实际元素个数virtual QUEUE& operator(int &e); /出队列到e,并返回队列virtual QUEUE& operator=(const QUEUE &s);

3、 /赋s给队列,并返回被赋值的队列virtual void print( ) const; /打印队列virtual QUEUE( ); /销毁队列;2. 需求分析这里主要完成队列的8个功能,和之前的实验只有一点出入,首先是队列的初始化,然后是对初始化后的队列赋值,然后求队列的实际长度,这里不需要求队列的最大长度,其实和之前赋值的一样,设队列的最大长度是MAXSIZE40,入队和出队与之前栈的出栈入栈相反,这里是先进先出,使用头尾两个变量成员来完成,然后是对已经赋值过的队列再进行赋值,这里重新赋完值的队列会覆盖之前的元素。然后是队列的销毁,即析构函数。2、系统设计1. 概要设计这里要完成的是队

4、列的基本操作,用到了C+中的虚函数,但是和上次试验一样,没有太大的作用。如上图所示,要求完成8大基本功能,除了队列的初始化,还有赋值初始化,在主函数中没有写出来,因为我觉得第6个功能可以包括这一项,对初始化的队列进行赋值。在入队和出队功能设计上队列是先进先出和栈的先进后出刚好相反,这里需要设置两个指针,分别表示头指针和尾指针,基本所有操作靠这两个指针的变化完成,所有这两个指针很重要,首先还是初始化,这个和栈的初始化没有什么不同,用关键字new进行空间分配,设队列最多m个元素,在函数体外完成elems(new int m),max(elems = NULL?0:m) ,然后在函数体写头指针等于尾

5、指针等于0,此时为空队列。然后赋值初始化,因为此时队列为空,没有元素,所以直接将s的元素拷贝到初始化队列中。然后求队列实际元素,使用头尾指针的关系式得出。入队和入栈没有太大区别,只是此时位置要用尾指针取长度的余数,否则赋值可能超出范围,elemstail%MAXSIZE = e;因为尾指针可以移动,最后将尾指针加1即可。出队和入队同理,由于是先进先出,所以直接是头指针出队,e=elemshead%MAXSIZE;然后对队列赋值,将队列s赋给队列,若有之前入队列的值,这些值将被覆盖。打印队列同样使用一个循环,输出队列的每一个元素,只是此时要注意队列的实际长度,而且第一个元素不一定是从0开始,因为

6、head是移动的,而头指针可能在尾指针的后面,所以需要进行取模,和入队出队一样,那么循环元素从j=(head+i)%MAXSIZE开始,i的值从0开始增加(tail-head+MAXSIZE)%MAXSIZE;这是队列的实际长度的求法,最后将所有的元素打印出来即可。销毁队列即析构队列,之前使用new关键字,这里使用delete进行销毁。2. 详细设计和之前栈的操作一样,这里给出一个例子直观的看到队列的特点先进先出:队列还有一个重要的特点是如何判断队空和队满,这里给出一种方法,其实海投别的方法,比如设一个标志位,但这里这样使用最简单:给出图如下: 解决了这三个最重要的问题,队列的操作基本也解决了

7、,队列的实际长度可用(tail-head+MAXSIZE)%MAXSIZE来表示,这样也不怕得出负数的值,加上队列的最大长度最后取模的余数就可以得到实际长度了,和之前判断队满有异曲同工之妙。后面的操作就比较简单了,首先还是初始化队列,设队列最大长度为m,而m的长度定义为MAXSIZE,函数体里面直接让队是空的,头等于尾0.然后是赋值初始化,和之前的栈一样,对空队列赋值QUEUE:QUEUE(const QUEUE &s):elems(new ints.max),max(s.max) /用队列s拷贝初始化队列 head = s.head; tail = s.tail;现在函数体外对元素分配一定的

8、空间,使用关键字new,然后规定最大长度为m,在函数体连直接将s的头指针和尾指针赋给初始化的队列。求队列的实际长度,上面已经说明,最后直接返回这个表达式即可。入队和入栈差不多,先判断队是否已经满了,满了之后对队列追加空间,然后再入队int *newbase; if(tail+1)%MAXSIZE=head) cout 此队列已满! endl; newbase = (int *)realloc(elems,(max + MAXSIZE)*sizeof(int); if(!newbase) exit(1); *(int*)&elems) = newbase; *(int *)&max) += MA

9、XSIZE; elemstail%MAXSIZE = e; tail=tail+1; return *this;注意判断队满的条件,然后尾指针加1.出队即将头指针元素出队,然后将尾指针向后移动一位。注意之前要判断队列是否为空,if(head=tail) cout 此队列为空 endl; else e=elemshead%MAXSIZE; head=head+1; cout 出队列的元素是:eendl; return *this;然后是对队列再次进行赋值,将队列s的元素赋给之前的队列,先判断之前队列是否为空,不为空直接将此队列分配的空间删除,然后将s的成员与大小赋给队列,使用一个循环,将s的所有

10、元素也赋给队列。if(elems != NULL) delete elems; *(int*)&elems) = new ints.max; *(int *)&max) = s.max; head=s.head; tail=s.tail; for(int i = 0;i MAXSIZE;i+) elemsi = s.elemsi; return *this;打印队列同样使用一个循环,输出队列的每一个元素,只是此时要注意队列的实际长度,而且第一个元素不一定是从0开始,因为head是移动的,而头指针可能在尾指针的后面,所以需要进行取模,和入队出队一样,那么循环元素从j=(head+i)%MAXSI

11、ZE开始,i的值从0开始增加(tail-head+MAXSIZE)%MAXSIZE;这是队列的实际长度的求法,最后将所有的元素打印出来即可。int j; if( elems = NULL | head = tail ) cout 该队列为空endl; else int k=(tail-head+MAXSIZE)%MAXSIZE; for(int i = 0;i k;i+) j=(head+i)%MAXSIZE; cout dataj=elemsj endl; 最后销毁队列即使用析构函数,使用关键字delete将所有元素删除,销毁分配的空间。3、软件开发使用的codeblocks10.05进行开

12、发,在普通的PC机上都可完成,调试工具使用codeblocks上自带的Debug进行调试,可以看到元素的值和指针的地址,错误也可显示。4、软件测试首先是主界面,同样使用文本界面,用switch语句选择控制实现的功能,截图如下:图4-1这里入队同样是一个个的入,首先入一个元素4,截图如下:图4-2然后将刚入队的4进行出队,已经检测过,多个元素也是先进先出。截图如下:图4-3这里可观察刚刚4的确已经入队了,这里出队也没错误,多个元素满足先进先出。由于之前出队后队列为空了,这里使用功能6先对空的队列进行赋值,然后输出队列的长度,对比得出结论,功能可以正常实现。图4-4然后将这些入队的元素打印出来,截

13、图如下:图4-5如上图所示,得出的元素正确打印。要实现第6个功能,其实上面已经是吸纳过,这里再演示一遍,先将队列销毁,然后再进行初始化,执行功能6,对队列进行赋值,然后将这些元素打印出来,截图如下:图4-6最后将队列摧毁,队列长度变为0,截图如下: 图4-75、特点与不足1. 技术特点这里使用了虚函数,但作用并不大,因为没有要实现动态多态性的功能,所以整体实验和之前的差不多,算法实现有些区别而已,做的比较好的是分配空间那块,可以一直进行分配,还有判断队满也比较巧妙,没有借助第三个变量,直接取模完成。然后入队和出队也比较简洁,在完成入队操作同时也进行了变量加1的操作,整体功能都实现了,使用的语言

14、也较为简洁明了。2. 不足和改进的建议不足之处和之前的差不多,析构函数没有使用好,然后赋值操作也比较粗暴简单,直接将原有的值进行销毁,这样速度可能就有些慢,但实现却容易多了,所以也不完全算是缺点。6、过程和体会1. 遇到的主要问题和解决方法对判断队空和队满那里有一些迷糊,然后是求队列的实际长度没有考虑到会出现负数的情况。打印队列的时候也除了一点错,没有想到不能从0开始打印,应该从head开始,还要考虑head在tail后面的情况,所以还是要取模计算,最后解决这些一部分是问了同学,还有一部分是翻看之前的数据结构课件解决的。还有比较好的方法是使用debug来调试程序,设置断点查看执行到哪一步出错,不过这里我已经知道错误地方,只要找到解决方案即可。2. 课程设计的体会主要是对之前一个数据结构的算法的回顾,之前学习的有许多都忘记了,现在重新回顾一遍记起来的速度其实还比较快,学习其实就死一个遗忘,记忆,遗忘再记忆的过程。现在写这些层序还比较上手,不过C+语言有些用的还是不太上手,比如初始化和函数的析构,这部分比较陌生,主要是使用的次数很少,还是得多实践才能熟悉这些知识点。7、源码和说明1. 文件清单及其功能说明按照老师的要求,这里也要进行封装,封装成头文件在主程序里直接编写对应的函数功能。#ifndef QUEUE1_H_INCL

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1