个人项目
一、题目简介
设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆国就进入停车场。停车场内如有某辆车要走,在它之后进来的车都必须退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且其他在便道上等待的车辆的次序不变。编制一程序模拟停车场管理。
二、源码的github链接
https://github.com/dongxuefei/test/blob/master/%E4%B8%AA%E4%BA%BA%E9%A1%B9%E7%9B%AE
三、所设计的模块测试用例、测试结果截图
根据题意,停车场中的空间分为车库和便道。这里用结构体来模拟车库和便道,按照从端读入数据序进行管理。模拟车库和模拟便道中分别用结构体数组和链表来存储车辆信息。
模拟车库和模拟便道的数据结构如下表1和表2所示:
Moni_cheku 结构体 |
CarNode *stack[MAX+1] 结构体数组 |
char num[10] |
|
Time reach 结构体 |
int hour |
||
int min |
|||
Time leave 结构体 |
int hour |
||
int min |
|||
int top |
表1 模拟车库的数据结构
Moni_biandao 结构体 |
QueueNode *head 链表 |
CarNode *data 数组 |
char num [10] |
|
Time reach 结构体 |
int hour |
|||
int min |
||||
Time leave 结构体 |
int hour |
|||
int min |
||||
Struct car *next |
||||
QueueNode *rear 链表 |
CarNode *data 数组 |
char num [10] |
||
Time reach 结构体 |
int hour |
|||
int min |
||||
Time leave 结构体 |
int hour |
|||
int min |
||||
Struct car *next |
表2 模拟便道的数据结构
用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;
}
}
}
(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];
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"); /*没车*/
}
(4)列表显示函数
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;
}
}
}
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");
}
测试结果截图
四、问题及解决方法、心得体会
(1)在此次课程设计中第一次真正体会到了编程的感觉,当投入其中时,感觉不到时间的流逝,只有突然会发现一个下午或是一个晚上过去了。
(2)由于课本上只介绍了数组、结构体、链表的用法,而此次课程设计中要用到堆、栈、队列的知识,因此我利用课余时间查找这方面的内容,通过自学不仅了解到了一些这方面的知识,还锻炼了自己的自学能力。
(3)这次课程设计不同于平时的练习,平时的练习都是一些小程序,虽然知道模块化编程的好处,但从没有这一次体会得深。