数据结构课程设计-停车场管理系统

利用前面所建立的算法库基础进行的课程设计,名曰停车场管理系统

具体利用顺序栈以及链队等知识

当车辆进入时,输入车辆车牌号码并且自动获取当前系统时间。

具体请运行代码。

parking.h:

包含定义顺序表数据结构的代码、宏定义、要实现算法的函数的声明;

/********************************************** 
 *Copyright(c)2017,烟台大学计算机学院 
 *All right reserved. 
 *文件名称:parking.h
 *作者:李小同 
 *完成日期;2017年12月21日 
 *当前版本号;v1.1 
 * 
 *修改日期:20171221
 *版本号:v1.1
 *修改人:李小同
 *修改内容:创建
********************************************** /


#ifndef PARKING_H_INCLUDED
#define PARKING_H_INCLUDED

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
typedef struct time //时间结点
{
  int hour;
  int min;
}Time;
typedef struct node //车辆信息结点
{
  char num[10];     //车牌
  Time reach;
  Time leave;
}CarNode;
typedef struct NODE  //模拟停车场
{
  CarNode *stack[4];
  int top;
}SeqStackCar;
typedef struct car   //车辆等候数据
{
  CarNode *data;
  struct car *next;  //这个指针结点的作用是将车场和便道的车辆连起来。
}QueueNode;
typedef struct Node  //模拟便道
{
  QueueNode *head;
  QueueNode *rear;
}LinkQueueCar;//便道的链队结点

void InitStack(SeqStackCar *);                          //初始化栈
int InitQueue(LinkQueueCar *);                          //初始化便道
int arrival(SeqStackCar *,LinkQueueCar *);              //车辆到达
void leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *); //车辆离开
void list(SeqStackCar,LinkQueueCar);                    //显示存车信息
#endif // PARKING_H_INCLUDED


parking,cpp:

包含实现各种算法的函数的定义

/********************************************** 
 *Copyright(c)2017,烟台大学计算机学院 
 *All right reserved. 
 *文件名称:parking.cpp
 *作者:李小同 
 *完成日期;2017年12月21日 
 *当前版本号;v1.1 
 * 
 *修改日期:20171221
 *版本号:v1.1
 *修改人:李小同
 *修改内容:创建
********************************************** /


#include "parking.h"

/*************************************************
 *功能描述:初始化栈void InitStack(SeqStackCar *); 
 *输入参数:将栈顶指针置为0
 *输出参数:栈全为NULL
 *返回值:  
 *其他说明:
 *************************************************/

void InitStack(SeqStackCar *s) //初始化栈
{
  int i;
  s->top=0;  //栈顶指针置为0.
  for(i=0;i<=3;i++)
    s->stack[s->top+i]=NULL;
}
/*************************************************  
 *功能描述:初始化便道int InitQueue(LinkQueueCar *);
 *输入参数:分配空间,创建一个链队结点Q->head
 *输出参数:Q->head,Q->rear全为NULL
 *返回值:  成功返回-1,反之返回1
 *其他说明:
 ************************************************* /


int InitQueue(LinkQueueCar *Q) //初始化便道
{
  Q->head=(QueueNode *)malloc(sizeof(QueueNode));//分配空间,创建一个链队结点Q->head
  if(Q->head!=NULL)
  {
    Q->head->next=NULL;
    Q->rear=Q->head;
    return 1;
  }
  else return -1;
}
/*************************************************  
 *功能描述:打印出站车辆的信息void print(CarNode *p,int room)
 *输入参数:p->num车牌号,p->reach/leave.hour/min停车以及驶离的时间
 *输出参数:停车费用,车牌号,停车以及驶离的时间
 *返回值:  
 *其他说明:释放节点p
************************************************* /


void print(CarNode *p,int room) //打印出站车的信息
{
    time_t u; //time_t是time.h定义的结构体
	struct tm *o; //停车时间
	struct tm *l; //驶离时间
	time (&u);
	o=localtime(&u);
	l=localtime(&u);
    p->leave.hour=l->tm_hour;
    p->leave.min=l->tm_min;
  int A1,A2,B1,B2;
  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)*60+(B2-A2))*0.05);
  free(p);//释放结点
}

/*************************************************  
 *功能描述:车辆到达int arrival(SeqStackCar *,LinkQueueCar *);
 *输入参数:为车辆信息开辟空间,输入p->num
 *输出参数:车辆在栈中的位置以及停车时间
 *返回值:  
 *其他说明:
 ************************************************* /

int arrival(SeqStackCar *Enter,LinkQueueCar *W) //       车辆到达
{
    time_t u; //time_t是time.h定义的结构体
	struct tm *o; //停车时间
	time (&u);
	o=localtime(&u);
  CarNode *p;
  QueueNode *t;
  p=(CarNode *)malloc(sizeof(CarNode));
  system("cls");
  printf("\n输入车牌号:");
  scanf("%s",p->num);
  if(Enter->top<3)   //车场未满,车进车场
  {
    Enter->top++;  //栈顶指针加1
    p->reach.hour=o->tm_hour;
    p->reach.min=o->tm_min;
    printf("\n您的车停在:%d 位置",Enter->top);
    printf("\n您停车的时间为:%d:%d\n",o->tm_hour,o->tm_min);
    Enter->stack[Enter->top]=p;
    return 1;
  }
  else   //车场已满,车进便道
  {
      system("cls");
    printf("\n该车须在便道等待!");
    t=(QueueNode *)malloc(sizeof(QueueNode));
    t->data=p;
    t->next=NULL;
    W->rear->next=t;
    W->rear=t;
    return 1;
  }
}

/*************************************************  
 *功能描述:车辆离开void leave(SeqStackCar *,SeqStackCar *,LinkQueueCar *);
 *输入参数:车辆的位置,便道中车的数据
 *输出参数:车场中车的信息以及停车费用,便道车进入车场记录的信息
 *返回值:  
 *其他说明:
 ************************************************* /

void leave(SeqStackCar *Enter,SeqStackCar *Temp,LinkQueueCar *W)  //车辆离开
{
  int i, room;
    time_t u; //time_t是time.h定义的结构体
	struct tm *o; //停车时间
	time (&u);
	o=localtime(&u);
  CarNode *p,*t;
  QueueNode *q;
  //判断车场内是否有车
  if(Enter->top>0) //有车
  {
    while(1) //输入离开车辆的信息
    {
         system("cls");
      printf("\n请输入车在车场的位置/1--%d/:",Enter->top);
      scanf("%d",&room);
      if(room>=1&&room<=Enter->top)
        break;
    }
    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<3) //便道的车辆进入车场
    {
      q=W->head->next;
      t=q->data;
      Enter->top++;
      printf("\n便道的%s号车进入车场第%d位置.",t->num,Enter->top);
      printf("\n此车进入的时间为%d:%d",o->tm_hour,o->tm_min);
      t->reach.hour=o->tm_hour;
      t->reach.min=o->tm_min;
      W->head->next=q->next;
      if(q==W->rear)
      W->rear=W->head;
      Enter->stack[Enter->top]=t;
      free(q);
    }
  }
  else
    printf("\n车场里没有车."); //没车
}
void list1(SeqStackCar *S)   //列表显示车场信息
{
  int i;
  if(S->top>0)  //判断车站内是否有车
  {
      system("cls");
    printf("\n车场:");
    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);
      printf(" %s\n",S->stack[i]->num);
    }
  }
  else
    system("cls");
    printf("\n车场里没有车");
}
void list2(LinkQueueCar *W)  //列表显示便道信息
{
  QueueNode *p;
  p=W->head->next;
  if(W->head!=W->rear)  //判断通道上是否有车
  {
      system("cls");
    printf("\n等待车辆的车牌号为:\n");
    while(p!=NULL)
    {
      puts(p->data->num);
      p=p->next;
    }
  }
  else
    system("cls");
    printf("\n便道里没有车.");
}
/*************************************************  
 *功能描述:显示存车信息void list(SeqStackCar,LinkQueueCar);
 *输入参数:功能选择
 *输出参数:函数的调用
 *返回值:  
 *其他说明:
************************************************* /

void list(SeqStackCar S,LinkQueueCar W)
{
  int flag;
  int g;
  flag=1;
  while(flag)
  {
       system("cls");
    printf("\n请选择 1|2|3:");
    printf("\n1.车场\n2.便道\n3.返回\n");
    while(1)
    {
      scanf("%d",&g);
      if(g>=1 || g<=3)
        break;
      else
        printf("\n请选择 1|2|3:");
    }
    switch(g)
    {
    case 1:
      list1(&S);
      system("pause");
      system("cls");
      break;  //列表显示车场信息
    case 2:
      list2(&W);
      system("pause");
      system("cls");
      break;  //列表显示便道信息
    case 3:
      flag=0;
      system("cls");
      break;
    default: break;
    }
  }
}
main.cpp:
/********************************************** 
 *Copyright(c)2017,烟台大学计算机学院 
 *All right reserved. 
 *文件名称:main.cpp
 *作者:李小同 
 *完成日期;2017年12月21日 
 *当前版本号;v1.1 
 * 
 *修改日期:20171221
 *版本号:v1.1
 *修改人:李小同
 *修改内容:创建
********************************************** /

#include "parking.h"
int main(void)
{
  SeqStackCar Enter,Temp;
  LinkQueueCar Wait;
  int ch;
  InitStack(&Enter);  //初始化车站
  InitStack(&Temp);   //初始化让路的临时栈
  InitQueue(&Wait);   //初始化便道
  while(1)
  {
    printf("------------富强 民主 文明 和谐------\n");
    printf("------------自由 平等 公正 法制------\n");
    printf("------------爱国 敬业 诚信 友善------\n");
    printf(" \n                自动停车场        \n");
    printf(" \n              1. 停车             \n");
    printf("              2. 提车               \n");
    printf("              3. 车场状况           \n");
    printf("              4. Exit               \n");
    printf("\n       收费标准:每分钟5分钱      \n");
    while(1)
    {
      scanf("%d",&ch);
      if(ch>=1 && ch<=4)
        break;
      else
        printf("\nPlease choose: 1|2|3|4.");
    }
    switch(ch)
    {
    case 1:
      arrival(&Enter,&Wait);//车辆到达
      system("pause");
       system("cls");
      break;
    case 2:
      leave(&Enter,&Temp,&Wait);//车辆离开
      system("pause");
       system("cls");
      break;
    case 3:
      list(Enter,Wait);//列表打印信息
      system("pause");
       system("cls");
      break;
    case 4:
        exit(0);  //退出程序
    default:
      break;
    }
  }
}

运行结果:

----------------------------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------------------------------

1需求分析……………………………………………………………………(页码) 2概要设计……………………………………………………………………(页码) 3详细设计……………………………………………………………………(页码) 4 测试与分析………………………………………………………………………(页码) 5 用户使用说明……………………………………………………………………(页码) 6.发现问题及错误分析 7总结…………………………………………………………………………………(页码)  参考文献 ……………………………………………………………………………(页码)  附录:程序源代码 …………………………………………………………………(页码) 1、需求分析:   根据题目要求,充分地分析和理解问题,描述系统的功能要求,明确问题要求做什么?以及限制条件是什么? 问题描述 随着我国人民生活水平提高和汽车工业的高速发展.越来越多的家庭拥有了汽车,但受到土地的限制,所以采用立体停车场是解决停车难的必然出路。立体停车场占地少,容量大.利用效率高;泊车与取车全自动化,省时省力,安全防盗。本文主要以两层停车场为例,设计一能完成存车与取车的停车场系统。 有一个两层的停车场, 每层有6个车位, 当第一层车停满后才允许使用第二层. ( 停车场可用一个二维数组实现, 每个数组元素存放一个车牌号 ) 每辆车的信息包括车牌号、 层号、 车位号、停车时间共4项, 其中停车时间按分钟计算 。 假设停车场初始状态为第一层已经停有4辆车, 其车位号依次为1—4 , 停车时间依次为20, 15, 10 , 5 . 即先将这四辆车的信息存入文件”car.dat”中( 数组的对应元素也要进行赋值 ) 。  停车操作:当一辆车进入停车场时, 先输入其车牌号, 再为它分配一个层号和一个车位号, 停车时间设为5 , 最后将新停入的汽车的信息添加文件”car.dat”中, 并将在此之前的所有车的停车时间加5。 收费管理(取车): 当有车离开时, 输入其车牌号, 先按其停车时间计算费用, 每5分钟0.2元. (停车费用可设置一个变量进行保存), 同时从文件”car.dat”中删除该车的信息, 并将该车对应的车位设置为可使用状态(即二维数组对应元素清零). 按用户的选择来判断是否要输出停车收费的总计。
停车场管理系统是一个常见的数据结构课程设计项目,它主要涉及到栈和队列的应用。在这个项目中,我们使用C++编程语言来实现停车场管理系统停车场管理系统的基本要求是使用栈来模拟停车场,使用队列来模拟车场外的便道。系统通过从终端读入输入数据序列来进行模拟管理。每组输入数据包括三个数据项:汽车的到达或离去信息、车牌号以及到达或离开时间。根据每组输入数据的操作,系统会输出相应的信息:如果是车辆到达,则输出汽车在停车场内或便道上的停车位置;如果是车辆离开,则输出汽车在停车场内停留的时间和应缴纳的费用。 在这个项目中,我们可以使用顺序结构来实现栈,使用链表结构来实现队列。栈用于管理停车场内的车辆,而队列用于管理车场外的便道上的车辆。 以下是一个简单的示例代码,演示了如何使用栈和队列来实现停车场管理系统: ```cpp #include <iostream> #include <stack> #include <queue> using namespace std; struct Car { string licensePlate; int arrivalTime; }; void parkCar(stack<Car>& parkingLot, queue<Car>& waitingQueue, Car car) { if (parkingLot.size() < 5) { parkingLot.push(car); cout << "Car " << car.licensePlate << " is parked at position " << parkingLot.size() << " in the parking lot." << endl; } else { waitingQueue.push(car); cout << "Car " << car.licensePlate << " is parked in the waiting queue." << endl; } } void removeCar(stack<Car>& parkingLot, queue<Car>& waitingQueue, string licensePlate, int departureTime) { bool found = false; int position = 0; // Check if the car is in the parking lot stack<Car> tempStack; while (!parkingLot.empty()) { Car car = parkingLot.top(); parkingLot.pop(); position++; if (car.licensePlate == licensePlate) { found = true; int stayTime = departureTime - car.arrivalTime; int fee = stayTime * 10; // Assume the fee is 10 per hour cout << "Car " << car.licensePlate << " stayed in the parking lot for " << stayTime << " hours and needs to pay " << fee << " yuan." << endl; break; } tempStack.push(car); } // Restore the parking lot while (!tempStack.empty()) { Car car = tempStack.top(); tempStack.pop(); parkingLot.push(car); } // If the car is not in the parking lot, check the waiting queue if (!found) { queue<Car> tempQueue; while (!waitingQueue.empty()) { Car car = waitingQueue.front(); waitingQueue.pop(); position++; if (car.licensePlate == licensePlate) { found = true; cout << "Car " << car.licensePlate << " is parked at position " << position << " in the waiting queue." << endl; break; } tempQueue.push(car); } // Restore the waiting queue while (!tempQueue.empty()) { Car car = tempQueue.front(); tempQueue.pop(); waitingQueue.push(car); } } if (!found) { cout << "Car " << licensePlate << " is not found." << endl; } } int main() { stack<Car> parkingLot; queue<Car> waitingQueue; // Simulate the parking lot management Car car1 = {"ABC123", 1}; Car car2 = {"DEF456", 2}; Car car3 = {"GHI789", 3}; parkCar(parkingLot, waitingQueue, car1); parkCar(parkingLot, waitingQueue, car2); parkCar(parkingLot, waitingQueue, car3); removeCar(parkingLot, waitingQueue, "DEF456", 5); removeCar(parkingLot, waitingQueue, "XYZ999", 6); return 0; } ``` 这个示例代码演示了如何使用栈和队列来实现停车场管理系统。在主函数中,我们首先创建了一个空的停车场和一个空的便道。然后,我们模拟了几辆车的到达和离开操作,并输出相应的信息。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值