信管1132陈玉君数据结构课程设计课题四

来源:互联网 发布:linux 配置文件生效 编辑:程序博客网 时间:2024/04/29 01:13

一、问题描述

赵斌是一个信管专业的学生,大学四年顺利毕业了。在毕业季,他也像其他学子一样,投身于求职大军,投出一份又一份求职简历,在苦苦地等待之后,他接到了中国移动通信公司广东分司的面试通知书,通知他于本月110点到公司面试。当天,晴空万里,艳阳高照,他身着西装,高兴地早早来到公司楼下等待。10点钟整,他和其他新人一起,坐到公司的面试现场。他领取的一一份程序设计题:假如你是我公司一名客服技术人员,现请你选择自己熟悉的语言,来设计一个程序,管理客户向公司打进来的咨询电话

二、问题分析

设计一个程序管理客户向公司打来咨询电话,即是设计一个客户来电管理系统,利用栈的知识,打来一个电话相当于入栈,电话挂断相当于出栈,已有足够多的客户打入电话即为栈满,如果新的客户要打入电话就要等通话中的客户挂断电话,即是栈满之后要等出栈才能有新的元素入栈。

三、逻辑结构和存储结构设计

逻辑结构:

 

 

E-R图可以看出,客户来电系统中客户来电和总台的关系是一一对应的关系,而且客户的类型是相同的,前一客户通话结束后后一客户方可接通电话,相当于出栈入栈,故此逻辑结构选用队列。

存储结构:

初始时顺序栈必须确定一个固定的长度,所以有存储元素个数的限制和空间浪费的问题,而链栈没有栈满的问题,只有当内存没有可用空间时才会出栈满,当栈的使用过程中元素个数变化较大时,用链栈是适宜的,反之,应该采用顺序栈,而在此系统中,因为打电话的客户数量庞大,而且不可估计,故选用链式存储结构。

四、算法设计

算法设计的界面如下:

建立一个cyj工程

建立头文件,定义一个队列类:

 

入队函数:

出队函数:

 

判断是否为空:

主函数:

 

 

算法流程图如下:

 

 

五、时间复杂度和空间复杂度分析

算法的时间复杂度记做:T(n)=O(f(n))

  随着模块n的增大,算法执行的时间的增长率和 f(n)的增长率成正比,所以 f(n)越小,算法的时间复杂度越低,算法的效率越高。在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出 T(n)的同数量级。

  而在此程序中,采用的是链队,无论是出栈还是入栈时间复杂度都是O1),

故时间复杂度为O1)。

算法的空间复杂度:一个程序的空间复杂度是指运行完一个程序所需内存的大小。利用程序的空间复杂度,可以对程序的运行所需要的内存多少有个预先估计。一个程序执行时除了需要存储空间和存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为现实计算所需信息的辅助空间。程序执行时所需存储空间包括以下两部分。

1)固定部分。这部分空间的大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间。

2)可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法有关。

一个算法所需的存储空间用f(n)表示,S(n)=O(f(n))

其中n为问题的规模,S(n)表示空间复杂度。

  出队入队的空间复杂度都为O(n),所以该算法的空间复杂度为On)。

 

 

六、源代码

#ifndef chen_H#define chen_Hstatic int count;template<class DT>struct node{DT data;node<DT>*next;};template<class DT>class chen{private:node<DT>*front,*rear;//队头和队尾指针public:chen();//构造函数,初始化一个空的链表~chen();//析构函数,释放链队列中各结点的存储空间void input(DT x);//入队函数,电话打入DT Dechen();//将队头元素出队,接通下一个电话DT Getchen();//取链队列的队头元素int empty();//判断队列是否为空int getcount(){return count-1;}};#endif;


 

#include "chen.h"template<class DT>chen<DT>::chen(){node<DT>*s=NULL;s=new node<DT>;s->next=NULL;front=rear=s;}template<class DT>chen<DT>::~chen(){node<DT>*p=NULL;while(front!=NULL){p=front->next;delete front;front=p;}}template<class DT>void chen<DT>::input(DT x){int n;    cout<<"请输入等待接入通话的客户数:";    cin>>n;for(int i=1;i<=n;i++){ count++;cout<<"请输入等待接入通话客户号码:"<<endl;cin>>x;node<T> *s=NULL;    s=new node<T>;s->data=x;//申请一个数据域为X的结点ss->next=NULL;rear->next=s;rear=s;//将结点S插入到队尾}}template<class DT>DT chen<DT>::Dechen(){char ch;     node<T> *p=NULL;cout<<"是否结束通话(是:Y,否:N):";cin>>ch;  if(ch=='Y')count--;{int x;if(rear==front)throw"输入无效";p=front->next;x=p->data; //暂存队头元素,等待客户front->next=p->next;//将队头元素所在的结点摘链if(p->next==NULL) rear=front;//判断出队前队列长度是否为1delete p;return x;}else {cout<<"请稍后再拨"<<endl;return 0;}}template<class DT>DT chen<DT>::Getchen(){if(front!=rear)return front->next->data;}template<class DT>int chen<DT>::empty(){if(front==rear)return 1;else return 0;}


 

#include<iostream>#include<iomanip>#include<string>using namespace std;#include"chen.cpp"chen<int> a;char b;void output(){cout<<endl;if(a.empty()){cout<<setw(4)<<"当前位置"<<setw(24)<<"客户打入电话个数"<<setw(24)<<"正在通话客户号码"<<setw(24)<<"提示通话情况"<<endl;cout<<setw(4)<<"一号服务口"<<setw(15)<<a.getcount()<<setw(30)<<"无正在通话客户"<<setw(28)<<"欢迎拨打电话"<<endl;}else{cout<<setw(4)<<"所在位置"<<setw(24)<<"客户打入电话个数"<<setw(24)<<"正在通话客户号码"<<setw(24)<<"通话情况"<<endl;cout<<setw(4)<<"一号服务口"<<setw(15)<<a.getcount()<<setw(30)<<a.Getchen()<<setw(28)<<"请稍后再拨"<<endl;cout<<endl;}}void main(){int choice;do{cout<<setw(60)<<"++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;cout<<setw(60)<<"+~~~~~~~~~~~~~~~~~~客户来电管理系统~~~~~~~~~~~~~~~~~"<<endl;cout<<setw(60)<<"+                                                  +"<<endl;        cout<<setw(60)<<"+                                                  +"<<endl;cout<<setw(60)<<"+                 1--查看通话信息                   +"<<endl;cout<<setw(60)<<"+                 2--客户等待数量                   +"<<endl;cout<<setw(60)<<"+                 3--客户通话结束                   +"<<endl;cout<<setw(60)<<"+                 4--客户正在通话                   +"<<endl;cout<<setw(60)<<"+                 5--客户通话情况                   +"<<endl;cout<<setw(60)<<"+                 0--退出查询系统                   +"<<endl;cout<<setw(60)<<"+                                                  +"<<endl;        cout<<setw(60)<<"+                                                  +"<<endl;        cout<<setw(60)<<"+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+"<<endl;cout<<setw(60)<<"++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;cout<<setw(8)<<"请输入选项(0-5):";cin>>choice;switch(choice){case 1:output();    break;case 2:cout<<endl;cout<<"还有"<<a.getcount()+1<<"个客户等待接入通话"<<endl;break;case 3:cout<<endl;output();a.Dechen();break;case 4:cout<<endl;cout<<"当前通话中客户号码:"<<a.Getchen()<<endl;break;    case 5:cout<<endl;if(a.empty()){cout<<"无通话中客户"<<endl; a.input(b);}else{cout<<"请稍后再拨"<<endl;a.input(b);break;}case 0:cout<<endl;cout<<"退出系统"<<endl;break;default:cout<<endl;cout<<"输入有误:"<<endl;break;}}while(choice!=5);}


 

七、程序运行结果

客户通话情况:

查询通话信息:

客户等待数量:

通话结束:

正在通话:

退出系统:

 

 

八、心得

 

通过这一次的课程设计,我复习了以前所学的知识,也接触了一些不曾学过的知识,加深了我对数据结构这门课程所学内容的理解与掌握;锻炼了自己的能力,也在过程中看出自己在平时的学习过程中有哪些不足之处。同时,通过对客户来电管理系统的开发,使得我将计算机课程所学知识与实际问题很好地相联接在一起。尽管只是一个简单的小程序,却是我了解数据结构的神奇与奥妙中重要的一个途径。

  在设计中有程序功能成功实现时的欣喜,也有遇到问题、解决问题时的执着以及迷茫。

  在刚拿到课程设计的题目时,只有一句:设计一个程序,管理客户向公司打进来的咨询电话的有效条件,其余什么条件都没有给出,当时就蒙了,脑子没有反应出一些想法,经过与老师沟通后,老师慢慢地把我引导到队列的方向,才慢慢有了思路,由此可以看出平时的基本功还是不够扎实,不能够很好地融会贯通,还需要好好地努力。

  经过这次课程设计,使得我很好地了解了在开发程序过程中耐心和扎实的基础的重要性。经过这次课程设计,通过对程序的编制,调试和运行,使我更好的掌握了栈与队列的使用,熟悉了出栈入栈以及各种链表的使用,在调试和运行过程中使我更加的了解和熟悉程序运行的环境,提高了我对程序调试分析的能力和对错误的纠正能力。

  这次课程设计,对于我来说是一个挑战,使我能够综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力,此次课程设计是对我实际工作能力的具体训练和考察过程。在做了课程实验以后,我对数据结构的了解更深了,很多知识得到了巩固,一些不懂的知识也渐渐明了!

  在完完整整的做完一个课程实验后,我对程序的整体性有了一个明确的认识,做一个程序必须要注意程序前后的联系,要具有清晰的思路,程序要具有层次。同时,在写程序的过程中,通过网络、书本等查找资料,认识到数据结构的多样性和广泛性,认识到自己所学的知识很有限,还只是皮毛,要想设计出一个属于自己的好程序还需要花很大的心血和努力,也要有足够的耐心和信心,相信自己能够战胜困难!

  学习计算机语言,最重要的就是上机操作,敢以把自己的想法大胆地写出来,我自知自己的动手能力有待提高,在日后的学习过程中要注意多多地练习,多多地询问,多多地琢磨。

 

 

 

 

 

0 0