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 */