c语言小项目 -------- 停车场管理系统

        添加摘要           

1 设计目的
《数据结构》课程主要介绍最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。进行数据结构课程设计要达到以下目的:

1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;

2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;

3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;

4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

2 任务概述
设有一个可以停放n(n>=5)辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在他之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆在依原来的次序进场。每辆车在离开停车场时,都应依据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制模拟该停车场的管理的程序。
3 本设计采用的数据结构

        //时间结点



               typedef
                struct{

                    int day;

                    int hour;

                    int min;

                }TIME;




        //车辆信息

            typedef
            struct{

                char num[10];  //车牌号 

                TIME time;  
            //停车

        时间 



               int n;     

        //停车场中所在位置 

            }information;




        //栈的结构体定义

        typedef
        struct node

    {

        information data;

        struct node *next;

    }stacknode;

    stacknode
    *top1,*top2;//top1 为停车场  top2为暂存域



    //队列结构体定义

    typedef
    struct{

        information data;

        s

tacknode *front,*rear;

}LQueue;

LQueue
*Q;

1.本程序主要应用了两个栈来模拟后进先出的停车场,用一个队列来模拟先进先出的停车便道。

2.由于车辆在停车场需要记录车牌号,停车时间,以

及车辆所在的位置,所以栈的结构体是由嵌套车辆

信息作为成员名和指针域组成,车辆信息又由车牌号,停车时间和车辆在车场中的位置组成。

3.队列结构体由车辆信息数据域和头尾指针组成

4 系统功能模块结构图及主要函数说明

系统功能模块说明:

车辆到达,

车辆离开

停车场信息与便道信息打印

系统主要函数及其说明:

  1. 辆进入停车场函数

    stacknode
    *into(stacknode *top1,LQueue *Q)

    首先将要停入的车辆信息输入然后判断停车场是否已满,若不满则将该车辆停入,若满则将该车辆停入便道等待。使用指针p将要停的车辆信息存储起来,然后根据条件作为栈或队列的结点。

函数流程图如图1.1车辆进入流程图所示。
在这里插入图片描述

2.车辆驶出停车场函数
在这里插入图片描述

 stacknode *leave(stacknode *top1,charstr[],LQueue *Q)

首先判断停车场是否为空,若不为空,则车辆离开,然后判断便道是否有车,如果有则便道车辆进入

停车场,否则结束。将q指向停车场栈top1来进行搜索车辆所在的位置,然后将该车辆前方车辆出停

车场top1栈进入临时存放栈top2,将该车辆出停车场top1栈后再将top2中的结点依次出栈进入top1,

最后根据便道有无车辆判断是否将便道车辆停入。

3.打印停车场信息/打印便道车辆信息函数

void showtop1(stacknode *top1)


int showLQ(LQueue *Q)

主要用while遍历栈或队列。

函数流程图如图1.3打印停车场信息/打印便道车辆信息函数流程图所示。
在这里插入图片描述

图1.3打印停车场信息/打印便道车辆信息函数流程图

5 程序运行数据及其结果

  1. 车辆进入停车场运行结果如图1.4车辆停入运行结果图所示。
    图1.4车辆停入运行结果
    在这里插入图片描述

  2. 车辆离开停车场运行结果如图1.5车辆离开运行结果图所示。
    在这里插入图片描述

图1.5车辆离开运行结果图
在这里插入图片描述
3. 停车场信息打印运行结果如图1.6停车场信息打印运行结果图所示。
在这里插入图片描述

  1. 候车便道车辆信息打印运行结果如图1.7候车便道车辆信息打印运行结果图所示。
    加粗样式


#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <time.h>

#define max 3

#define price 1

int b=1;

 

typedef struct{

       int
day;

       int
hour;

       int
min;

}TIME;//时间结点 

typedef struct{

       char
num[10];  //车牌号 

       TIME
time;   //停车时间 

       int
n;      //停车场中所在位置 

}information; 

 

//栈的结构体定义

typedef struct node{

       information
data;

       struct
node *next;

}stacknode;

stacknode *top1,*top2;//top1 为停车场  top2为暂存域

 

//队列结构体定义

typedef struct{

       information
data;

       stacknode
*front,*rear;

}LQueue;

LQueue *Q;

 

//队列初始化 

LQueue *InitQ()

{

       LQueue
*Q;

       stacknode
*p;

       Q
= (LQueue *)malloc(sizeof(LQueue));

       p
= (stacknode*)malloc(sizeof(stacknode));

       p->next
= NULL;

       Q->front
= Q->rear = p;

       return
Q;

}

 

//栈的初始化

stacknode *Init()

{

       stacknode
*top;

       top
= (stacknode*)malloc(sizeof(stacknode));

       top
= NULL;

       return
top;

}

 

/*

 

调用时间函数用法 

time_t t;

   
struct tm * lt;

   
time (&t);//获取Unix时间戳。

   
lt = localtime (&t);//转为时间结构。

 

时间结构体struct tm 说明:

struct tm { 

int tm_sec; /* 秒 – 取值区间为[0,59] */ 

//int tm_min; /* 分 - 取值区间为[0,59] */ 

//int tm_hour; /* 时 - 取值区间为[0,23] */ 

//int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */ 

//int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */ 

//int tm_year; /* 年份,其值等于实际年份减去1900 */ 

//int tm_wday; /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */ 

//int tm_yday; /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */ 

//int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/ 

//}; */ 

 

//车辆进入便道函数

LQueue *wait(LQueue *q,stacknode *s)

{

       s->next
= NULL;

       q->rear->next
= s;

       q->rear
= s;

       return
q;

       

 } 

 

 

//车辆进入停车场函数 

stacknode *into(stacknode *top1,LQueue *Q)

{

       stacknode
*p,*q;

       time_t
t;//调用系统时间函数

       struct
tm *timeinfo; //时间结点

       time(&t);

       timeinfo
= localtime(&t);

       p
= (stacknode *)malloc(sizeof(stacknode));

       if(p
== NULL)

       {

               printf("内存分配失败!\n");

               return
top1;

        } 

       printf("请输入车牌号:\n");

       scanf("%s",p->data.num);

       q
= top1;

       p->data.time.day
= timeinfo->tm_mday;

       p->data.time.hour
= timeinfo->tm_hour;

       p->data.time.min
= timeinfo->tm_min;

       p->data.n
= b;

       if(b>max)

       {

               printf("停车场以满,请进入便道等候\n");

               wait(Q,p);

              return top1;

       }

       if(top1==NULL)

       {

               p->next
= NULL;

               top1
= p;

       }else{

              p->next = top1;

               top1
= p;

       }

       b++;

       printf("车辆已进入停车场!\n");

       printf("车牌为%s的汽车驶入时间为:%d日%d点%d分\n",top1->data.num,top1->data.time.day,top1->data.time.hour,top1->data.time.min);

       return
top1;

 } 

 

//判断候车区是否为空

int EmptyLQ(LQueue *q) 

{

       if(q->front
== q->rear)

       return
0;

       else

       return
1;

}

 

//候车区出队

stacknode *outQ(LQueue *q)

{

       stacknode
*p;

       p
= q->front->next;

       if(q->front->next
== q->rear)//如果候车区只有一辆车 

       {

              q->rear = q->front;

               return
p;

       }else{

               q->front->next
= p->next;

       }

              p->next = NULL;

              return p;

 } 

 

//候车区车辆进入停车场 

stacknode *LQinto(stacknode *p,stacknode
*top1)

{

       p->next
= top1;

       top1
= p;

       return
top1;

}

 

//车辆计费函数

int expense(stacknode *q,int x1,int x2,int
x3)

{

       int
w;

       if(x3!=0)

               w =
(x1*24+x2+1-(top1->data.time.day*24+top1->data.time.hour+top1->data.time.min))*price;

       else

              w = (x1*24+x2-(top1->data.time.day*24+top1->data.time.hour+top1->data.time.min))*price;

       return
w;

 }

 

 //车辆驶出停车场函数

 stacknode *leave(stacknode *top1,char str[],LQueue
*Q)

 {

      int a,i,day,hour,min;

      time_t 
t;

       struct
tm *timeinfo;

       time(&t);

       timeinfo
= localtime(&t);

       day
= timeinfo->tm_mday;

       hour
= timeinfo->tm_hour;

       min
= timeinfo->tm_min;

       stacknode
*p,*q;

       if(top1
== NULL)

       {

             printf("停车场为空!\n");

             return
top1;

       }


       q
= (stacknode*)malloc(sizeof(stacknode));

       if(q
== NULL){

             printf("内存分配失败");

             return
top1;

       }

       q
= top1;

       while(q!=NULL)

       {

             if(strcmp(str,q->data.num)==0)

             break;

             q=
q->next;

       }

       if(q==NULL)

       {

       printf("输入错误,无此车辆!\n");

       return
top1;

       }

       for(i
= top1->data.n;i>top1->data.n;i--)//将该车辆之前的车停入临时地点 

       {

               p =
(stacknode *)malloc(sizeof(stacknode));

               if(p
== NULL)

               {

                     printf("内存分配失败!\n");

                      return
top1;

               }

               strcpy(p->data.num,top1->data.num);

               p->data.n
= top1->data.n-1;

               p->data.time
= top1->data.time;

               top1
= top1->next;

               if(top2
== NULL)

               {

                     p->next
= NULL;

                      top2
= p;

               }else{

                      p->next
= top2;

                      top2
= p;

              }

        }

       a
= expense(q,day,hour,min);

       top1=top1->next;//指定车辆停出

       while(top2!=NULL)

       {

               p =
(stacknode *)malloc(sizeof(stacknode));

               if(p
== NULL)

               {

                      printf("内存分配失败!\n");

                      return
top1;

               }

               strcpy(p->data.num,top2->data.num);

               p->data.n
= top2->data.n;

              p->data.time = top2->data.time;

              p->next = top1;

              top1 = p;

              top2=top2->next;

       }


       if(EmptyLQ(Q))//车辆出停车场完成,判断便道是否有车 

       {

              p = outQ(Q);//候车区车辆出队 

              p->data.n--;

              top1 = LQinto(p,top1);//入栈 

        }else{

              b--;

       }


              printf("车牌为%s的汽车驶出时间为:%d/%d:%d\n",q->data.num,day,hour,min);

              printf("车辆驶出停车场需要缴纳的费用为:%d元\n",a);         

              return top1;

  } 

 

//打印停车场信息 

void showtop1(stacknode *top1)

{

       printf("   停车场内全部车辆信息表\n");

       if(top1==NULL)

              printf("  停车场内无车!\n");

       else{

                     printf("车牌号      进入时间       位置\n");

              while(top1!=NULL){

                     printf("
%s        %d/%d:%d   第%d位\n",top1->data.num,top1->data.time.day,top1->data.time.hour,top1->data.time.min,top1->data.n);

                     top1=top1->next;

              }

       }

}

 

//打印便道车辆信息 

int showLQ(LQueue *Q){

       stacknode
*p;

       p
= Q->front->next;

       if(p==NULL)

       {

              printf("内便道无车辆\n"); 

       }

       while(p){

              printf("   候车便道内全部车辆信息表\n"); 

              printf("车牌号:%s\n",p->data.num);

              p=p->next;

       }

       printf("\n");

       return
1;

}

 

int main()

{

       char
str[10];

       Q
= InitQ();

       top1
= Init();

       top2
= Init();

       Q
= InitQ();

       int
i;

       printf("\t\t\t#####################################\n");

       printf("\t\t\t       停车场管理系统\n");

       printf("\t\t\t||    1. 车辆进入停车场            ||\n");

       printf("\t\t\t||    2. 车辆离开停车场            ||\n");

       printf("\t\t\t||    3. 显示停车场内所有车辆信息  ||\n");

       printf("\t\t\t||    4. 显示候车区内所有车辆信息  ||\n");

       printf("\t\t\t||    5. 退出                      ||\n");

       printf("\t\t\t#####################################\n");

       while(i!=5){

       printf("\t请输入选项1-5:");

       scanf("%d",&i);

       switch(i){

       case
1:

              top1=into(top1,Q);

              break;

       case
2:

              printf("请输入离开车辆的车牌号:");

              scanf("%s",str);

              top1=leave(top1,str,Q);

              break;

       case
3:showtop1(top1);break;

       case
4:showLQ(Q);break;

       case
5:exit(1);

       default:printf("输入错误,请重新输入1-5:");

              break;

       }            

       }

 }


猜你喜欢

转载自blog.csdn.net/weixin_44192389/article/details/100147773