面向对象程序设计实验报告_04_第1页
面向对象程序设计实验报告_04_第2页
面向对象程序设计实验报告_04_第3页
面向对象程序设计实验报告_04_第4页
面向对象程序设计实验报告_04_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、ems;/申请内存用于存放队列的元素 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>&

3、gt;(int &e);/出队列到e,并返回队列virtual QUEUE& operator=(const QUEUE &s); /赋s给队列,并返回被赋值的队列virtual void print( ) const;/打印队列virtual QUEUE( );/销毁队列;2. 需求分析这里主要完成队列的8个功能,和之前的实验只有一点出入,首先是队列的初始化,然后是对初始化后的队列赋值,然后求队列的实际长度,这里不需要求队列的最大长度,其实和之前赋值的一样,设队列的最大长度是MAXSIZE40,入队和出队与之前栈的出栈入栈相反,这里是先进先出,使用头尾两个变量成员来完

4、成,然后是对已经赋值过的队列再进行赋值,这里重新赋完值的队列会覆盖之前的元素。然后是队列的销毁,即析构函数。2、 系统设计1. 概要设计这里要完成的是队列的基本操作,用到了C+中的虚函数,但是和上次试验一样,没有太大的作用。如上图所示,要求完成8大基本功能,除了队列的初始化,还有赋值初始化,在主函数中没有写出来,因为我觉得第6个功能可以包括这一项,对初始化的队列进行赋值。在入队和出队功能设计上队列是先进先出和栈的先进后出刚好相反,这里需要设置两个指针,分别表示头指针和尾指针,基本所有操作靠这两个指针的变化完成,所有这两个指针很重要,首先还是初始化,这个和栈的初始化没有什么不同,用关键字new进

5、行空间分配,设队列最多m个元素,在函数体外完成elems(new int m),max(elems = NULL?0:m) ,然后在函数体写头指针等于尾指针等于0,此时为空队列。然后赋值初始化,因为此时队列为空,没有元素,所以直接将s的元素拷贝到初始化队列中。然后求队列实际元素,使用头尾指针的关系式得出。入队和入栈没有太大区别,只是此时位置要用尾指针取长度的余数,否则赋值可能超出范围,elemstail%MAXSIZE = e;因为尾指针可以移动,最后将尾指针加1即可。出队和入队同理,由于是先进先出,所以直接是头指针出队,e=elemshead%MAXSIZE;然后对队列赋值,将队列s赋给队列

6、,若有之前入队列的值,这些值将被覆盖。打印队列同样使用一个循环,输出队列的每一个元素,只是此时要注意队列的实际长度,而且第一个元素不一定是从0开始,因为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(n

8、ew ints.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 *)

9、realloc(elems,(max + MAXSIZE)*sizeof(int); if(!newbase) exit(1); *(int*)&elems) = newbase; *(int *)&max) += MAXSIZE; elemstail%MAXSIZE = e; tail=tail+1; return *this;注意判断队满的条件,然后尾指针加1.出队即将头指针元素出队,然后将尾指针向后移动一位。注意之前要判断队列是否为空,if(head=tail) cout <<"此队列为空" <<endl; else e=ele

10、mshead%MAXSIZE; head=head+1; cout <<"出队列的元素是:"<<e<<endl; return *this;然后是对队列再次进行赋值,将队列s的元素赋给之前的队列,先判断之前队列是否为空,不为空直接将此队列分配的空间删除,然后将s的成员与大小赋给队列,使用一个循环,将s的所有元素也赋给队列。if(elems != NULL) delete elems; *(int*)&elems) = new ints.max; *(int *)&max) = s.max; head=s.head; tai

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

12、il ) cout <<"该队列为空"<<endl; else int k=(tail-head+MAXSIZE)%MAXSIZE; for(int i = 0;i < k;i+) j=(head+i)%MAXSIZE; cout << "data"<<""<<j<<"="<<elemsj << endl; 最后销毁队列即使用析构函数,使用关键字delete将所有元素删除,销毁分配的空间。3、 软件开发使用的cod

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

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

15、操作,整体功能都实现了,使用的语言也较为简洁明了。2. 不足和改进的建议不足之处和之前的差不多,析构函数没有使用好,然后赋值操作也比较粗暴简单,直接将原有的值进行销毁,这样速度可能就有些慢,但实现却容易多了,所以也不完全算是缺点。6、 过程和体会1. 遇到的主要问题和解决方法对判断队空和队满那里有一些迷糊,然后是求队列的实际长度没有考虑到会出现负数的情况。打印队列的时候也除了一点错,没有想到不能从0开始打印,应该从head开始,还要考虑head在tail后面的情况,所以还是要取模计算,最后解决这些一部分是问了同学,还有一部分是翻看之前的数据结构课件解决的。还有比较好的方法是使用debug来调试

16、程序,设置断点查看执行到哪一步出错,不过这里我已经知道错误地方,只要找到解决方案即可。2. 课程设计的体会主要是对之前一个数据结构的算法的回顾,之前学习的有许多都忘记了,现在重新回顾一遍记起来的速度其实还比较快,学习其实就死一个遗忘,记忆,遗忘再记忆的过程。现在写这些层序还比较上手,不过C+语言有些用的还是不太上手,比如初始化和函数的析构,这部分比较陌生,主要是使用的次数很少,还是得多实践才能熟悉这些知识点。7、 源码和说明1. 文件清单及其功能说明按照老师的要求,这里也要进行封装,封装成头文件在主程序里直接编写对应的函数功能。#ifndef QUEUE1_H_INCLUDED#define

17、QUEUE1_H_INCLUDEDclass QUEUE int *const elems;/申请内存用于存放队列的元素 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); /将

18、e入队列,并返回队列virtual QUEUE& operator>>(int &e);/出队列到e,并返回队列virtual QUEUE& operator=(const QUEUE &s); /赋s给队列,并返回被赋值的队列virtual void print( ) const;/打印队列virtual QUEUE( );/销毁队列*/;#endif / QUEUE1_H_INCLUDED2. 用户使用说明书先安装一款codeblocks,版本随便,不需要配置,直接打开程序,先点击codeblocks中的build键,然后直接点击run运行即可,

19、然后出现之前所说的文本界面,根据上面所对应的功能选择。3. 源代码#include <iostream>#include <stdlib.h>#include <iostream>#include "queue1.h"#define MAXSIZE 40using namespace std;QUEUE:QUEUE(int m):elems(new int m),max(elems = NULL?0:m) /初始化栈:最多m个元素 head=tail=0;QUEUE:QUEUE(const QUEUE &s):elems(new

20、ints.max),max(s.max) /用队列s拷贝初始化队列 head = s.head; tail = s.tail;QUEUE:operator int ( ) const/返回队列的实际元素个数 return (tail-head+MAXSIZE)%MAXSIZE;QUEUE& QUEUE:operator<<(int e) /将e入队列,并返回队列 int *newbase; if(tail+1)%MAXSIZE=head) cout << "此队列已满!" << endl; newbase = (int *)rea

21、lloc(elems,(max + MAXSIZE)*sizeof(int); if(!newbase) exit(1); *(int*)&elems) = newbase; *(int *)&max) += MAXSIZE; elemstail%MAXSIZE = e; tail=tail+1; return *this;QUEUE& QUEUE:operator>>(int &e) /出队列到e,并返回队列 if(head=tail) cout <<"此队列为空" <<endl; else e=elem

22、shead%MAXSIZE; head=head+1; cout <<"出队列的元素是:"<<e<<endl; return *this;QUEUE& QUEUE:operator=(const QUEUE&s) /赋s给队列,并返回被赋值的队列 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 <

23、 MAXSIZE;i+) elemsi = s.elemsi; return *this;void QUEUE:print( ) const /打印队列 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 << "data"<<""&l

24、t;<j<<"="<<elemsj << endl; QUEUE:QUEUE() delete elems; *(int*)&elems) = 0; tail=head=0;int main() QUEUE q=NULL; QUEUE s=NULL; int command = 1; int e,i; while (command) cout <<"nn"<<endl; cout << "tt*" << endl; cout <&l

25、t; "tt* 1 初始化 *" << endl; cout << "tt* 2 入队列 *" << endl; cout << "tt* 3 出队列 *" << endl; cout << "tt* 4 队列的实际长度 *" << endl; cout << "tt* 5 打印队列 *" << endl; cout << "tt* 6 给队列s赋值 *"

26、<< endl; cout << "tt* 7 摧毁队列 *" << endl; cout << "tt* 0 退出 *" << endl; cout << "tt*" << endl; cout << "请选择(06):>" cin >> command; switch (command) case 1: if(q=NULL|s=NULL) q=QUEUE(MAXSIZE); s=QUEUE(MAXSIZE); cout <<"初始化队列成功!"

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论