1成绩评定表学生姓名班级学号专业计算机科学与技术课程设计题目计算机外部输出设备(如显示器)和的CPU处理数据的速度不同。按先来先服务的方式进行管理,设计缓冲队列,实现外设与CPU的匹配评语组长签字:成绩日期2015年12月15日23课程设计任务书学院信息科学与工程学院专业计算机科学与技术学生姓名班级学号课程设计题目计算机外部输出设备(如显示器)和的CPU处理数据的速度不同。按先来先服务的方式进行管理,设计缓冲队列,实现外设与CPU的匹配。实践教学要求与任务:任务:计算机外部输出设备(如显示器)和的CPU处理数据的速度不同。按先来先服务的方式进行管理,设计缓冲队列,实现外设与CPU的匹配。要求:1)对相应的题目进行算法设计2)编写源代码3)上机调试4)显示调试结果5)写出实验总结工作计划与进度安排:数据结构课程设计时间安排在教学第14周、第15周内完成,按上述题目要求完成查阅资料、程序设计、调试、运行等工作。时间安排如下:1、查阅资料、与初步设计;1-2天2、整体功能设计、代码编码与初步调试。1-3天3、调试和软件功能的测试和验收。1-3天4、答辩与论文撰写。1-2天4指导教师:2015年11月28日专业负责人:2015年11月28日学院教学副院长:2015年11月28日目录一、题目概述(内容及要求)5二、功能分析5三、设计7四、运行与测试.....................................................................................................................11五、总结.................................................................................................................................13参考文献.................................................................................................................................145一、题目概述(内容及要求)1.内容:计算机外部输出设备(如显示器)和的CPU处理数据的速度不同。按先来先服务的方式进行管理,设计缓冲队列,实现外设与CPU的匹配。2.要求:1)对相应的题目进行算法设计2)编写源代码3)上机调试4)显示调试结果二、功能分析1.功能模块图程序主要功能分为三个部分:1,第一个部分为创建队列。创建一个尾插的链表存储数据主函数创建队列删除队列元素查询队列元素图2.1功能模块图62,第二部分为删除队列元素,根据队列特点,应从链表头部删除元素3,第三部分为查询队列元素,经过查询经过一系列处理后,队列中的元素。4,在程序的主体main函数中设计程序菜单,通过用户输入选择实现种种功能2.程序流程图Main函数流程设计图:通过一个while循环来实现菜单的设计,内部用switch语句实现对不同定义变量Case3Case2Case1图2.2程序流程图开始While(1)Switch(n)Creat()Del()Print()显示结果7功能的函数的调用。三、设计根据题目要求,是要设计一个队列程序,队列的特点为先进先出。因此根据该特点我设计了一个尾插头删的链表。数据在内存中链式存储,用一个Creat()函数实现对链表的创建。Creat()函数代码如下:structdata*Creat(structdata*front,structdata*real){structdata*p;real=(structdata*)malloc(sizeof(structdata));p=real;p-num=n+1;printf(当前用户编号:%d\n,p-num);printf(输入证件尾号和用户姓名(中间都好分隔):);scanf(%d,%s,&p-realnum,&p-name);while(p-realnum!=0){n+=1;if(n==1){front=p;}else{real-next=p;}real=p;p=(structdata*)malloc(sizeof(structdata));p-num=n+1;printf(当前用户编号:%d\n,p-num);printf(输入证件尾号和用户姓名(中间都好分隔,输入0退出):\n);scanf(%d,%s,&p-realnum,&p-name);}real-next=NULL;return(front);}8以上函数实现了队列的后进特点,而先出特点则由del()函数实现del()函数代码如下:structdata*del(structdata*front){structdata*p=NULL;if(front!=NULL){p=front-next;front-next=NULL;printf(第%d号用户:%s业务办理完毕\n,front-num,front-name);}elseprintf(当前无人排队办理业务!!!\n);return(p);}最后一部分为查看队列元素函数,代码如下:voidprint(structdata*front){structdata*p;printf(现在排队办理业务的人有:\n);p=front;if(front!=NULL){do{printf(序号:%d,姓名:%s\n,p-num,p-name);p=p-next;}while(p!=NULL);}}设计思路:首先程序采用菜单,用户需要输入与操作相对应的序号选项来运行程序。其次,在输入序号选项后,程序会执行相应的函数。题目要求做一个队列程序,我把它想象作是一个排队程序。(1)有人来挂号排队。这时候就需要创建尾插链表函数。这部分也就相当于计算机键盘录入。(2)有人排队就需要有人处理。所以设计了一个del()函数从链表的头部删除数据。这部分就相当于计算机CPU处理数据。(3)有时候需要查询当前还有多少人排队。所以设计个一个print()函数将队列信息打印出来。这部分相当于计算机显示器部分。以此方式来实现题目要求的队列缓冲程序。完整源代码:#includestdio.h#includestdlib.h#includewindows.h#defineN59structdata*Creat(structdata*front,structdata*real);structdata*del(structdata*front);voidprint(structdata*front);structdata{intnum;intrealnum;charname[N];structdata*next;};intn=0;//定义全局变量,记录队列长度intmain(void){structdata*front=NULL;structdata*real=NULL;while(1){printf(-----------------------------------------\n);printf(--------1·挂号排队--------\n);printf(--------2·业务办理--------\n);printf(--------3·查询当前办理业务的人--------\n);printf(-----------------------------------------\n);intnum;printf(请输入业务序号:);scanf(%d,&num);system(cls);switch(num){case1:front=Creat(front,real);break;case2:front=del(front);break;case3:print(front);break;}}return0;}structdata*Creat(structdata*front,structdata*real){structdata*p;real=(structdata*)malloc(sizeof(structdata));p=real;p-num=n+1;printf(当前用户编号:%d\n,p-num);printf(输入证件尾号和用户姓名(中间都好分隔):);10scanf(%d,%s,&p-realnum,&p-name);while(p-realnum!=0){n+=1;if(n==1){front=p;}else{real-next=p;}real=p;p=(structdata*)malloc(sizeof(structdata));p-num=n+1;printf(当前用户编号:%d\n,p-num);printf(输入证件尾号和用户姓名(中间都好分隔,输入0退出):\n);scanf(%d,%s,&p-realnum,&p-name);}real-next=NULL;return(front);}structdata*del(structdata*front){structdata*p=NULL;if(front!=NULL){p=front-next;front-next=NULL;printf(第%d号用户:%s业务办理完毕\n,front-num,front-name);}elseprintf(当前无人排队办理业务!!!\n);return(p);}voidprint(structdata*front){structdata*p;printf(现在排队办理业务的人有:\n);p=front;if(front!=NULL){do{printf(序号:%d,姓名:%s\n,p-num,p-name);p=p-next;}while(p!=NULL);}11}四、运行与测试1)运行后主菜单界面经运行,程序能正确显示菜单。2)测试能否正确调用功能函数图4.1程序运行图一12图4.2程序运行图二3)测试算法是否能够正确执行图4.3程序运行图三图4.3程序运行图四图4.2程序运行图二13图4.3程序运行图五经测试,算法能够正确执行,程序运行正确。五、总结课程设计过程中出现的技术难点和解决方法:在进行课程设计过程中对题目不能够很好的理解。题目内容略有抽象,无法直接具体实现,这需要我们将题目和显示生活进行联想。才能更好的解决问题。在课程设计中设计创建链表的程序,链表创建要实现尾插。在设计过程中,由于指针较多,出现了混乱的情况,这就需要我们对于变量名字的定义要有含义,必要的地方要有注释。在设计删除元素函数的时候,出现了只能删除第一个元素,之后的元素不能删除显示为没有队列元素可被删除。经排查这种情况出现的原因为创建链表是首元素没有和后边的元素连接上。导致创建了很多节点,但在实际链表中只有一个元素。经过修改creat()函数后,问题解决。在主函数中设置了一个清屏语句。但是由于放置的位置不太合理。导致del()函数和print()函数所显示在屏幕上的内容被清除,无法观察结果。因此调整了清屏语句的位置。课程设计期间的主要收获:通过这次课程设计使我对数据结构有了更深的了解,也明白了数据结构在生活中的实际应用,每一个日常生活中的事情,都可以抽象为一种数据结构。而我们程序设计的目的就是为了解决日常生活中遇到的问题。因此学习数据结构尤为重要。通过这次课设使我对程序设计的理解更深了。对数据结构的理论知识和实现具体的程序的过程有了更多的经验,不再是单一的理论学习。算法很重要,但是也要能把算法做出程序的能力。有时我们对于算法的理解已经很透彻,但是却无法编成具体的程序。或者编出来却有各种各样的bug。因此我们要不断学习数据结构的同时也不要忘记对于实践的的练习。所有的算法都是为了程序设计都是为14了解决现实生活中的问题。所以我们