个人项目

一、题目简介

      设有一个可以停放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)这次课程设计不同于平时的练习,平时的练习都是一些小程序,虽然知道模块化编程的好处,但从没有这一次体会得深。

                                                                                                                                                     

posted @ 2015-04-25 12:29  201303014017  阅读(282)  评论(3编辑  收藏  举报