当前位置:文档之家› C语言课程设计报告停车场管理系统(1)

C语言课程设计报告停车场管理系统(1)

C语言课程设计报告——停车场管理1班级:学号:*名:**指导教师:***时间:2011年6月7日C课程设计报告目录一、题目及要求二、题目及要求三、题目及要求四、题目分析五、数据结构说明六、各函数算法分析七、程序测试八、课程设计感悟与收获九、源代码一、题目及要求[要求]设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。

车辆按到达停车场时间的早晚依次从停车场最里面向大门口停放(最先到达的第一辆车放在停车场的最里面)。

如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆国就进入停车场。

停车场内如有某辆车要走,在它之后进来的车都必须退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。

每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。

如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且其他在便道上等待的车辆的次序不变。

编制一程序模拟停车场管理。

[提示]汽车的模拟输入信息格式可以是:(到达/离去,汽车牌照号码,到达/离去时刻)。

例如:(’A’,1,5)表示1号牌照车在5这个时刻到达,而(’D’,5,20)表示5号牌照车在20这个时刻离去,整个程序可以在输入信息为(’E’,0,0)时结束。

基本要求:要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交的费用和它在停车场内停留的时间。

根据题目要求,停车场可以用一个长度为n的堆栈来模拟。

由于停车场内如有某辆车要开走,在它之后进来的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。

所以可以设两个堆栈。

二、题目分析由于停车场是一个狭窄通道,而且只有一个大门可供汽车进出,问题要求汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列。

由此很容易联想到用结构体数组来存储车库信息。

又每个汽车的车牌号都不一样,这样一来就可以根据车牌号准确找到汽车位置。

当停车场内某辆车要离开时,在他之后进入的汽车必须再按原次序进入车库。

这是一个一退一进的过程,而且让道的汽车必须保持原有的先后顺序,因此可再设计一个结构体数组,用来暂时存放为出站汽车暂时让道的汽车车牌号。

当车库满后,继续进来的汽车需要停放在车库旁边的便道上等候,若车库满后,继续进来的汽车需要停放在车库旁边的便道上等候,若车有汽车开走,这完全是一个先进先出模型,因此可以设计一个队列来模拟便道,队列中的数据元素仍然设计成汽车的车牌号。

另外,停车场是根据汽车在停车场内停放的总长来收费的,在便道上的时间不计费,因此必须记录车辆进入车库时的时间,车辆离开车库时的时间不需要记录,当从终端输入时可直接使用。

另外,题目提示中的表示方法[(’A’,1,5)表示1号牌照车在5这个时刻到达]有两点不好;一、对用户友好程度不高,用起来并不方便;二、不接近实际情况,生活中表示时间的格式为“--:--”,完全可以建立一个时间结点来实现。

因此,实际编程中将对这一方面予以优化。

三、数据结构说明根据题意,停车场中的空间分为车库和便道。

这里用结构体来模拟车库和便道,按照从端读入数据序进行管理。

模拟车库和模拟便道中分别用结构体数组和链表来存储车辆信息。

模拟车库和模拟便道的数据结构如下表1和表2所示:C课程设计报告表1 模拟车库的数据结构用C语言实现这一部分为:typedef struct time{int hour;int min;}Time; /*时间结点*/typedef struct node{char num[10];Time reach;Time leave;}CarNode;/*车辆信息结点*/typedef struct NODE{CarNode *stack[MAX+1];int top;}Moni_Cheku;typedef struct car{CarNode *data;struct car *next;}QueueNode;typedef struct Node{QueueNode *head;QueueNode *rear;}Moni_Biandao;四、各函数算法分析(1)主函数void main(){Moni_Cheku Enter,Temp;Moni_Biandao Wait;int ch;InitStack(&Enter); /*初始化车站*/InitStack(&Temp); /*初始化让路的临时链表*/InitQueue(&Wait); /*初始化便道*/printf("\n");printf(" ^_^欢迎进入停车场管理系统1!^_^\n");printf("\n");printf("提示! (1).该车库的最大容量为:%d;\n" ,MAX);printf(" (2).该车库的收费标准为:%4.2f元/(辆*分钟).\n",price);while(1){printf("********************主菜单********************\n");printf("1.车辆到达");printf(" 2.车辆离开");printf(" 3.列表显示");printf(" 4.退出系统\n");printf("**********************************************\n");printf("请选择(1-4):[ ]\b\b");while(1){scanf("%d",&ch);if(ch>=1&&ch<=4)break;else printf("错误!请重选(1-4):[ ]\b\b");}switch(ch){case 1:Arrival(&Enter,&Wait);break; /*车辆到达*/case 2:Leave(&Enter,&Temp,&Wait);break; /*车辆离开*/case 3:List(Enter,Wait);break; /*打印列表信息*/case 4:exit(0); /*退出主程序*/default: break;C课程设计报告}}}(2)车辆到达函数int Arrival(Moni_Cheku *Enter,Moni_Biandao *W) /*车辆到达*/ {CarNode *p;QueueNode *t;p=(CarNode *)malloc(sizeof(CarNode));flushall();printf("请输入车牌号(例如:中CUG888):");gets(p->num);if(Enter->top<MAX) /*车库未满,车进车库*/{Enter->top++;printf("该车在车库位置%d.\n",Enter->top);printf("请输入到达时间(**:**):");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); } }(3)车辆离开函数void Leave(Moni_Cheku *Enter,Moni_Cheku *Temp,Moni_Biandao *W) /*车辆离开*/ {int i, room; CarNode *p,*t; QueueNode *q;/*判断车库内是否有车*/ if(Enter->top>0) /*有车*/ {printf("请输入车在车库的位置(1--%d):",Enter->top);/*输入车辆离开的信息*/ while(1) {scanf("%d",&room);if(room>=1&&room<=Enter->top) break; else printf("错误!请重选:"); }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];C课程设计报告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<MAX) /*便道的车辆进入车库*/{q=W->head->next;t=q->data;Enter->top++;printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);printf("\n请输入现在的时间(**:**):");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);}else printf("\n便道里没有车.\n");}else printf("车库里没有车!\n"); /*没车*/}(3)列表显示函数void List(Moni_Cheku S,Moni_Biandao W){int flag,tag;flag=1;while(flag){printf("**********查看**********\n");printf("1.车库 2.便道 3.返回\n");printf("************************\n");printf("请选择(1-3):[ ]\b\b");while(1){scanf("%d",&tag);f(tag>=1&&tag<=3) break;else printf("错误!请重选(1-3):[ ]\b\b");}switch(tag){case 1:List1(&S);break;/*列表显示车库信息*/case 2:List2(&W);break; /*列表显示便到信息*/case 3:flag=0;break;default: break;}}}C课程设计报告void List1(Moni_Cheku *S) /*列表显示车库信息*/{int i;if(S->top>0) /*判断车库内是否有车*/{printf("车库:");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);}}else printf("车库里没有车\n");}void List2(Moni_Biandao *W) /*列表显示便道信息*/ {QueueNode *p;p=W->head->next;if(W->head!=W->rear) /*判断便道上是否有车*/{printf("在便道里等待的车辆的号码为:\n");while(p!=NULL){puts(p->data->num);p=p->next;}}else printf("便道里没有车.\n");}C课程设计报告五、程序测试(1)测试系统对错误信息的处理(2)进入2辆车,车均进车库,便道上无车,并进行列表显示C课程设计报告(3)再进入3辆车,第一辆车进车库,后2辆车在便道等待,同时输出等待的提示作息,最后列表显示以查寻结果,此时车库已满,便道上有2辆车在等待。

相关主题