数据结构课程设计16141_第1页
数据结构课程设计16141_第2页
数据结构课程设计16141_第3页
数据结构课程设计16141_第4页
数据结构课程设计16141_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

1、-作者xxxx-日期xxxx数据结构课程设计16141【精品文档】淮 海 工 学 院 计算机工程学院课程设计报告设计名称: 数据结构课程设计 选题名称: 姓 名: 学 号: 专业班级: 计算机科学与技术 系 (院): 计算机工程学院 设计时间:.4 设计地点: 计算机实验室、教室 成绩:指导教师评语: 签名: 年 月 日【精品文档】1课程设计目的1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。 2、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4、训练用

2、系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。2课程设计任务与要求:任务根据教材数据结构-C语言描述(耿国华主编)和参考书数据结构题集(C语言版)(严蔚敏、吴伟民主编)选择课程设计题目,要求通过设计,在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解和综合运用。设计题目从任务书所列选题表中选取,每班每题不得超过2人。学生自选课题。学生原则上可以结合个人爱好自选课题,要求课题有一定的深度与难度,有一定的算法复杂性,能够巩固数据结构课程所学的知识。学生自选课题需

3、在18周前报课程设计指导教师批准方可生效。要求:1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。前期准备工作完备与否直接影响到后序上机调试工作的效率。在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。 2、设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。3、程序设计语言推荐使用C/C+,程序书写规范,源程序需加必要的注释;4、每位同学需提交可独立运行的程序;5、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少

4、于10页(代码不算);6、课程设计实践作为培养学生动手能力的一种手段,单独考核。 3课程设计说明书一 需求分析停车场管理系统(1)根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时计费。(2)当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放,实现停车场的调度功能。(3)用要求以顺序栈模拟停车场,以链队列模拟便道。(4) 从终端读入汽车到达或离去的数据,每组数据包括三项:是“到达”还是“离去”;汽车牌照号码;“到达”或“离去”的时刻。(5)每组输入信息相应的输出信息为:如果是到达的车辆,则输出其在停车场中或便道上的位置;如果是离去的车辆,则输出其在停车场中停留的时间和应交的费用。二

5、概要设计停车场管理系统1、系统用到的抽象数据类型定义:typedef struct node char num10; /车牌号码 Time reach; /到站时间 Time leave; /离开时间CarNode;typedef struct timeint hour;int min;Time;typedef struct NODECarNode *stackMAX+1; /栈用顺序表示 int top;SeqStackCar;typedef struct carCarNode *data; / 便道上的车用链表表示 struct car *next;QueueNode;typedef st

6、ruct NodeQueueNode *head; / 设置头指针、尾指针。 QueueNode *rear;LinkQueueCar;2、 系统中的子程序和功能说明:(1)void InitStack(SeqStackCar *); /车辆节点进栈 当栈未满时,就把到达的车辆进栈。(2)int InitQueue(LinkQueueCar *); /车辆节点进队列 当栈满了时,车辆就进入便道上的队列中(3)int Arrival(SeqStackCar *,LinkQueueCar *); /车辆到达登记车辆到达时,先登记车辆车牌号码。然后再判断停车场有没有停满,没停满就进栈,停满了就停在便

7、道上,即进队列。(4) void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *); /车辆离开处理 通过输入离开车辆的位置处理,然后调用PRINT(CarNode *p,int room);函数进行收费。然后再判断便道上有没有车,如果有,就把便道上的车进停车场内。(5)void List(SeqStackCar,LinkQueueCar); /显示车场内和便道上的车辆情况 用个switch();函数选择显示车场内或是便道上的车辆情况。包括对下面两个子函数的调用: void List1(SeqStackCar *S); void List2(L

8、inkQueueCar *W); /分别为显示车场和便道上的车辆情况(6)void PRINT(CarNode *p,int room); / 车辆离开是的收费 这个函数由车辆离开的函数调用,以分钟计时算费,但只能计算当天之内的费用,如果第二天的话会导致计费为负或减少。即只能当天停,当天开走。3、 系统程序功能结构图停车场管理系统车辆到达车辆离开列表显示到达时间车牌号码离开时间收费情况车场信息便道信息三 详细设计停车场管理系统 算法的设计思想及流程图主要模块算法描述: 本程序最主要的算法就是车辆到达登记的和车辆离开的。车辆到达:int Arrival(SeqStackCar *Enter,Li

9、nkQueueCar *W)首先定义一个栈和队列的结构体指针为:*p , *t , 然后申请一个车辆信息的内存空间,并把它赋给栈指针.车辆到达时就输入车牌号,并通过if(Enter-toptop0) 确保栈不空,然后用个while(1) 确保输入的车辆离开位置的合法性。如果不和法,显示输入有误,要重新输入。通过while(Enter-toproom) 判断离开车辆的位置,如果是中间位置,就要再用一个栈前面临时开出来的车,等要开出的车开出后,再把临时栈的车看进 车场内,并要调用PRINT(p,room); 这个函数计算显示费用.然后还要用 if(W-head!=W-rear)&Enter-top

10、num);if(Enter-toptop+; printf(n车辆在车场第%d位置.,Enter-top); printf(n车辆到达时间:); scanf(%d:%d,&(p-reach.hour),&(p-reach.min); Enter-stackEnter-top=p; return(1);else printf(n该车须在便道等待!有车位时进入车场); t=(QueueNode *)malloc(sizeof(QueueNode); t-data=p; t-next=NULL; W-rear-next=t; W-rear=t; return(1);源代码:void Leave(Se

11、qStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W)/车辆的离开 int room; CarNode *p,*t; QueueNode *q;if(Enter-top0) / 判断车场是否为空 while(1) printf(n请输入车在车场的位置/1-%d/:,Enter-top); scanf(%d,&room); if(room=1&roomtop) break; else printf(n 输入有误,请重输: );while(Enter-toproom) / 把要删除的车辆的前面的车开出来,进临时栈。Temp-top+; Temp-st

12、ackTemp-top=Enter-stackEnter-top; Enter-stackEnter-top=NULL; Enter-top-; p=Enter-stackEnter-top; / 把要删除的车辆节点赋给p。 Enter-stackEnter-top=NULL; Enter-top-;while(Temp-top=1) / 再把临时栈里德车辆进停车场Enter-top+; Enter-stackEnter-top=Temp-stackTemp-top; Temp-stackTemp-top=NULL; Temp-top-;PRINT(p,room); / 调用计费函数计费。 i

13、f(W-head!=W-rear)&Enter-tophead-next; t=q-data; Enter-top+; printf(n便道的%s号车进入车场第%d位置.,t-num,Enter-top); printf(n请输入%s号车进入车场的时间:,t-num); scanf(%d:%d,&(t-reach.hour),&(t-reach.min); W-head-next=q-next;if(q=W-rear) W-rear=W-head;Enter-stackEnter-top=t; free(q);else printf(n便道里没有车.n);else printf(n车场里没有车

14、.); 显示车场里的车辆情况源程序:void List1(SeqStackCar *S) /显示车场里的车辆情况 int i; if(S-top0)printf(n车场:); printf(n 位置 到达时间 车牌号n); for(i=1;itop;i+)printf( %d ,i); printf( %d:%d ,S-stacki-reach.hour,S-stacki-reach.min); puts(S-stacki-num);else printf(n车场里没有车);显示便道上的车辆情况源代码:void List2(LinkQueueCar *W) /显示便道上的车辆情况 QueueN

15、ode *p; int i; p=W-head-next; if(W-head!=W-rear)printf(n等待车辆的号码为:); for(i=1; (p!=NULL); i+)printf(n第 %d 车辆.,i);puts(p-data-num); p=p-next ;else printf(n便道里没有车.);printf(n);开始初始化两个栈Enter和Temp及一个队列Wait。进入主菜单车到达车离开退出Room前车辆进临时栈对room计费便道车信息车场内信息判便道是否有车车场是否为空列表显示栈Enter元素出栈队列中元素进栈队列Wait中元素出队元素进栈Enter便道车进车场

16、元素进队列Wait判断栈是否为满结束退出列表显示是否否是否是图1.3:停车场管理系统主流程图.四 程序设计与调试分析停车场管理系统测试数据: 每个测试的数据都是以字符串的形式存储的,输入数据是严格按照提示的信息执行。调试遇到的问题与解决方法:在调试的过程中,输出员工信息的时候格式老是错位,调试了很多次才得以调整;在从文件中读出数据时老是显示不出数据,最后才发现原来是忘了写输出语句,但是在添加上去之后,能输出信息却有很多的乱码,仔细检查了一遍又一遍后终于发现了,原来是自己定义的指针在循环的过程中次序混乱了。在调试的过程中我还发现我的提示语句不多,导致让别人不知道下一步要做些什么,所以就适当的添加

17、了一些提示的信息。五 用户手册停车场管理系统【 使用说明 】(1)进入程序的界面,出现命令的帮助信息(停车场的最大容量为三辆车,多了则进入便道中等待其他车离开车场)。 (2)输入1:车辆到达登记;输入2:车辆离开登记;输入3:车辆列表显示;输入4:退出系统(首先得进行车辆登记,否则停车场里没有车)(3)车辆登记时,到达的时间与离开的时间一定要严格按照时间的模式,如:8:00(4)显示车辆列表时,有相应的信息提示,看自己的意愿执行程序。 (5)在觉得操作完毕时输入4:退出系统。 【 程序中的头文件 】#include#include#include#define MAX 3 / 停车场最大容量为

18、3辆,便于观察六 测试成果停车场管理系统七 附录(源程序清单)停车场管理系统#include#include#include#define MAX 3 / 停车场最大容量为3辆,便于观察typedef struct time / 定义时间结构体 int hour;int min;Time;typedef struct node / 定义车辆信息结构体 char num10; /车牌号码 Time reach; /到站时间 Time leave; /离开时间CarNode;typedef struct NODECarNode *stackMAX+1; int top;SeqStackCar;ty

19、pedef struct carCarNode *data; struct car *next;QueueNode;typedef struct NodeQueueNode *head; QueueNode *rear;LinkQueueCar;void InitStack(SeqStackCar *); int InitQueue(LinkQueueCar *);int Arrival(SeqStackCar *,LinkQueueCar *); void Leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *);void List(SeqStack

20、Car,LinkQueueCar); void main()SeqStackCar Enter,Temp; LinkQueueCar Wait; int ch; InitStack(&Enter); InitStack(&Temp); InitQueue(&Wait); while(1) printf(n 欢迎使用停车场系统(停车场最大容量为3辆)t); printf(nt 1. 车辆到达登记.tn); printf(nt 2. 车辆离开登记.tn); printf(nt 3. 车辆列表显示.tn); printf(nt 4. 退 出 系 统 .tn);while(1)printf( 请选择:

21、 ); scanf(%d,&ch); if(ch=1&chtop=0; for(i=0;istacks-top=NULL;int InitQueue(LinkQueueCar *Q) / 队列的初始化 Q-head=(QueueNode *)malloc(sizeof(QueueNode);if(Q-head!=NULL)Q-head-next=NULL; Q-rear=Q-head; return(1); else return(-1);void PRINT(CarNode *p,int room)/ 车辆收费 int A1,A2,B1,B2;printf(n车辆离开的时间:); scanf

22、(%d:%d,&(p-leave.hour),&(p-leave.min); printf(n离开车辆的车牌号为:); puts(p-num); printf(n其到达时间为: %d:%d,p-reach.hour,p-reach.min); printf(n离开时间为: %d:%d,p-leave.hour,p-leave.min); A1=p-reach.hour; A2=p-reach.min; B1=p-leave.hour; B2=p-leave.min; printf(n应交费用为: %2.1f元,(B1-A1)*60+(B2-A2)*price); free(p); int Ar

23、rival(SeqStackCar *Enter,LinkQueueCar *W)/ 车辆的到达登记 CarNode *p; QueueNode *t; p=(CarNode *)malloc(sizeof(CarNode); flushall(); printf(n请输入车牌号(例:B1234):); gets(p-num);if(Enter-toptop+; printf(n车辆在车场第%d位置.,Enter-top); printf(n车辆到达时间:); scanf(%d:%d,&(p-reach.hour),&(p-reach.min); Enter-stackEnter-top=p;

24、 return(1);else printf(n该车须在便道等待!有车位时进入车场); t=(QueueNode *)malloc(sizeof(QueueNode); t-data=p; t-next=NULL; W-rear-next=t; W-rear=t; return(1);void Leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W)/车辆的离开 int room; CarNode *p,*t; QueueNode *q;if(Enter-top0) / 判断车场是否为空 while(1) printf(n请输入车在

25、车场的位置/1-%d/:,Enter-top); scanf(%d,&room); if(room=1&roomtop) break; else printf(n 输入有误,请重输: );while(Enter-toproom) / 把要删除的车辆的前面的车开出来,进临时栈。Temp-top+; Temp-stackTemp-top=Enter-stackEnter-top; Enter-stackEnter-top=NULL; Enter-top-; p=Enter-stackEnter-top; / 把要删除的车辆节点赋给p。 Enter-stackEnter-top=NULL; Ente

26、r-top-;while(Temp-top=1) / 再把临时栈里德车辆进停车场Enter-top+; Enter-stackEnter-top=Temp-stackTemp-top; Temp-stackTemp-top=NULL; Temp-top-;PRINT(p,room); / 调用计费函数计费。 if(W-head!=W-rear)&Enter-tophead-next; t=q-data; Enter-top+; printf(n便道的%s号车进入车场第%d位置.,t-num,Enter-top); printf(n请输入%s号车进入车场的时间:,t-num); scanf(%d

27、:%d,&(t-reach.hour),&(t-reach.min); W-head-next=q-next;if(q=W-rear) W-rear=W-head;Enter-stackEnter-top=t; free(q);else printf(n便道里没有车.n);else printf(n车场里没有车.); void List1(SeqStackCar *S) /显示车场里的车辆情况 int i; if(S-top0)printf(n车场:); printf(n 位置 到达时间 车牌号n); for(i=1;itop;i+)printf( %d ,i); printf( %d:%d

28、,S-stacki-reach.hour,S-stacki-reach.min); puts(S-stacki-num);else printf(n车场里没有车);void List2(LinkQueueCar *W) /显示便道上的车辆情况 QueueNode *p; int i; p=W-head-next; if(W-head!=W-rear)printf(n等待车辆的号码为:); for(i=1; (p!=NULL); i+)printf(n第 %d 车辆.,i);puts(p-data-num); p=p-next ;else printf(n便道里没有车.);printf(n);v

29、oid List(SeqStackCar S,LinkQueueCar W) /显示,遍历int flag,tag; flag=1;while(flag)printf( 查看车辆列表显示: ); printf(n 1.车场列表n 2.便道列表n 3.返回主菜单n); printf(n请选择 13:);while(1) scanf(%d,&tag); if(tag=1 & tagnext;if(!woker-next)/若链表为空printf(没有资料可以查找!n);return;printf(ttt*n);printf(ttt*t1:按员工工号查找t *n);printf(ttt*t2:按员工

30、姓名查找t *n);printf(ttt*n);scanf(%d,&sel);if(sel=1)flag2=0;printf(请输入你要查找的员工工号:);scanf(%s,find);while(p)if(strcmp(p-data.num,find)=0)flag2=1;printf(工号 姓名 性别 生日 学历 职位 工资 住址 电话n);if(flag2=1)printf(%-9s%-11s%-8s%-8s%-10s%-9s%-9s%-7s%-7sn,p-data.num,,p-data.sex,p-data.birthday,p-data.degree,p-da

31、ta.position,p-data.salary,p-data.address,p-data.telephone);p=p-next;if(flag2=0)printf(所要查找的员工不存在!n);elseif(sel=2)flag2=0; printf(请输入你要查找的员工姓名:);scanf(%s,find);while(p)if(strcmp(,find)=0)flag2=1;printf(工号 姓名 性别 生日 学历 职位 工资 住址 电话n); if(flag2=1) printf(%-9s%-11s%-8s%-8s%-10s%-9s%-9s%-7s%-7sn

32、,p-data.num,,p-data.sex,p-data.birthday,p-data.degree,p-data.position,p-data.salary,p-data.address,p-data.telephone); p=p-next;if(flag2=0)printf(所要查找的员工不存在!n);图2.2源代码:void delet(Node *woker)/删除员工信息Node *p,*r,*s;char find10;if(!woker-next)printf(没有资料可以显示!n);return;printf(请输入您要删除的员工工号!n);sc

33、anf(%s,find);p=woker-next;while(p!=NULL)if(strcmp(p-data.num,find)=0)/如果找到的话返回的是符合要求break;p=p-next;if(!p)printf(找不到您要删除的员工工号!n);elser=woker;while(r-next!=p)r=r-next;s=r-next;r-next=r-next-next;员工信息保存源代码:void save(Node *woker)/将员工信息保存到文件int n;Node *p;FILE *fp;/指向文件的指针printf(需要保存吗?(1-保存 0-不保存));scanf(

34、%d,&n);if(n)if(woker-next=NULL)printf(无记录);elsep=woker-next;if(fp=fopen(员工管理系统.txt,wb)=NULL)/打开文件,并判断打开是否正常printf(can not open filen);/打开文件失败while(p!=NULL)fprintf(fp,%-9s%-11s%-8s%-8s%-10s%-9s%-9s%-7s%-7sn,p-data.num,,p-data.sex,p-data.birthday,p-data.degree,p-data.position,p-data.salary,p-data.address,p-data.telephone);p=p-next;fclose(fp);/关闭文件 图:简单的员工管理系统主流程图四 程序设计与调试分析简单的员工管理系统测试数据: 每个测试的数据严格按照提示的信息执行。调试遇到的问题与解决方法:在输入登记车辆到达时间的时候,没有相关的小时、分钟数字的限制范围(小时 023,分钟 060);这就使程序不那么健壮了,还有,在计算收费时如果离开时间是到了第二天了,这样就可能会

温馨提示

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

评论

0/150

提交评论