管理

Parkingsys.cpp
#include <stdio.h>
#include <string.h>
#include "list.h"
#include "api.h"

typedef struct {
 ParkingAutoInfo info;
 bool isInSys;     //是否在车库中
 bool isValidNo;     //是否为套牌车
}CarInfo_ST; 

/*全局变量声明*/
ParkingHisInfoNode * hisInfo;     //历史信息链表
CardStatus PackingCard[CARD_COUNT];    //停车卡

ParkSysTime sysTime;       //系统时间
CarInfo_ST carInfo[11];       //车信息,包含车牌号,以及其停车次数

void main(int argc, char* argv[])
{
 hisInfo = NULL;
 sysTime.hh = 0;
 sysTime.mm = 0;
 apiServerStart(argc,argv);
}

void OpReset(void)
{
 int i=0;
 for(i=0;i<CARD_COUNT;i++)
 {
  PackingCard[i] = CARD_IDLE;
 }
 if(NULL == hisInfo)
  hisInfo = initList();
 else
 {
  resetList(hisInfo);
  hisInfo = initList();
 }
 for(i =0;i<11;i++)
 {
  carInfo[i].info.ParkingCount = 0;
  carInfo[i].isInSys = false;
  carInfo[i].info.AutoNo = 0;
  carInfo[i].info.CardNo = 5;
  carInfo[i].isValidNo = false;
 }
 sysTime.hh = 0;
 sysTime.mm = 0; 
 api_parksys_ret(OP_RESET_SUCC);
}

/*****************************************************************************
函 数 名  : OpGetin
功能描述  : 需要考生实现的接口,车辆进入停车场
输入参数  : UL AutoNo 车牌号
ParkSysAutoType AutoType 车辆类型
ParkSysTime InTime 车辆进入停车场时间
*****************************************************************************/
void OpGetin(UL AutoNo, ParkSysAutoType AutoType, ParkSysTime InTime)
{
 if(hisInfo == NULL)
 {
  api_parksys_ret(OP_INTERNAL_ERR);
  return;
 }
 int idx = 0;
 int cardIdx = 0;
 bool isIdle = false;
 if((AutoNo < 10 || AutoNo > 20) ||      
    (AutoType != CAR && AutoType != BUS) ||
    (InTime.hh < 0 || InTime.hh > 23) ||
    (InTime.mm < 0 || InTime.mm > 59))  //参数合法性判断
 {
  api_parksys_ret(OP_E_PARAMETER);
  return;
 }
 if(InTime.hh < sysTime.hh || ( InTime.hh == sysTime.hh && InTime.mm < sysTime.mm ))  //时间逻辑错误
 {
  api_parksys_ret(OP_E_TIME_LOGIC);
  return;
 }
 for(idx;idx<CARD_COUNT;idx++)      //判断车位是否满
 {
  if(CARD_IDLE == PackingCard[idx])
  {
   isIdle = true;
   cardIdx = idx;
   break;
  } 
 }
 if(!isIdle)
 {
  api_parksys_ret(OP_E_PARKING_FULL);
  return;
 }
 for(idx = 0;idx <11;idx++)       
 {
  if(AutoNo == carInfo[idx].info.AutoNo)   //车信息已经存在
  {
   if(carInfo[idx].isInSys)     //判断车是否已经在车位
   {
    api_parksys_ret(OP_E_EXISTED_ATUO);
    return;
   }
   if(carInfo[idx].isValidNo)     //该车牌之前已经判断为套牌车
   {
    api_parksys_ret(OP_E_MISMATCH_AUTO_TYPE);
    return; 
   }
   if(carInfo[idx].info.AutoType!= AutoType) //判断是否前后车类型不同,为套牌车
   {
    api_parksys_ret(OP_E_MISMATCH_AUTO_TYPE);
    carInfo[idx].isValidNo = true;
    deleteItemWithAutoNo(hisInfo,AutoNo);
    return;
   }
   PackingCard[cardIdx] = CARD_INUSE;
   carInfo[idx].isInSys = true;
   carInfo[idx].info.CardNo = cardIdx;
   carInfo[idx].info.CurGetInTime = InTime;
   carInfo[idx].info.ParkingCount++;
   sysTime = InTime;
   api_parksys_ret(OP_PARKING_SUCC);

   ParkingAutoHistoryInfo info;
   info.AutoNo = carInfo[idx].info.AutoNo;
   info.AutoType = carInfo[idx].info.AutoType;
   info.CardNo = carInfo[idx].info.CardNo;
   info.Fee = 0;
   info.GetInTime = InTime;
   info.GetOutTime.hh = 99;
   info.GetOutTime.mm = 99;
   insertItem(hisInfo,info);

   return;
  }
 }
 for(idx=0;idx<11;idx++)
 {
  if(0 == carInfo[idx].info.AutoNo)
  {
   PackingCard[cardIdx] = CARD_INUSE; 
   carInfo[idx].info.AutoNo = AutoNo;
   carInfo[idx].isInSys = true;
   carInfo[idx].isValidNo = false;
   carInfo[idx].info.AutoType = AutoType;
   carInfo[idx].info.CardNo = cardIdx;
   carInfo[idx].info.CurGetInTime = InTime;
   carInfo[idx].info.ParkingCount ++;
   sysTime = InTime;
   api_parksys_ret(OP_PARKING_SUCC);

   ParkingAutoHistoryInfo info;
   info.AutoNo = carInfo[idx].info.AutoNo;
   info.AutoType = carInfo[idx].info.AutoType;
   info.CardNo = carInfo[idx].info.CardNo;
   info.Fee = 0;
   info.GetInTime = InTime;
   info.GetOutTime.hh = 99;
   info.GetOutTime.mm = 99;
   insertItem(hisInfo,info);

   return;
  }
 }
}

/*计算停车费函数*/
int cost(ParkSysTime inTime,ParkSysTime outTime,ParkSysAutoType AutoType)
{
 int inTimeSum = inTime.hh*60+inTime.mm;
 int outTimeSum = outTime.hh*60+outTime.mm;
 int time = outTimeSum - inTimeSum;

 if(time <= 30)
  return 0;
 if(time <= 120)
 {
  if(AutoType == CAR)
   return 10;
  return 20;
 }
 if(time > 12*60)
 {
  if(CAR == AutoType)
   return 20;
  return 30;
 }
 time -= 120;
 int i = time/60;
 int j = time%60;
 if( j != 0)
  i++;
 if(CAR == AutoType)
  return 10+i;
 return 20+i;
}


/*****************************************************************************
函 数 名  : OpGetout
功能描述  : 需要考生实现的接口,车辆离开停车场
输入参数  : UL AutoNo 车牌号
UL CardNo 卡号
ParkSysTime OutTime 车辆离开停车场时间
*****************************************************************************/
void OpGetout(UL AutoNo, UL CardNo, ParkSysTime OutTime)
{
 if(hisInfo == NULL)
 {
  api_parksys_ret(OP_INTERNAL_ERR);
  return;
 }
 if((AutoNo <10 || AutoNo > 20) || 
    (CardNo <0 || CardNo >4) ||
    (OutTime.hh < 0 || OutTime.hh > 23) ||
    (OutTime.mm < 0 || OutTime.mm > 59))  //参数合法性判断
 {
  api_parksys_ret(OP_E_PARAMETER);
  return;    
 }
 if(OutTime.hh < sysTime.hh || ( OutTime.hh == sysTime.hh && OutTime.mm < sysTime.mm ))  //时间逻辑错误
 {
  api_parksys_ret(OP_E_TIME_LOGIC);
  return;
 }
 int idx = 0;
 int carIdx = 0;
 bool isInSys = false;
 for(idx = 0;idx<11;idx++)
 {
  if(carInfo[idx].info.AutoNo == AutoNo && carInfo[idx].isInSys)
  {
   carIdx = idx;
   isInSys = true;
   break;
  }  
 }
 if(!isInSys)
 {
  api_parksys_ret(OP_E_NOT_IN_PARKING);
  return;
 }
 if(carInfo[carIdx].info.AutoNo != AutoNo || carInfo[carIdx].info.CardNo != CardNo)
 {
  api_parksys_ret(OP_E_AUTONO_MISMATCH_CARDNO);
  return;
 }
 sysTime = OutTime;
 int fee = cost(carInfo[carIdx].info.CurGetInTime,OutTime,carInfo[carIdx].info.AutoType);
 api_parksys_fee(fee);
 carInfo[carIdx].isInSys = false;
 carInfo[carIdx].info.CardNo = 5;
 PackingCard[CardNo] = CARD_IDLE;

 updateItem(hisInfo,carInfo[carIdx].info.AutoNo,carInfo[carIdx].info.CurGetInTime,fee,OutTime);

 return;
}

/*****************************************************************************
函 数 名  : OpListIdleParkingSpaceNumber
功能描述  : 需要考生实现的接口,停车场空闲车位查询
*****************************************************************************/
void OpListIdleParkingSpaceNumber(void)
{
 UL sum = 0;
 int idx = 0;
 for(idx=0;idx<CARD_COUNT;idx++)
 {
  if(PackingCard[idx] == CARD_IDLE)
   sum++;
 }
 api_parksys_idle_parkingspace_number(sum);
}

/*****************************************************************************
函 数 名  : OpListCardStatus
功能描述  : 需要考生实现的接口,指定卡状态查询
输入参数  : UL CardNo 卡号
void OpListCardStatus(UL CardNo)
{
 if(CardNo <0 || CardNo >4)
 {
  api_parksys_ret(OP_E_PARAMETER); 
  return;
 }
 if(PackingCard[CardNo] == CARD_IDLE)
 {
  api_parksys_card_status(CARD_IDLE);
  return;
 }
 api_parksys_card_status(CARD_INUSE);
 return;
}
函 数 名  : OpListParkingAuto
功能描述  : 需要考生实现的接口,停车场中指定车辆信息查询
输入参数  : UL AutoNo 车牌号
***********************************************************
void OpListParkingAuto(UL AutoNo)
{
 if(AutoNo <10 || AutoNo >20)
 {
  api_parksys_ret(OP_E_PARAMETER); 
  return;
 }
 bool isInSys = false;
 int idx = 0;
 for(idx =0 ;idx <11;idx++)
 {
  if(carInfo[idx].info.AutoNo == AutoNo)
  {
   if(carInfo[idx].isInSys == true)
   {
    isInSys = true;
    break;
   }
  }
 }
 if(!isInSys)
 {
  api_parksys_ret(OP_E_NOT_IN_PARKING);
  return;
 }
 api_parksys_parking_auto(&carInfo[idx].info);
 return;
}


List.cpp
#include "list.h"
#include <stdlib.h>
#include <memory.h>

ParkingHisInfoNode* initList()
{
 ParkingHisInfoNode * head;
 head = (ParkingHisInfoNode*)malloc(sizeof(ParkingHisInfoNode));
 if(NULL == head)
  return NULL;
 memset(head,0,sizeof(ParkingHisInfoNode));
 head->pNext = NULL;
 return head;
}

bool insertItem(ParkingHisInfoNode* hisInfo,ParkingAutoHistoryInfo dataItem)
{
 ParkingHisInfoNode *pTemp;
 ParkingHisInfoNode *pTempData;
 if(NULL == hisInfo)
  return false;
 pTemp = hisInfo;
 while(pTemp ->pNext != NULL && pTemp->pNext->data.AutoNo < dataItem.AutoNo)
  pTemp = pTemp->pNext;
 pTempData = (ParkingHisInfoNode*)malloc(sizeof(ParkingHisInfoNode));
 if(NULL == pTempData)
  return false;
 pTempData->data = dataItem;
 pTempData->pNext = pTemp->pNext;
 pTemp->pNext = pTempData;
 return true;
}

void resetList(ParkingHisInfoNode * hisInfo)
{
 ParkingHisInfoNode *pTemp;
 while(hisInfo != NULL)
 {
  pTemp = hisInfo->pNext;
  free(hisInfo);
  hisInfo = pTemp;
 }
}

bool deleteItemWithAutoNo(ParkingHisInfoNode * hisInfo,UL AutoNo)
{
 bool ret = false;
 if(NULL == hisInfo)
  return false;
 ParkingHisInfoNode * pTemp = NULL;
 ParkingHisInfoNode * pTempTail = NULL;
 pTemp = hisInfo;
 while(pTemp != NULL && pTemp->pNext != NULL)
 {
  if(pTemp->pNext->data.AutoNo == AutoNo)
  {
   pTempTail = pTemp->pNext->pNext;
   free(pTemp->pNext);
   pTemp->pNext = pTempTail;
   if(!ret)
    ret = true;
  }
  pTemp = pTemp->pNext;
 }
 return ret;

}

void updateItem(ParkingHisInfoNode* hisInfo,UL AutoNo,ParkSysTime inTime,UL fee,ParkSysTime outTime)
{
 if(hisInfo == NULL)
  return;
 ParkingHisInfoNode *pTemp;
 pTemp = hisInfo->pNext;
 bool flag = false;
 while(pTemp != NULL)
 {
  if(pTemp->data.AutoNo == AutoNo && pTemp->data.GetInTime.hh == inTime.hh && pTemp->data.GetInTime.mm == inTime.mm)
  {
   flag = true;
   break;
  }
  else
  {
   if(pTemp->pNext != NULL)
    pTemp = pTemp->pNext;
   else
    break;
  }
 }
 if(!flag)
  return;
 pTemp->data.Fee = fee;
 pTemp->data.GetOutTime = outTime;
}


List.h

#ifndef __LIST_H__
#define __LIST_H__
#include "api.h"

typedef struct ParkingHisInfoNode
{
 ParkingAutoHistoryInfo    data;
 struct ParkingHisInfoNode * pNext;
}ParkingHisInfoNode;


ParkingHisInfoNode* initList();
bool insertItem(ParkingHisInfoNode* hisInfo,ParkingAutoHistoryInfo dataItem);
void resetList(ParkingHisInfoNode * hisInfo);
bool deleteItemWithAutoNo(ParkingHisInfoNode * hisInfo,UL AutoNo);
void updateItem(ParkingHisInfoNode* hisInfo,UL AutoNo,ParkSysTime inTime,UL fee,ParkSysTime outTime);


#endif

Api.h
#ifndef __API_H__
#define __API_H__

#ifdef __cplusplus
extern "C"{
#endif /* __cplusplus */

#define CARD_COUNT   5       //卡的数量
#define MIN_AUTONO   10      //最小车牌号
#define MAX_AUTONO   20      //最大车牌号

typedef unsigned char UC;
typedef unsigned long UL;

//汽车类型
typedef enum
{
    CAR,     //小轿车
    BUS,     //大巴
    AUTO_TYPE_BUTT,
}ParkSysAutoType;

//卡状态
typedef enum
{
    CARD_IDLE  = 0,  //卡空闲
    CARD_INUSE = 1,  //卡已经使用
}CardStatus;

//操作码定义
typedef enum
{
    OP_E_CMD                    = 0,  //(考生不使用)无效的命令
    OP_RESET_SUCC               = 1,  //系统初始化成功
    OP_E_PARAMETER              = 2,  //参数不合法
    OP_E_PARKING_FULL           = 3,  //车位已满
    OP_E_EXISTED_ATUO           = 4,  //该车已经在停车场
    OP_E_MISMATCH_AUTO_TYPE     = 5,  //可能是套牌车不允许进入
    OP_E_NOT_IN_PARKING         = 6,  //该车不在停车场
    OP_E_AUTONO_MISMATCH_CARDNO = 7,  //车牌号和卡号不对应不允许离开
    OP_E_TIME_LOGIC             = 8,  //时间逻辑错误
    OP_PARKING_SUCC             = 9,  //停车操作成功
    OP_SPEC_CAR_PARKING         = 10, //指定的车辆在停车场内尚未停过
    OP_ANY_CAR_PAKING           = 11, //停车场内尚未有任何车辆停过
    OP_INTERNAL_ERR             =999, //内部系统错误
}ParkSysOpRet;

//时间
typedef struct
{
    UC hh;  //小时
    UC mm;  //分钟
}ParkSysTime;

//在停车场中的车辆信息
typedef struct
{
    UL              AutoNo;       //车牌号
    ParkSysTime     CurGetInTime; //当前进入时间
    UL              CardNo;       //卡号
    ParkSysAutoType AutoType;     //车型
    UC              ParkingCount; //停车次数
}ParkingAutoInfo;

//停车场中车辆历史停车信息
typedef struct
{
    UL              AutoNo;       //车牌号
    ParkSysAutoType AutoType;     //车辆类型
    UL              CardNo;       //卡号
    ParkSysTime     GetInTime;    //停车时间
    ParkSysTime     GetOutTime;   //取车时间
    UL              Fee;          //停车费用
}ParkingAutoHistoryInfo;

/*****************************************************************************
 函 数 名  : api_parksys_ret
 功能描述  : 系统提供的函数,供考生调用,打印操作结果信息
 输入参数  : ParkSysOpRet OpRet操作码定义
 
*****************************************************************************/
void api_parksys_ret(ParkSysOpRet OpRet);

/*****************************************************************************
 函 数 名  : api_parksys_fee
 功能描述  : 系统提供的函数,供考生调用,车辆离开停车场后收取的费用
 输入参数  : UL fee当次停车收取的费用
 
*****************************************************************************/
void api_parksys_fee(UL fee);

/*****************************************************************************
 函 数 名  : api_parksys_idle_parkingspace_number
 功能描述  : 系统提供的函数,供考生调用,停车场空闲车位查询结果
 输入参数  : UL number空闲车位数
*****************************************************************************/
void api_parksys_idle_parkingspace_number(UL number);

/*****************************************************************************
 函 数 名  : api_parksys_card_status
 功能描述  : 系统提供的函数,供考生调用,指定卡状态查询结果
 输入参数  : CardStatus cardStatus指定卡状态
 
*****************************************************************************/
void api_parksys_card_status(CardStatus cardStatus);

/*****************************************************************************
 函 数 名  : api_parksys_parking_auto
 功能描述  : 系统提供的函数,供考生调用,停车场中指定车辆信息查询结果
 输入参数  : ParkingAutoInfo *pAutoInfo停车场中指定车辆信息
 
*****************************************************************************/
void api_parksys_parking_auto(ParkingAutoInfo *pAutoInfo);

/*****************************************************************************
 函 数 名  : api_parksys_parking_auto_history_info
 功能描述  : 系统提供的函数,供考生调用,停车场中指定车辆信息查询结果
 输入参数  : ParkingAutoHistoryInfo *pAutoHistoryInfo停车场中历史车辆停车信息
 
*****************************************************************************/
void api_parksys_parking_auto_history_info(ParkingAutoHistoryInfo *pAutoHistoryInfo);


/*****************************************************************************
void OpReset(void);

void OpGetin(UL AutoNo, ParkSysAutoType AutoType, ParkSysTime InTime);

void OpGetout(UL AutoNo, UL CardNo, ParkSysTime OutTime);

void OpListIdleParkingSpaceNumber(void);

void OpListCardStatus(UL CardNo);

void OpListParkingAuto(UL AutoNo);

void OpListParkingAutoHistoryInfo(UL AutoNo);

#ifdef __cplusplus
}
#endif /* __cplusplus */

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值