摘要(Abstract)
Microsoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所有平台,包括Microsoft Windows、Windows Mobile、Windows CE、.NET Framework、.NET Compact Framework和Microsoft Silverlight 及Windows Phone。
Visual Studio是目前最流行的Windows平台应用程序的集成开发环境。最新版本为 Visual Studio 2019 版本,基于.NET Framework 4.5.2 。
主题(Topic)
项目(Project)
g-h-c/pct
#include "list.h" #include "subwayGlobalDef.h" #include "subwayMacro.h" #include "subwayCard.h" #include "subwayCardHistory.h" using namespace std; typedef struct { EN_CARD_TYPE enCard; unsigned int cardNo; bool usrFlag; unsigned int balance; TListHead list; SUBWAY_CARD_HIS_RECORD hisRecord; }ST_SUBWAY_CARD; ST_SUBWAY_CARD g_cardList[MAX_CARD_NUM]; TListHead g_idleCardList; TListHead g_usredCardList; //乘车卡名称 char g_cardType[EN_CARD_TYPE_BUTT + 1][16] = { "单程卡", "老年卡", "普通卡", "未知卡类型" }; /* @ 初始化卡信息 @ 返回值: 无 */ void InitCardInfo(unsigned int cardNo) { IF_INVALID_RETURN_NOVALUE(cardNo < MAX_CARD_NUM) g_cardList[cardNo].enCard = EN_CARD_TYPE_BUTT; g_cardList[cardNo].cardNo = cardNo; g_cardList[cardNo].usrFlag = false; g_cardList[cardNo].balance = 0; g_cardList[cardNo].list.next = NULL; g_cardList[cardNo].list.prev = NULL; InitSubwayCardHisRecord(&(g_cardList[cardNo].hisRecord)); } /* @ 初始化所有卡信息 @ 返回值: 无 */ void InitCardManagerInfo() { InitListHead(&g_idleCardList); InitListHead(&g_usredCardList); for(unsigned int i = 0; i < MAX_CARD_NUM; i++) { InitCardInfo(i); ListAddTail(&(g_cardList[i].list), &g_idleCardList); } InitCardHistoryPool(); } /* @ 开卡,分配卡号和卡信息 @ 入参:enCard,卡类型; charge: 充值 @ 出参: cardNo, 分配的卡号 @ 返回值: EN_RETURN_SUCC,分配成功; EN_RETURN_CARD_OVERLOW, 分配失败; */ EN_RETURN_CODE AssignCard(unsigned int &cardNo, EN_CARD_TYPE enCard, unsigned int charge) { if(ListEmpty(&g_idleCardList)) { return EN_RETURN_CARD_OVERLOW; } IF_INVALID_RETURN(charge <= MAX_BALANCE, EN_RETURN_RECHARGE_OVERFLOW) TListHead* pNode = g_idleCardList.next; ST_SUBWAY_CARD* pCard = /*lint --e(413)*/CONTAINER_OF(pNode, ST_SUBWAY_CARD, list);/*lint --e(831)*/ //从空闲队列中删除, 并加到使用队列中 ListDel(pNode); ListAddTail(pNode, &g_usredCardList); pCard->usrFlag = true; pCard->enCard = enCard; pCard->balance = charge; cardNo = pCard->cardNo; return EN_RETURN_SUCC; } /* @ 充值 @ 入参:cardNo,卡号; recharge: 充值 @ 出参: 无 @ 返回值: EN_RETURN_SUCC,成功; 其他, 失败; */ EN_RETURN_CODE RechargeCard(unsigned int cardNo, unsigned int recharge) { IF_INVALID_RETURN(cardNo < MAX_CARD_NUM, EN_RETURN_INVALID_CARD) IF_INVALID_RETURN(g_cardList[cardNo].usrFlag, EN_RETURN_INVALID_CARD) IF_INVALID_RETURN(g_cardList[cardNo].enCard != EN_CARD_TYPE_SINGLE, EN_RETURN_SINGLE_CARD_CANNOT_RECHARGE) IF_INVALID_RETURN(g_cardList[cardNo].enCard != EN_CARD_TYPE_SINGLE, EN_RETURN_SINGLE_CARD_CANNOT_RECHARGE) IF_INVALID_RETURN((g_cardList[cardNo].balance + recharge) <= MAX_BALANCE, EN_RETURN_RECHARGE_OVERFLOW) g_cardList[cardNo].balance += recharge; return EN_RETURN_SUCC; } /* @ 获取卡余额 @ 入参:cardNo,卡号; @ 出参: balance: 余额 enCard: 卡类型 @ 返回值: EN_RETURN_SUCC,成功; EN_RETURN_INVALID_CARD, 失败; */ EN_RETURN_CODE GetCardInfo(unsigned int cardNo, unsigned int &balance, EN_CARD_TYPE &enCard) { IF_INVALID_RETURN(cardNo < MAX_CARD_NUM, EN_RETURN_INVALID_CARD) IF_INVALID_RETURN(g_cardList[cardNo].usrFlag, EN_RETURN_INVALID_CARD) balance = g_cardList[cardNo].balance; enCard = g_cardList[cardNo].enCard; return EN_RETURN_SUCC; } /* @ 卡扣费 @ 入参:cardNo,卡号; enCard, 卡类型; deductPrice, 扣费票价 @ 出参: balance, 扣费后的余额 @ 返回值: EN_RETURN_SUCC,成功; EN_RETURN_INVALID_CARD, EN_RETURN_BALANCE_NOT_ENOUGH, 失败; */ EN_RETURN_CODE DeductCard(unsigned int cardNo, EN_CARD_TYPE enCard, unsigned int deductPrice, unsigned int &balance) { IF_INVALID_RETURN(cardNo < MAX_CARD_NUM, EN_RETURN_INVALID_CARD) IF_INVALID_RETURN(g_cardList[cardNo].usrFlag, EN_RETURN_INVALID_CARD) balance = g_cardList[cardNo].balance; //余额不足 IF_INVALID_RETURN(deductPrice <= balance, EN_RETURN_BALANCE_NOT_ENOUGH) //扣费 g_cardList[cardNo].balance -= deductPrice; balance = g_cardList[cardNo].balance; //单程卡要注销Card if(EN_CARD_TYPE_SINGLE == enCard) { (void)DeleteCard(cardNo); } //余额过低 IF_INVALID_RETURN((EN_CARD_TYPE_SINGLE == enCard) || (balance >= 20), EN_RETURN_BALANCE_TOO_LOW) return EN_RETURN_SUCC; } void RecordCardHis(unsigned int cardNo, ST_SUBWAY_TIME& enterTime, ST_SUBWAY_TIME& exitTime, char* enterStation, char* exitStation, unsigned int ulExpenditure) { IF_INVALID_RETURN_NOVALUE(cardNo < MAX_CARD_NUM) IF_INVALID_RETURN_NOVALUE(g_cardList[cardNo].usrFlag) if(EN_RETURN_SUCC != AddSubwayCardHisRecord(&(g_cardList[cardNo].hisRecord), enterTime, exitTime, enterStation, exitStation, ulExpenditure)) { cout<<"RecordCardHis::AddSubwayCardHisRecord return fail!"; } } void QuerySubwayCardHis(unsigned int cardNo, string& outStr) { IF_INVALID_RETURN_NOVALUE(cardNo < MAX_CARD_NUM) IF_INVALID_RETURN_NOVALUE(g_cardList[cardNo].usrFlag) QuerySubwayCardHisRecord(&(g_cardList[cardNo].hisRecord), outStr); } /* @ 删除卡信息 @ 入参:cardNo,卡号; @ 出参: 无 @ 返回值: 0,成功; -1, 失败; */ int DeleteCard(unsigned int cardNo) { IF_INVALID_RETURN(cardNo < MAX_CARD_NUM, -1) IF_INVALID_RETURN(g_cardList[cardNo].usrFlag, -1) //从使用队列中删除, 并加到空闲队列中 TListHead* pNode = &(g_cardList[cardNo].list); ListDel(pNode); ListAddTail(pNode, &g_idleCardList); InitCardInfo(cardNo); return 0; } /* @ 获取卡类型字符串 @ 入参:enCard,卡类型; @ 出参: 无 @ 返回值: 卡类型字符串; */ char* GetCardTypeStr(EN_CARD_TYPE enCard) { return g_cardType[enCard]; } /* @ 根据卡类型字符串, 识别卡类型 @ 入参:cardType, 卡类型字符串; @ 出参: enCard, 卡类型 @ 返回值: EN_RETURN_SUCC,成功; EN_RETURN_INPUT_INVALID_CARDTYPE, 失败; */ EN_RETURN_CODE GetCardType(char cardType[], EN_CARD_TYPE &enCard) { string str = cardType; /* 目前仅支持普通卡 */ if((0 == str.compare("C")) || (0 == str.compare("c"))) { enCard = EN_CARD_TYPE_NOMAL; } else if((0 == str.compare("B")) || (0 == str.compare("b"))) { enCard = EN_CARD_TYPE_ELDER; } else { return EN_RETURN_INPUT_INVALID_CARDTYPE; } return EN_RETURN_SUCC; }" class="topic-tag topic-tag-link">
awfeequdng/SubWayCard.CPP