数据结构课程设计.docx
- 文档编号:10314088
- 上传时间:2023-02-10
- 格式:DOCX
- 页数:53
- 大小:834.23KB
数据结构课程设计.docx
《数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计.docx(53页珍藏版)》请在冰豆网上搜索。
数据结构课程设计
淮海工学院计算机工程学院
课程设计报告
设计名称:
数据结构课程设计
选题名称:
姓名:
学号:
专业班级:
计算机科学与技术
系(院):
计算机工程学院
设计时间:
2014.12.22~2015.1.4
设计地点:
计算机实验室、教室
成绩:
指导教师评语:
签名:
年月日
1.课程设计目的
1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。
2、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
3、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4、训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。
2.课程设计任务与要求:
任务
根据教材《数据结构-C语言描述》(耿国华主编)和参考书《数据结构题集(C语言版)》(严蔚敏、吴伟民主编)选择课程设计题目,要求通过设计,在数据结构的逻辑特性和物理表示、数据结构的选择应用、算法的设计及其实现等方面加深对课程基本内容的理解和综合运用。
设计题目从任务书所列选题表中选取,每班每题不得超过2人。
学生自选课题。
学生原则上可以结合个人爱好自选课题,要求课题有一定的深度与难度,有一定的算法复杂性,能够巩固数据结构课程所学的知识。
学生自选课题需在18周前报课程设计指导教师批准方可生效。
要求:
1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。
前期准备工作完备与否直接影响到后序上机调试工作的效率。
在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。
2、设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。
3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;
4、每位同学需提交可独立运行的程序;
5、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于10页(代码不算);
6、课程设计实践作为培养学生动手能力的一种手段,单独考核。
3.课程设计说明书
一需求分析
停车场管理系统
(1)根据车辆到达停车场到车辆离开停车场时所停留的时间进行计时计费。
(2)当有车辆从停车场离开时,等待的车辆按顺序进入停车场停放,实现停车场的调度功能。
(3)用要求以顺序栈模拟停车场,以链队列模拟便道。
(4)从终端读入汽车到达或离去的数据,每组数据包括三项:
①是“到达”还是“离去”;
②汽车牌照号码;
③“到达”或“离去”的时刻。
(5)每组输入信息相应的输出信息为:
如果是到达的车辆,则输出其在停车场中或便道上的位置;如果是离去的车辆,则输出其在停车场中停留的时间和应交的费用。
二概要设计
停车场管理系统
1、系统用到的抽象数据类型定义:
typedefstructnode
{
charnum[10];//车牌号码
Timereach;//到站时间
Timeleave;//离开时间
}CarNode;
typedefstructtime
{
inthour;
intmin;
}Time;
typedefstructNODE
{
CarNode*stack[MAX+1];//栈用顺序表示
inttop;
}SeqStackCar;
typedefstructcar
{
CarNode*data;//便道上的车用链表表示
structcar*next;
}QueueNode;
typedefstructNode
{
QueueNode*head;//设置头指针、尾指针。
QueueNode*rear;
}LinkQueueCar;
2、系统中的子程序和功能说明:
(1)voidInitStack(SeqStackCar*);//车辆节点进栈
当栈未满时,就把到达的车辆进栈。
(2)intInitQueue(LinkQueueCar*);//车辆节点进队列
当栈满了时,车辆就进入便道上的队列中
(3)intArrival(SeqStackCar*,LinkQueueCar*);//车辆到达登记
车辆到达时,先登记车辆车牌号码。
然后再判断停车场有没有停满,没停满就进栈,停满了就停在便道上,即进队列。
。
(4)voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*);//车辆离开处理
通过输入离开车辆的位置处理,然后调用PRINT(CarNode*p,introom);函数进行收费。
。
然后再判断便道上有没有车,如果有,就把便道上的车进停车场内。
(5)voidList(SeqStackCar,LinkQueueCar);//显示车场内和便道上的车辆情况
用个switch();函数选择显示车场内或是便道上的车辆情况。
包括对下面两个子函数的调用:
voidList1(SeqStackCar*S);
voidList2(LinkQueueCar*W);//分别为显示车场和便道上的车辆情况
(6)voidPRINT(CarNode*p,introom);//车辆离开是的收费
这个函数由车辆离开的函数调用,以分钟计时算费,但只能计算当天之内的费用,如果第二天的话会导致计费为负或减少。
即只能当天停,当天开走。
3、系统程序功能结构图
三详细设计
停车场管理系统
算法的设计思想及流程图
主要模块算法描述:
本程序最主要的算法就是车辆到达登记的和车辆离开的。
车辆到达:
intArrival(SeqStackCar*Enter,LinkQueueCar*W)
首先定义一个栈和队列的结构体指针为:
*p,*t,然后申请一个车辆信息的内存空间,并把它赋给栈指针.车辆到达时就输入车牌号,并通过if(Enter->top 如果是else就显示该车要停在便道上,并进行进队列的操作。 车辆离开: voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W) 定义一个整型变量room记录要离开车辆的位置,定义两个栈指针和一个队列指针,用个if(Enter->top>0)确保栈不空,然后用个while (1)确保输入的车辆离开位置的合法性。 如果不和法,显示输入有误,要重新输入。 通过while(Enter->top>room)判断离开车辆的位置,如果是中间位置,就要再用一个栈前面临时开出来的车,等要开出的车开出后,再把临时栈的车看进车场内,并要调用PRINT(p,room);这个函数计算显示费用.然后还要用if((W->head! =W->rear)&&Enter->top 图1.1: 车辆到达车场 图1.1源代码: intArrival(SeqStackCar*Enter,LinkQueueCar*W)//车辆的到达登记 { CarNode*p; QueueNode*t; p=(CarNode*)malloc(sizeof(CarNode)); flushall(); printf("\n请输入车牌号(例: B1234): "); gets(p->num); if(Enter->top { Enter->top++; printf("\n车辆在车场第%d位置.",Enter->top); printf("\n车辆到达时间: "); scanf("%d: %d",&(p->reach.hour),&(p->reach.min)); Enter->stack[Enter->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); } } 图1.2源代码: voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)//车辆的离开 { introom; CarNode*p,*t; QueueNode*q; if(Enter->top>0)//判断车场是否为空 { while (1) { printf("\n请输入车在车场的位置/1--%d/: ",Enter->top); scanf("%d",&room); if(room>=1&&room<=Enter->top)break; elseprintf("\n输入有误,请重输: "); } while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。 { Temp->top++; Temp->stack[Temp->top]=Enter->stack[Enter->top]; Enter->stack[Enter->top]=NULL; Enter->top--; } p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。 Enter->stack[Enter->top]=NULL; Enter->top--; while(Temp->top>=1)//再把临时栈里德车辆进停车场 { Enter->top++; Enter->stack[Enter->top]=Temp->stack[Temp->top]; Temp->stack[Temp->top]=NULL; Temp->top--; } PRINT(p,room);//调用计费函数计费。 。 if((W->head! =W->rear)&&Enter->top { q=W->head->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->stack[Enter->top]=t; free(q); } elseprintf("\n便道里没有车.\n"); } elseprintf("\n车场里没有车."); } 显示车场里的车辆情况源程序: voidList1(SeqStackCar*S)//显示车场里的车辆情况 { inti; if(S->top>0) { printf("\n车场: "); printf("\n位置到达时间车牌号\n"); for(i=1;i<=S->top;i++) { printf("%d",i); printf("%d: %d",S->stack[i]->reach.hour,S->stack[i]->reach.min); puts(S->stack[i]->num); } } elseprintf("\n车场里没有车"); } 显示便道上的车辆情况源代码: voidList2(LinkQueueCar*W)//显示便道上的车辆情况 { QueueNode*p; inti; 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; } } elseprintf("\n便道里没有车."); printf("\n"); } 图1.3: 停车场管理系统主流程图. 四程序设计与调试分析 停车场管理系统 测试数据: 每个测试的数据都是以字符串的形式存储的,输入数据是严格按照提示的信息执行。 调试遇到的问题与解决方法: 在调试的过程中,输出员工信息的时候格式老是错位,调试了很多次才得以调整;在从文件中读出数据时老是显示不出数据,最后才发现原来是忘了写输出语句,但是在添加上去之后,能输出信息却有很多的乱码,仔细检查了一遍又一遍后终于发现了,原来是自己定义的指针在循环的过程中次序混乱了。 在调试的过程中我还发现我的提示语句不多,导致让别人不知道下一步要做些什么,所以就适当的添加了一些提示的信息。 五用户手册 停车场管理系统 【使用说明】 (1)进入程序的界面,出现命令的帮助信息(停车场的最大容量为三辆车,多了则进入便道中等待其他车离开车场)。 (2)输入1: 车辆到达登记;输入2: 车辆离开登记;输入3: 车辆列表显示;输入4: 退出系统(首先得进行车辆登记,否则停车场里没有车) (3)车辆登记时,到达的时间与离开的时间一定要严格按照时间的模式,如: 8: 00 (4)显示车辆列表时,有相应的信息提示,看自己的意愿执行程序。 (5)在觉得操作完毕时输入4: 退出系统。 【程序中的头文件】 #include #include #include #defineMAX3//停车场最大容量为3辆,便于观察 #defineprice0.05 六测试成果 停车场管理系统 七附录(源程序清单) 停车场管理系统 #include #include #include #defineMAX3//停车场最大容量为3辆,便于观察 #defineprice0.05 typedefstructtime//定义时间结构体 { inthour; intmin; }Time; typedefstructnode//定义车辆信息结构体 { charnum[10];//车牌号码 Timereach;//到站时间 Timeleave;//离开时间 }CarNode; typedefstructNODE { CarNode*stack[MAX+1]; inttop; }SeqStackCar; typedefstructcar { CarNode*data; structcar*next; }QueueNode; typedefstructNode { QueueNode*head; QueueNode*rear; }LinkQueueCar; voidInitStack(SeqStackCar*); intInitQueue(LinkQueueCar*); intArrival(SeqStackCar*,LinkQueueCar*); voidLeave(SeqStackCar*,SeqStackCar*,LinkQueueCar*); voidList(SeqStackCar,LinkQueueCar); voidmain() { SeqStackCarEnter,Temp; LinkQueueCarWait; intch; InitStack(&Enter); InitStack(&Temp); InitQueue(&Wait); while (1) { printf("\n§※§※§※§※§※§欢迎使用停车场系统(停车场最大容量为3辆)§※§※§※§※§\t"); printf("\n\t※◎※◎※◎※◎1.车辆到达登记.※◎※◎※◎※◎\t\n"); printf("\n\t※◎※◎※◎※◎2.车辆离开登记.※◎※◎※◎※◎\t\n"); printf("\n\t※◎※◎※◎※◎3.车辆列表显示.※◎※◎※◎※◎\t\n"); printf("\n\t※◎※◎※◎※◎4.退出系统.※◎※◎※◎※◎\t\n"); while (1) { printf("请选择: "); scanf("%d",&ch); if(ch>=1&&ch<=4) break; elseprintf("\n输入有误,请重新选择: 1~4: "); } switch(ch) { case1: Arrival(&Enter,&Wait);break; case2: Leave(&Enter,&Temp,&Wait);break; case3: List(Enter,Wait);break; case4: exit(0); default: break; } } } //自定义函数 voidInitStack(SeqStackCar*s)//栈的初始化 { inti; s->top=0; for(i=0;i<=MAX;i++) s->stack[s->top]=NULL; } intInitQueue(LinkQueueCar*Q)//队列的初始化 { Q->head=(QueueNode*)malloc(sizeof(QueueNode)); if(Q->head! =NULL) { Q->head->next=NULL; Q->rear=Q->head; return (1); } elsereturn(-1); } voidPRINT(CarNode*p,introom)//车辆收费 { intA1,A2,B1,B2; printf("\n车辆离开的时间: "); scanf("%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); } intArrival(SeqStackCar*Enter,LinkQueueCar*W)//车辆的到达登记 { CarNode*p; QueueNode*t; p=(CarNode*)malloc(sizeof(CarNode)); flushall(); printf("\n请输入车牌号(例: B1234): "); gets(p->num); if(Enter->top { Enter->top++; printf("\n车辆在车场第%d位置.",Enter->top); printf("\n车辆到达时间: "); scanf("%d: %d",&(p->reach.hour),&(p->reach.min)); Enter->stack[Enter->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); } } voidLeave(SeqStackCar*Enter,SeqStackCar*Temp,LinkQueueCar*W)//车辆的离开 { introom; CarNode*p,*t; QueueNode*q; if(Enter->top>0)//判断车场是否为空 { while (1) { printf("\n请输入车在车场的位置/1--%d/: ",Enter->top); scanf("%d",&room); if(room>=1&&room<=Enter->top)break; elseprintf("\n输入有误,请重输: "); } while(Enter->top>room)//把要删除的车辆的前面的车开出来,进临时栈。 { Temp->top++; Temp->stack[Temp->top]=Enter->stack[Enter->top]; Enter->stack[Enter->top]=NULL; Enter->top--; } p=Enter->stack[Enter->top];//把要删除的车辆节点赋给p。 Enter->stack[Enter->top]=NULL; Enter->top--; while(Temp->top>=1)//再把临时栈里德车辆进停车场 { Enter->top++; Enter->stack[Enter->top]=Temp->stack[Temp->top]; Temp->stack[Temp->top]=NULL;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计