面向对象程序设计实验报告04Word格式文档下载.docx
- 文档编号:15066048
- 上传时间:2022-10-27
- 格式:DOCX
- 页数:20
- 大小:258.42KB
面向对象程序设计实验报告04Word格式文档下载.docx
《面向对象程序设计实验报告04Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计实验报告04Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
1、需求分析
1.题目要求
整型队列是一种先进后出的存储结构,对其进行的操作通常包括判断队列是否为空、向队列顶添加一个整型元素、出队列等。
整型队列类型及其操作函数采用面向对象的C++语言定义,请将完成上述操作的所有函数采用C++编程,然后写一个main函数对队列的所有操作函数进行测试。
classQUEUE{
int*constelems;
//申请内存用于存放队列的元素
constintmax;
//队列能存放的最大元素个数
inthead,tail;
//队列头和尾,队列空时head=tail;
初始时head=tail=0
public:
QUEUE(intm);
//初始化队列:
最多m个元素
QUEUE(constQUEUE&
s);
//用队列s拷贝初始化队列
virtualoperatorint()const;
//返回队列的实际元素个数
virtualQUEUE&
operator<
<
(inte);
//将e入队列,并返回队列
operator>
>
(int&
e);
//出队列到e,并返回队列
operator=(constQUEUE&
//赋s给队列,并返回被赋值的队列
virtualvoidprint()const;
//打印队列
virtual~QUEUE();
//销毁队列
};
2.需求分析
这里主要完成队列的8个功能,和之前的实验只有一点出入,首先是队列的初始化,然后是对初始化后的队列赋值,然后求队列的实际长度,这里不需要求队列的最大长度,其实和之前赋值的一样,设队列的最大长度是MAXSIZE40,入队和出队与之前栈的出栈入栈相反,这里是先进先出,使用头尾两个变量成员来完成,然后是对已经赋值过的队列再进行赋值,这里重新赋完值的队列会覆盖之前的元素。
然后是队列的销毁,即析构函数。
2、系统设计
1.概要设计
这里要完成的是队列的基本操作,用到了C++中的虚函数,但是和上次试验一样,没有太大的作用。
如上图所示,要求完成8大基本功能,除了队列的初始化,还有赋值初始化,在主函数中没有写出来,因为我觉得第6个功能可以包括这一项,对初始化的队列进行赋值。
在入队和出队功能设计上队列是先进先出和栈的先进后出刚好相反,这里需要设置两个指针,分别表示头指针和尾指针,基本所有操作靠这两个指针的变化完成,所有这两个指针很重要,首先还是初始化,这个和栈的初始化没有什么不同,用关键字new进行空间分配,设队列最多m个元素,在函数体外完成elems(newint[m]),max(elems==NULL?
0:
m),然后在函数体写头指针等于尾指针等于0,此时为空队列。
然后赋值初始化,因为此时队列为空,没有元素,所以直接将s的元素拷贝到初始化队列中。
然后求队列实际元素,使用头尾指针的关系式得出。
入队和入栈没有太大区别,只是此时位置要用尾指针取长度的余数,否则赋值可能超出范围,elems[tail%MAXSIZE]=e;
因为尾指针可以移动,最后将尾指针加1即可。
出队和入队同理,由于是先进先出,所以直接是头指针出队,e=elems[head%MAXSIZE];
然后对队列赋值,将队列s赋给队列,若有之前入队列的值,这些值将被覆盖。
打印队列同样使用一个循环,输出队列的每一个元素,只是此时要注意队列的实际长度,而且第一个元素不一定是从0开始,因为head是移动的,而头指针可能在尾指针的后面,所以需要进行取模,和入队出队一样,那么循环元素从j=(head+i)%MAXSIZE开始,i的值从0开始增加(tail-head+MAXSIZE)%MAXSIZE;
这是队列的实际长度的求法,最后将所有的元素打印出来即可。
销毁队列即析构队列,之前使用new关键字,这里使用delete进行销毁。
2.详细设计
和之前栈的操作一样,这里给出一个例子直观的看到队列的特点先进先出:
队列还有一个重要的特点是如何判断队空和队满,这里给出一种方法,其实海投别的方法,比如设一个标志位,但这里这样使用最简单:
给出图如下:
解决了这三个最重要的问题,队列的操作基本也解决了,队列的实际长度可用(tail-head+MAXSIZE)%MAXSIZE来表示,这样也不怕得出负数的值,加上队列的最大长度最后取模的余数就可以得到实际长度了,和之前判断队满有异曲同工之妙。
后面的操作就比较简单了,首先还是初始化队列,设队列最大长度为m,而m的长度定义为MAXSIZE,函数体里面直接让队是空的,头等于尾0.然后是赋值初始化,和之前的栈一样,对空队列赋值
QUEUE:
:
s):
elems(newint[s.max]),max(s.max)//用队列s拷贝初始化队列
{
head=s.head;
tail=s.tail;
}
现在函数体外对元素分配一定的空间,使用关键字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)+=MAXSIZE;
}
elems[tail%MAXSIZE]=e;
tail=tail+1;
return*this;
注意判断队满的条件,然后尾指针加1.
出队即将头指针元素出队,然后将尾指针向后移动一位。
注意之前要判断队列是否为空,
if(head==tail)
此队列为空"
endl;
else
e=elems[head%MAXSIZE];
head=head+1;
出队列的元素是:
e<
然后是对队列再次进行赋值,将队列s的元素赋给之前的队列,先判断之前队列是否为空,不为空直接将此队列分配的空间删除,然后将s的成员与大小赋给队列,使用一个循环,将s的所有元素也赋给队列。
if(elems!
=NULL)
delete[]elems;
elems)=newint[s.max];
max)=s.max;
head=s.head;
tail=s.tail;
for(inti=0;
i<
MAXSIZE;
i++)
elems[i]=s.elems[i];
intj;
if(elems==NULL||head==tail)
该队列为空"
intk=(tail-head+MAXSIZE)%MAXSIZE;
k;
j=(head+i)%MAXSIZE;
data"
["
j<
]="
elems[j]<
最后销毁队列即使用析构函数,使用关键字delete将所有元素删除,销毁分配的空间。
3、软件开发
使用的codeblocks10.05进行开发,在普通的PC机上都可完成,调试工具使用codeblocks上自带的Debug进行调试,可以看到元素的值和指针的地址,错误也可显示。
4、软件测试
首先是主界面,同样使用文本界面,用switch语句选择控制实现的功能,截图如下:
图4-1
这里入队同样是一个个的入,首先入一个元素4,截图如下:
图4-2
然后将刚入队的4进行出队,已经检测过,多个元素也是先进先出。
截图如下:
图4-3
这里可观察刚刚4的确已经入队了,这里出队也没错误,多个元素满足先进先出。
由于之前出队后队列为空了,这里使用功能6先对空的队列进行赋值,然后输出队列的长度,对比得出结论,功能可以正常实现。
图4-4
然后将这些入队的元素打印出来,截图如下:
图4-5
如上图所示,得出的元素正确打印。
要实现第6个功能,其实上面已经是吸纳过,这里再演示一遍,先将队列销毁,然后再进行初始化,执行功能6,对队列进行赋值,然后将这些元素打印出来,截图如下:
图4-6
最后将队列摧毁,队列长度变为0,截图如下:
图4-7
5、特点与不足
1.技术特点
这里使用了虚函数,但作用并不大,因为没有要实现动态多态性的功能,所以整体实验和之前的差不多,算法实现有些区别而已,做的比较好的是分配空间那块,可以一直进行分配,还有判断队满也比较巧妙,没有借助第三个变量,直接取模完成。
然后入队和出队也比较简洁,在完成入队操作同时也进行了变量加1的操作,整体功能都实现了,使用的语言也较为简洁明了。
2.不足和改进的建议
不足之处和之前的差不多,析构函数没有使用好,然后赋值操作也比较粗暴简单,直接将原有的值进行销毁,这样速度可能就有些慢,但实现却容易多了,所以也不完全算是缺点。
6、过程和体会
1.遇到的主要问题和解决方法
对判断队空和队满那里有一些迷糊,然后是求队列的实际长度没有考虑到会出现负数的情况。
打印队列的时候也除了一点错,没有想到不能从0开始打印,应该从head开始,还要考虑head在tail后面的情况,所以还是要取模计算,最后解决这些一部分是问了同学,还有一部分是翻看之前的数据结构课件解决的。
还有比较好的方法是使用debug来调试程序,设置断点查看执行到哪一步出错,不过这里我已经知道错误地方,只要找到解决方案即可。
2.课程设计的体会
主要是对之前一个数据结构的算法的回顾,之前学习的有许多都忘记了,现在重新回顾一遍记起来的速度其实还比较快,学习其实就死一个遗忘,记忆,遗忘再记忆的过程。
现在写这些层序还比较上手,不过C++语言有些用的还是不太上手,比如初始化和函数的析构,这部分比较陌生,主要是使用的次数很少,还是得多实践才能熟悉这些知识点。
7、源码和说明
1.文件清单及其功能说明
按照老师的要求,这里也要进行封装,封装成头文件在主程序里直接编写对应的函数功能。
#ifndefQUEUE1_H_INCL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序设计 实验 报告 04