数据结构课程设计
2015-01-11 23:33
232 查看
《数据结构课程设计》
课程题目 | 移动通信客服管理系统 |
学生姓名 | 李梦嫦 |
所在专业 | 信息管理与信息系统 |
所在班级 | 信管1132班 |
学号 | 201311671214 |
课程编号 | j1620102 |
任课老师 | 易学明 |
实习时间 | 2014年12月~2015年1月 |
设计成绩 | |
老师评语 | |
一. 实训目的
通过课程设计,学会运用数据结构知识,针对具体应用,自己设计合理数据结构,确定存储结构,并能设计具体操作算法,选择使用具体语言进行实现。掌握C++较复杂程序的组织和设计过程,调试技巧。学习解决实际问题的能力。
二. 实训环境
计算机windows xp或其它版本,VC6.0或更高版本,或其它语言环境。
三. 总体要求和说明
使用数据结构相关知识来做。语言工具不受限。
1、独立完成,设计算法并编写代码,调试通过。
2、写设计说明书。
内容:题目、功能、要求、分析、代码,收获和体会及不足等。
3、以个人独立完成。每一个选择一个题目。选题方式是:自己学号整除5所得的余数是几就做几号题。如学号为12做2号题,学号为5的做0号题。
4、时间:从第13周开始收集资料,进行准备。具体设计时间在16-17周(等实验室安排)。在设计周周五检查(在机房子单独接受老师检查并提问),次周周五前提交设计说明书(实习报告)。
5、实习单独计算成绩,学分1分,成绩好坏和考试没关系。
四. 问题描述
赵斌是一个信管专业的学生,大学四年顺利毕业了。在毕业季,他也像其他学子一样,投身于求职大军,投出一份又一份求职简历,在苦苦地等待之后,他接到了中国移动通信公司广东分司的面试通知书,通知他于本月1号10点到公司面试。当天,晴空万里,艳阳高照,他身着西装,高兴地早早来到公司楼下等待。10点钟整,他和其他新人一起,坐到公司的面试现场。他领取的一一份程序设计题: 假如你是我公司一名客服技术人员,现请你选择自己熟悉的语言,来设计一个程序,管理客户向公司打进来的咨询电话。请事行分析析使用方法和工具,说明自己的思路方法,写一份完整的程序,并实例测试。
五. 问题分析
随着移动通信市场竞争的日趋激烈,移动通信企业越来越意识到客户服务质量是企业最重要的核心竞争力,必须以客户为中心,获取较高的客户满意度和忠诚度,才能在竞争中立于不败之地。所以做好移动通信客服管理系统是具备非常大的市场需求。
10086是移动客服常用的客户服务热线,下面可以模仿10086的管理系统。
10086客户服务热线通过人工、自动语音、短信、传真、E-mail等方式为您24小时不间断提供有关移动通信的业务咨询、业务受理和投诉建议等专业服务。
无论您对移动业务是否熟悉,在这里,对于您的问题,我们都将专注聆听,向您提供全方位的信息。您不但可以增进对各项移动业务的了解,还可以享受常用信息带来的便利;您不但可以通晓现行资费及优惠情况,还可以及时掌握业务动态与最新消息。
六. 逻辑结构和存储结构设计
1、 队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表,移动通信公司的客服管理系统符合队列的性质。
2、队列的基本逻辑运算
(1)InitQueue(Q)
置空队。构造一个空队列Q。
(2)QueueEmpty(Q)
判队空。若队列Q为空,则返回真值,否则返回假值。
(3) QueueFull(Q)
判队满。若队列Q为满,则返回真值,否则返回假值。
(4) EnQueue(Q,x)
若队列Q非满,则将元素x插入Q的队尾。此操作简称入队。
(5) DeQueue(Q)
若队列Q非空,则删去Q的队头元素,并返回该元素。此操作简称出队。
(6) QueueFront(Q)
若队列Q非空,则返回队头元素,但不改变队列Q的状态
3、
一. 算法设计
(1)构造函数算法
template<classDataType>
LinkQueue<DataType>::LinkQueue()
{
Node<DataType>*s = NULL;
s = new Node<DataType>;
s->next = NULL; //创建一个头结点s
front = rear = s; //将队头指针和队尾指针都指向头结点s
}
(2) 入队
template<class DataType>
voidLinkQueue<DataType>::EnQueue(DataType x)
{
Node<DataType>*s;
s = new Node<DataType>;
s->Data = x; //申请一个数据域为x的结点s
s->next = NULL;
rear->next = s; rear = s; //将结点s插入到队尾
}
(3) 出队
template<class DataType>
DataTypeLinkQueue<DataType>::DeQueue()
{
Node<DataType>*p = NULL;
int x;
if (rear == front)throw"下溢";
p = front->next; x = p->Data; //暂存队头元素<
e34f
/strong>
[b]front->next = p->next; //将队头元素所在结点摘链
if (p->next == NULL)rear = front; //判断出队前队列长度是否为1
delete p;
return x;
}
(4) 取队头元素
DataType QueueFront(LinkQueue *Q)
{
if(QueueEmpty(Q))
Error("Queue if empty.");
return Q->front->data;
}
二. 时间复杂度和空间复杂度分析
时间复杂度为N,空间复杂度不清楚怎么计算
三. 心得
学习了数据结构那么久,还是不会分析算法的时间复杂度和空间复杂度,对于一个算法来说,这两样东西是非常重要的分析,希望以后有机会能够学好。
在编译程序的时候,在主函数那里卡了很久,因为不能够很清晰地知道程序函数的调用,其实也是当时学习队列的吃力,没有彻底弄清楚所致。栈和队列是一起学习的,有时候就会把栈和队列的性质,以及算法弄乱。
感觉时间不够用,这个学期学习了数据结构和数据库,两大科目都是我的硬伤,想要学好,却总是感觉力不从心。数据库的先修课时C++以及数据结构,但是我们的数据结构和数据库一起学习,精力的消耗就大大增加了。
我是上到大学才开始接触编程的,说不上很喜欢,因为是必修课,所以才学的,但是真的没有很用心。最重要的还是兴趣方面,没有很好地培养自己对数据结构的热爱,只有当一个人热爱去干一件时,那肯定是事半功倍的,热情是最好的老师。长了这么大了,也不能老是任性了,不是说你想不学就不学了的,还有两年就要踏进社会的舞台了,在社会里面就更加残酷了。做自己的主人,要学会去热爱你需要热爱的东西,既然你不能远离它那么久热爱它,在它的身上找到乐趣。
在做课程设计的时候,还得感谢我的伙伴,给予我技术指导,也加深对了数据结构的了解。在这枯燥的冬天,找到了高中大家一起奋斗的感觉,一起讨论问题的回忆。谢谢伙伴不厌其烦的指导,当时她也还没有编写完,就先帮我解决我的问题。
当客户的号码是长号的时候就显示不了,选择业务5的时候,在前面也出现了一个不该出现的数字,这两个难题,我还没能解决,希望以后更加深入了解的时候能够解决。
四. 程序运行结果
为了更加准确验证我的程序设计,多次运行,并且操作了多次,这个中国移动通信公司广东分公司客服系统符合队列的性质,具有先进先出的特征。在程序运行的时候,可以看到客户是先入队的就先进行处理,按照队列的顺序减少。
第一次:
第二次:
第三次:
第四次:
最后一次
一. 源代码
#include<iostream> #include<iomanip> using namespace std; template<class DataType> struct Node { DataType Data; Node<DataType>*next; }; template<class DataType> class LinkQueue { public: LinkQueue(); //构造函数,初始化一个空的链队列 ~LinkQueue(); //析构函数,释放链队列中各节点的存储空间 void EnQueue(DataType X); //入队操作,将客户x入队 DataType DeQueue(); //出队操作,将队头元素出队 DataType Getqueue(); //取链队列的队头元素 int GetQueueLength(); //链队长度 int Empty(); //判断链队列是否为空 void GetQueueNode(); //输出队列元素 private: Node<DataType>*front, *rear; //队头和队尾指针,分别指向头指针和终端结点 }; template<class DataType> LinkQueue<DataType>::LinkQueue() { Node<DataType>*s = NULL; s = new Node<DataType>; s->next = NULL; //创建一个头结点s front = rear = s; //将队头指针和队尾指针都指向头结点s } template<class DataType> LinkQueue<DataType>::~LinkQueue() { Node<DataType>*p = NULL; while (front != NULL) { p = front->next; delete front; front = p; } } template<class DataType> void LinkQueue<DataType>::EnQueue(DataType x) { Node<DataType>*s; s = new Node<DataType>; s->Data = x; //申请一个数据域为x的结点s s->next = NULL; rear->next = s; rear = s; //将结点s插入到队尾 } template<class DataType> DataType LinkQueue<DataType>::DeQueue() { Node<DataType>*p = NULL; int x; if (rear == front)throw"下溢"; p = front->next; x = p->Data; //暂存队头元素 front->next = p->next; //将队头元素所在结点摘链 if (p->next == NULL)rear = front; //判断出队前队列长度是否为1 delete p; return x; } template<class DataType> DataType LinkQueue<DataType>::Getqueue() { if (front != rear) return front->next->Data; } template<class DataType> int LinkQueue<DataType>::GetQueueLength() //链队列的长度 { int length = 0; Node<DataType>*s = front; while (s != NULL) { length++; s = s->next; } return length; } template<class DataType> int LinkQueue<DataType>::Empty() { if (front == rear) return 1; else return 0; } template<class DataType> void LinkQueue<DataType>::GetQueueNode() { Node<DataType>*s = front; while (s != NULL) { cout << s->Data << " "; s = s->next; } cout << endl; } LinkQueue<int>Q; void output() { int a = Q.DeQueue(); cout << a << "已经办理业务" << endl; if (Q.Empty()) { cout << "当前处理号码" << setw(15) << "待办个数" << setw(10) << endl; cout << "空" << setw(13) << "等待中……" << setw(10) << endl; } else { cout << "当前处理号码" << setw(15) << "待办个数" << setw(10) << endl; Q.GetQueueNode(); cout << Q.GetQueueLength()-1 << endl; } } void main() { if (Q.Empty()) cout << "……待办客户为空…………………" << endl; else cout << "待办客户非空" << endl; cout << "……客户正执行入队操作…………" << endl; try { Q.EnQueue(678787); Q.EnQueue(666666); Q.EnQueue(689804); Q.EnQueue(888888); Q.EnQueue(567889); Q.EnQueue(657890); Q.EnQueue(634567); } catch (char * wrong) { cout << wrong << endl;; } cout << "查看第一个客户号码:" << endl; cout << Q.Getqueue() << endl; //读队头元素 cout << "执行出队操作" << endl; try { Q.DeQueue(); } catch (char *wrong) { cout << "查看第一个客户号码:" << endl; cout << Q.Getqueue() << endl; } int choice; do { cout << setw(40) << "***********************欢迎使用*********************" << endl; cout << setw(40) << "*********中国移动通信公司广东分公司客服系统 ********" << endl; cout << setw(40) << "* *" << endl; cout << setw(40) << "* 1、此时客户状态 *" << endl; cout << setw(40) << "* 2、查询等待数量 *" << endl; cout << setw(40) << "* 3、已办客户业务 *" << endl; cout << setw(40) << "* 4、正在办理业务 *" << endl; cout << setw(40) << "* 5、查看等待客户 *" << endl; cout << setw(40) << "* 6、退出系统 *" << endl; cout << setw(40) << "* *" << endl; cout << setw(40) << "****************************************************" << endl; cout << setw(8) << "请输入业务选项(1—5):"; cin >> choice; switch (choice) { case 1: cout << endl; if (Q.Empty()) { cout << "没有客户正在办理业务!" << endl; } else { cout << "还有待办客户!" << endl; break; } case 2: cout << endl; cout << "还有" << Q.GetQueueLength()-1 << "个客户在等待!" << endl; break; case 3: cout << endl; cout<<Q.DeQueue()<<"已办理业务"<<endl; break; case 4: cout << endl; cout << "正在办理业务的客户号码:" << Q.Getqueue() << endl; break; case 5: Q.GetQueueNode(); break; case 6: cout << endl; cout << "感谢您的使用,祝您生活愉快!" << endl; break; default: cout << endl; cout << "输入有误,请重新输入:" << endl; break; } } while (choice != 6); }
一. 参考文献:
1、数据结构(C++版)(第二版)清华大学出版社
2、数据结构(C++版)学习辅导与实验指导清华大学出版社
相关文章推荐
- 四则运算实现(c 语言 数据结构课程设计题)
- 浅说代码风格 - 数据结构课程设计
- 数据结构课程设计---最长公共子串
- 数据结构课程设计---学生信息管理系统
- 数据结构课程设计(C++语言)
- 数组应用[数据结构课程设计]
- 数据结构课程设计---最长公共子串
- 重言式判别 (数据结构课程设计)
- 数据结构课程设计:括号匹配问题(实现检验匹配并输出不匹配的位置)
- 数据结构课程设计
- 数据结构课程设计题目
- 数据结构课程设计-校园导游系统-带注释
- 数据结构课程设计---学生信息管理系统
- 校园导航-_数据结构课程设计
- 数据结构课程设计(2)
- 数据结构课程设计-----用C#实现双向链表
- 数据结构课程设计--航空客运订票系统
- 数据结构课程设计---教学任务安排系统
- 个人帐簿管理系统设计[数据结构课程设计]
- 数据结构课程设计----基数排序