实习报告-数据结构课程设计
《数据结构》课程设计报告
计算机与信息工程系
《数据结构》课程设计评阅表
一、引言
设停车场是一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停
车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在他之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开车场时必须按它停留的时间长短交纳费用。由于停车场是一个狭窄通道,而且只有一个大门可供汽车进出,问题要求汽车停车场内按车辆到达时间的先后顺序,依次由北向南排列。由此很容易联想到数据结构中的堆栈模型,因此可首先设计一个堆栈,以堆栈来模拟停车场,又每个汽车的车牌号都不一样,这样一来可以根据车牌号准确找到汽车位置,所以堆栈里的数据元素我设计成汽车的车牌号。当停车场内某辆车要离开时,在他之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入停车场。这是个一退一进的过程,而且让道的汽车必须保持原有的先后顺序,因此可再设计一个堆栈,以之来暂时存放为出站汽车暂时让道的汽车车牌号。当停车场满后,继续进来的汽车需要停放在停车场旁边的便道上等候,若停车场有汽车开走,则按排队的先后顺序依次进站,最先进入便道的汽车将会最先进入停车场,这完全是一个先进先出模型,因此可设计一个队列来模拟便道,队列中的数据元素仍然设计成汽车的车牌号。另外,停车场根据汽车在停车场内停放的总时长来收费的,在便道上的时间不计费,因此必须记录车辆
进入停车场时的时间,车辆离开停车场时的时间不需要记录,当从终端输入时可直接使用。
二、设计过程
1、流程图设计
2、设计思想
此停车场管理系统是在一个狭长的通道上的,而且只有一个大门可以供车辆进出,并且要实现停车场内某车辆车要离开时,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车再依原来的次序进场的功能,就可以设计两个堆栈,其中一个堆栈用来模拟停车场,另一个堆栈用来模拟临时停车场,该临时停车场用来存放当有车辆离开时,原来停车场内为其让路的车辆。至于当停车场已满时,需要停放车辆的通道可以用一个链队列来实现。当停车场内开走一辆车时,通道上便有一辆车进入停车场,此时只需要改变通道上车辆结点的链接方式就可以了,使通道上第一辆车进入停车场这个堆栈,并且使通道上原来的第二车辆成为通道上的第一辆车,此时只需将模拟通道的链队列的头结点连到原来的第二辆车上就可以了。
3、主要模块
首先定义用来模拟停车场的堆栈以及用来模拟通道的链队列为全局变量,然后编写主函数,在此主函数中实现对其它各个模块的调用。在主函数中首先调用option()函数,出现欢迎用户使用的主界面,然后提示用户进入此停车场管理系统后,再出现一个工用户选择的界
面,在用户的选择过程中,程序又分别调用车辆的到达、车辆的离开、停车场内停放车辆的信息以及退出程序这四个函数模块。
4、模块间关系
1、常见的错误
容易将程序中的字母打错:在写程序时多注意,尽量不打错
2、运行过程及结果
(1)程序开始运行
(2)车辆到达输入信息
(3)车辆离开
(4)车辆信息
(5)退出系统
四、总结
一周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情的方法和技巧。再设计过程中,和同学们相互探讨,相互学习,相互监督。我学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世,这次课程设计对我来说受益良多。
课程设计是我们专业课程知识综合应用的实践训练,这是我们迈向社会,从事职业工作前一个比不少的过程,“千里之行始于足下”,通过这次课程设计,我深深体会到了这句千古
名言的真正含义,我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳
健的在社会大潮中奔跑打下坚实的基础。
我这次设计的科目是停车场管理系统。数据结构,是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和运算等的学科,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。作为一门独立的课程在国外是从1968年才开始设立的。1968年美国唐-欧-克努特教授开创了数据结构的最初体系,他所著的《计算机程序设计技巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的著作。“数据结构”在计算机科学中是一门综合性的专业基础课。数据结构是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。数据结构这一门课的内容不仅是一般程序设计的基础,而且是设计和实现编译程序、操作系统、数据库系统及其他系统程序的重要基础。通过这次模具设计,我在多方面都有所提高。
通过这次的课程设计,更是让我深刻认识到自己在学习中的不足,同时也找到了克服这些不足的方法,这也是一笔很大的资源。在以后的时间中,我们应该利用更多的实践去上机实验,加强自学的能力,多编写程序,相信不久后我们的编程能力都会有很大的提高,能设
计出更多的更有创新的作品。
五、参考文献
1、C语言程序设计高等教育出版社廖雷第三版2009年
2、数据结构(C语言描述)中国水利水电出版社马秋菊2006年
3、https://www.360docs.net/doc/6c590739.html,
4、https://www.360docs.net/doc/6c590739.html,/p-317736654952.html
六、附录
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"
int MAX; /*定义一个全局变量用来存储车库最大容量*/
float price;/*每车每小时的费用*/
typedef struct time
{ int hour;
int min;
}Time; /*时间结点*/ typedef struct node
{ char num[10];
Time reach;
Time leave;
}Car; /*车辆信息结点*/ typedef struct NODE { Car *stack[100];
int top;
}SqStack; /*停车站*/ typedef struct car
{ Car *data;
struct car *next;
}QNode;
typedef struct Node
{ QNode *head;
}LinkQueue; /*通道*/
void InitStack(SqStack *); /*初始化栈*/
int InitQueue(LinkQueue *); /*初始化便道*/
int arrive(SqStack *,LinkQueue *); /*车辆到达*/
void leave(SqStack *,SqStack *,LinkQueue *); /*车辆离开*/ void info(SqStack,LinkQueue); /*显示停车场信息*/
void PRINT(Car *p,int room);
void InitStack(SqStack *s) /*初始化栈*/
{ int i;
s->top=0;
for(i=0;i<=MAX;i++)
s->stack[s->top]=NULL; }
int InitQueue(LinkQueue *Q) /*初始化便道*/
{ Q->head=(QNode *)malloc(sizeof(QNode));
if(Q->head!=NULL)
{ Q->head->next=NULL;
Q->rear=Q->head;
return(1); }
void main()
{ SqStack In,Out;
LinkQueue Wait;
int ch;
InitStack(&In); /*初始化停车站*/
InitStack(&Out); /*初始化让路的临时栈*/
InitQueue(&Wait); /*初始化通道*/
while(1)
{ printf("--------------------欢迎使用停车场管理系统--------------------\n");
printf("\t本系统由5011工作室开发,作者:****、*****、*****、******。\n\n"); printf("请输入停车场的容量:");
scanf("%d",&MAX);
printf("请输入停车场的收费标准(元/小时):");
scanf("%f",&price);
printf("您输入的停车场容量为%d位,费用为%2.1f元/小时。\n",MAX,price);
printf("\n(1)车辆到达\n(2)车辆离开\n(3)停车场信息\n(4)退出系统\n请选择
\n");
while(1)
{ ch=getch();
switch(ch)
{ case 49:arrive(&In,&Wait);break; /*车辆到达*/
case 50:leave(&In,&Out,&Wait);break; /*车辆离开*/
case 51:info(In,Wait);break; /*输出车站信息*/
case 52:{printf("谢谢使用!");exit(0);} /*退出主程序*/
default:printf("\n按键无效,请重新按键选择!");
}/*49-52分别表示"1"-"4"这四个按键的键值*/
system("CLS");
printf("--------------------欢迎使用停车场管理系统--------------------\n");
printf("\t本系统由CG工作室开发,作者:***、***、***、***。\n\n\n");
printf("您输入的停车场容量为%d位,费用为%2.1f元/小时。
\n",MAX,price);
printf("\n(1)车辆到达\n(2)车辆离开\n(3)停车场信息\n(4)退出系统\n请选择\n");
} } }
int arrive(SqStack *In,LinkQueue *W) /*车辆到达*/
{ Car *p;
QNode *t;
p=(Car *)malloc(sizeof(Car));
flushall();
printf("\n停车场还有%d停车位(若停车位为0,车可先进入便道等待)",MAX-In->top);
printf("\n请输入车牌号码(例:湘D0734):");
gets(p->num);
if(In->top { In->top++; printf("\n停车的位置:%d号停车位。",In->top); //printf("\n请输入车到达的时间(格式"**:**"):"); printf("\n请输入车到达的时间:"); scanf("%d:%d",&(p->reach.hour),&(p->reach.min)); In->stack[In->top]=p; printf("请按任意键返回"); getch(); return(1); } else /*停车场已满,车进便道*/ { printf("\n停车位已满,该车须在便道等待!"); t=(QNode *)malloc(sizeof(QNode)); t->data=p; t->next=NULL; W->rear->next=t; W->rear=t; printf("请按任意键返回"); getch(); return(1); } } void leave(SqStack *In,SqStack *Out,LinkQueue *W) { /*车辆离开*/ int room; Car *p,*t; QNode *q; /*判断车场内是否有车*/ if(In->top>0) /*有车*/ { while(1) /*输入离开车辆的信息*/ { printf("\n请输入车在停车场的位置(1-%d):",In->top); scanf("%d",&room); if(room>=1&&room<=In->top) break; } while(In->top>room) /*车辆离开*/ { Out->top++; Out->stack[Out->top]=In->stack[In->top]; In->stack[In->top]=NULL; In->top--; } p=In->stack[In->top]; In->stack[In->top]=NULL; In->top--; while(Out->top>=1) { In->top++; In->stack[In->top]=Out->stack[Out->top]; Out->stack[Out->top]=NULL; Out->top--; } PRINT(p,room); /*判断通道上是否有车及车站是否已满*/ if((W->head!=W->rear)&&In->top t=q->data; In->top++; printf("\n便道的%s号车进入车场第%d号停车位。",t->num,In->top); //printf("\n请输入现在的时间(格式"**:**"):"); printf("\n请输入现在的时间:"); scanf("%d:%d",&(t->reach.hour),&(t->reach.min)); W->head->next=q->next; if(q==W->rear) W->rear=W->head; In->stack[In->top]=t; free(q); } } else printf("\n停车场里没有车\n"); /*没车*/ printf("请按任意键返回"); getch();} void info1(SqStack *S) /*列表输出车场信息*/ { int i; if(S->top>0) /*判断停车场内是否有车*/ { printf("\n车场:"); printf("\n 位置到达时间车牌号\n"); for(i=1;i<=S->top;i++) { printf(" %d\t",i); printf("%d:%d ",S->stack[i]->reach.hour,S->stack[i]->reach.min); puts(S->stack[i]->num); } } else printf("\n停车场里没有车"); } void info2(LinkQueue *W) /*显示便道信息*/ { QNode *p; p=W->head->next; if(W->head!=W->rear) /*判断通道上是否有车*/ { printf("\n便道中车辆的号码为:\n"); while(p!=NULL) { puts(p->data->num); p=p->next; } } else printf("\n便道里没有车\n"); printf("请按任意键返回"); getch();} void info(SqStack S,LinkQueue W) { info1(&S); /*显示停车场信息*/ info2(&W); /*显示停便道信息*/ } void PRINT(Car *p,int room) /*输出停车站车的信息*/ { int A1,A2,B1,B2; //printf("\n请输入车离开的时间(格式"**:**"):"); 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("车离开的时间是: %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)+(B2-A2)/60.0)*price); free(p); }