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

上传人:b****3 文档编号:2148020 上传时间:2022-10-27 格式:DOCX 页数:20 大小:258.42KB
下载 相关 举报
面向对象程序设计实验报告04.docx_第1页
第1页 / 共20页
面向对象程序设计实验报告04.docx_第2页
第2页 / 共20页
面向对象程序设计实验报告04.docx_第3页
第3页 / 共20页
面向对象程序设计实验报告04.docx_第4页
第4页 / 共20页
面向对象程序设计实验报告04.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

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

《面向对象程序设计实验报告04.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计实验报告04.docx(20页珍藏版)》请在冰豆网上搜索。

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

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

 

课程实验报告

 

课程名称:

面向对象程序设计

实验名称:

面向对象的整型队列编程

 

院系:

计算机科学与技术

专业班级:

CS1305

学号:

U201314933

姓名:

严铭

指导教师:

马光志

 

2015年12月30日

 

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入队列,并返回队列

virtualQUEUE&operator>>(int&e);//出队列到e,并返回队列

virtualQUEUE&operator=(constQUEUE&s);//赋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:

:

QUEUE(constQUEUE&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<<"此队列已满!

"<

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)

{

cout<<"此队列为空"<

}

else

{

e=elems[head%MAXSIZE];

head=head+1;

cout<<"出队列的元素是:

"<

}

return*this;

然后是对队列再次进行赋值,将队列s的元素赋给之前的队列,先判断之前队列是否为空,不为空直接将此队列分配的空间删除,然后将s的成员与大小赋给队列,使用一个循环,将s的所有元素也赋给队列。

if(elems!

=NULL)

{

delete[]elems;

}

*((int**)&elems)=newint[s.max];

*((int*)&max)=s.max;

head=s.head;

tail=s.tail;

for(inti=0;i

{

elems[i]=s.elems[i];

}

return*this;

打印队列同样使用一个循环,输出队列的每一个元素,只是此时要注意队列的实际长度,而且第一个元素不一定是从0开始,因为head是移动的,而头指针可能在尾指针的后面,所以需要进行取模,和入队出队一样,那么循环元素从j=(head+i)%MAXSIZE开始,i的值从0开始增加(tail-head+MAXSIZE)%MAXSIZE;这是队列的实际长度的求法,最后将所有的元素打印出来即可。

intj;

if(elems==NULL||head==tail)

{

cout<<"该队列为空"<

}

else

{

intk=(tail-head+MAXSIZE)%MAXSIZE;

for(inti=0;i

{

j=(head+i)%MAXSIZE;

cout<<"data"<<"["<

}

}

最后销毁队列即使用析构函数,使用关键字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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

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

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