为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

车辆违规vc

2017-09-01 33页 doc 63KB 21阅读

用户头像

is_637320

暂无简介

举报
车辆违规vc车辆违规vc //car.cpp #include #include "stdio.h" #include "api.h" #include "car.h" /*违规类型对应的罚款和扣分*/ PeccancyRule Rule[]= { {100,1}, //违规类型0 {200,2}, //违规类型1 {300,3}, //违规类型2 {400,4}, //违规类型3 {500,5}, //违规类型4 {0,0} //BUTT值 }; CarInfo stCarInfo; //车辆信息全局记...
车辆违规vc
车辆违规vc //car.cpp #include #include "stdio.h" #include "api.h" #include "car.h" /*违规类型对应的罚款和扣分*/ PeccancyRule Rule[]= { {100,1}, //违规类型0 {200,2}, //违规类型1 {300,3}, //违规类型2 {400,4}, //违规类型3 {500,5}, //违规类型4 {0,0} //BUTT值 }; CarInfo stCarInfo; //车辆信息全局 int CurrentDays; //当前操作时间 bool IsSystemInit=false; //系统初始化标志 int g_iGlobalIndex = 0; //记录录入的违规记录数全局序号 AutoHistoryNodeTypeInfo *g_pAutoHistoryInfoHead = NULL; //车辆历史信息指针头 void main(int argc, char* argv[]) { /* 启动Socket服务侦听5555端口(sapi_server_start函数在lib库已实现)。 * lib库已实现从Socket接收到字符串后的命令分发处理; * 考生只需要实现分发后的各命令即可。 */ api_server_start(argc, argv); // 此处不会执行到,注意不要在此处添加代码 } /***************************************************************************** 函 数 名 : opInit 功能描述 : 考生需要实现的接口 完成“系统初始化”操作 命令实例:i 输入参数 : 无 输出参数 : 无 返 回 值 : 无 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2010年1月21日 作 者 : 修改内容 : 新生成函数 *****************************************************************************/ void opInit(void) { //恢复车牌未吊销标志 stCarInfo.WithdrawFlag = false; //恢复车辆积分初始值 stCarInfo.Score = MAX_SCORE_VALUE; //车辆违规记录数清空 stCarInfo.RecordNum = 0; //清空历史违规记录 memset(stCarInfo.Record, 0, (sizeof(PeccancyRecord) * MAX_PECCANCY_RECORD_NUM)); //当前时间清0 CurrentDays = 0; //置系统初始化标志位true IsSystemInit = true; //录入的全局违规序号清0 g_iGlobalIndex = 0; //清空车辆历史违规信息记录 --xhj if (NULL != g_pAutoHistoryInfoHead) { if (RET_SUCC != RemoveList(g_pAutoHistoryInfoHead)) { api_print_result(E999); return; } g_pAutoHistoryInfoHead = NULL; } //创建空链表用于存储历史违规信息 g_pAutoHistoryInfoHead = CreateList(); if (NULL == g_pAutoHistoryInfoHead) { api_print_result(E999); return; } //初始化成功 api_print_result(S001); return; } /***************************************************************************** 函 数 名 : opRecord 功能描述 : 考生需要实现的接口 完成“录入违规记录”操作 命令实例:r 0-1 输入参数 : int Peccancy : 违规类型 int Days : 时间 输出参数 : 无 返 回 值 : 无 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2010年1月21日 作 者 : 修改内容 : 新生成函数 *****************************************************************************/ void opRecord(int PeccancyType, int Days) { QueryResult stOneCarInfo = { 0 }; //系统尚未初始化 if (IsSystemInit == false) { api_print_result(E001); return; } //输入的违规类型不合法 if ((PeccancyType < PECCANCY_TYPE_0) || (PECCANCY_TYPE_4 < PeccancyType)) { api_print_result(E003); return; } //输入的时间不合法 if ((Days <= 0) || (MAX_DAYS_VALUE < Days)) { api_print_result(E002); return; } //输入的时间小于当前时间 if (Days < CurrentDays) { api_print_result(E008); return; } //尚未缴费的违规记录已满 if (MAX_PECCANCY_RECORD_NUM <= stCarInfo.RecordNum) { api_print_result(E009); return; } //车牌已经吊销 if (stCarInfo.WithdrawFlag == true) { api_print_result(E004); return; } //记录违规信息到车辆信息统计表中 stCarInfo.Record[stCarInfo.RecordNum].PeccancyType = PeccancyType; stCarInfo.Record[stCarInfo.RecordNum].Days = Days; stCarInfo.Record[stCarInfo.RecordNum].fee = Rule[PeccancyType].Fee; //如果此次违规所扣积分大于剩余积分,积分直接清0,置车牌吊销 if (Rule[PeccancyType].Score >= stCarInfo.Score) { stCarInfo.WithdrawFlag = true; stCarInfo.Score = 0; } else { stCarInfo.Score = stCarInfo.Score - Rule[PeccancyType].Score; } //违规序号默认从1开始,0为无效 g_iGlobalIndex++; stCarInfo.Record[stCarInfo.RecordNum].PeccancyGlobalIndex = g_iGlobalIndex; if (true == stCarInfo.WithdrawFlag) { //车牌吊销,清空历史所有违规记录信息 --xhj if (RET_SUCC != RemoveList(g_pAutoHistoryInfoHead)) { api_print_result(E999); return; } //违规记录数清空 g_iGlobalIndex = 0; g_pAutoHistoryInfoHead = NULL; } else { //添加违规记录到历史违规信息列表中 --xhj stOneCarInfo.Index = g_iGlobalIndex; stOneCarInfo.stCarSysInfo.Reason = stCarInfo.Record[stCarInfo.RecordNum].PeccancyType; stOneCarInfo.stCarSysInfo.Time = stCarInfo.Record[stCarInfo.RecordNum].Days; stOneCarInfo.Fee = stCarInfo.Record[stCarInfo.RecordNum].fee; stOneCarInfo.PayFlag = STAT_NO_PAY; stOneCarInfo.Score = stCarInfo.Score; if (NULL == Insert2ListTail(g_pAutoHistoryInfoHead, &stOneCarInfo)) { api_print_result(E999); return; } } //记录违规次数及当前时间? stCarInfo.RecordNum++; CurrentDays = Days; api_print_result(S002); return; } /***************************************************************************** 函 数 名 : opQuery 功能描述 : 考生需要实现的接口 完成查询违规记录操作 命令实例:q 输入参数 : 无 输出参数 : 无 返 回 值 : 无 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2010年1月21日 作 者 : 修改内容 : 新生成函数 *****************************************************************************/ void opQuery(void) { //系统尚未初始化 if (IsSystemInit == false) { api_print_result(E001); return; } if (true == stCarInfo.WithdrawFlag) { api_print_result(E004); return; } //无任何违规记录 if ((0 == g_iGlobalIndex) || (NULL == g_pAutoHistoryInfoHead)) { api_print_result (E010); return; } //打印历史违规信息到socket --xhj AutoHistoryNodeTypeInfo *pNode = NULL; pNode = g_pAutoHistoryInfoHead->pNext; while (NULL != pNode) { api_print_query_info(&(pNode->data)); pNode = pNode->pNext; } return; } /***************************************************************************** 函 数 名 : opPay 功能描述 : 考生需要实现的接口 完成缴纳违规罚款操作 命令实例:p 100 输入参数 : int Money : 缴纳金额 输出参数 : 无 返 回 值 : 无 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2010年1月21日 作 者 : 修改内容 : 新生成函数 *****************************************************************************/ void opPay(int Money) { PayResult stResult; int i; int TmpMoney; //系统尚未初始化 if (IsSystemInit == false) { api_print_result(E001); return; } //输入的金额不合法 if ((Money <= 0) || (MAX_MONEY_VALUE < Money)) { api_print_result(E005); return; } //无违规记录,缴纳无效 if (stCarInfo.RecordNum == 0) { api_print_result(E007); return; } //车牌已经吊销 if (stCarInfo.WithdrawFlag == true) { api_print_result(E004); return; } //计算费用 TmpMoney = Money; opPayFee(&TmpMoney); //缴费失败 if (TmpMoney == Money) { api_print_result(E006); return; } //输出缴费结果 stResult.Fee = 0; for (i = 0; i < stCarInfo.RecordNum; i++) { stResult.Fee = stResult.Fee + stCarInfo.Record[i].fee; } stResult.ReturnMoney = TmpMoney; stResult.PeccancyNo = stCarInfo.RecordNum; stResult.Score = stCarInfo.Score; api_print_pay_info(&stResult); return; } void opPayFee(int *pMoney) { int i; //遍历付费金额和违规罚款金额 for (i = 0; i < stCarInfo.RecordNum;) { if (stCarInfo.Record[i].fee <= *pMoney) { //处理一条缴费记录 opPayLargeFeeOnSameDay(pMoney, i); } else { i++; } } return; } void opPayLargeFeeOnSameDay(int *pMoney, int i) { int j; int MaxFeefee, CurFeefee; int RecordNum; int iTempMoney; AutoHistoryNodeTypeInfo *pNode = NULL; iTempMoney = *pMoney; MaxFeefee = stCarInfo.Record[i].fee; RecordNum = i; //遍历是否有相同一天的记录 for ( j = i + 1; j < stCarInfo.RecordNum; j++) { if(stCarInfo.Record[j].Days == stCarInfo.Record[i].Days) { CurFeefee = stCarInfo.Record[j].fee; if((MaxFeefee < CurFeefee) && (CurFeefee <= iTempMoney)) { RecordNum = j; MaxFeefee = CurFeefee; } } } *pMoney = iTempMoney - stCarInfo.Record[RecordNum].fee; //缴费失败,不再处理 if (*pMoney == iTempMoney) { return; } //刷新历史记录表 --xhj pNode = FindNodeByGlobalIndex (g_pAutoHistoryInfoHead, stCarInfo.Record[RecordNum].PeccancyGlobalIndex); if (NULL == pNode) { api_print_result(E999); return; } pNode->data.PayFlag = STAT_HAVE_PAY; //清空已缴费记录 opDeleteRecord(RecordNum); stCarInfo.RecordNum = stCarInfo.RecordNum -1; return; } void opDeleteRecord(int i) { int j; //把未缴费记录前移,同时清空已缴费记录 for( j = i; j < (stCarInfo.RecordNum - 1); j++) { memcpy(&stCarInfo.Record[j], &stCarInfo.Record[j+1], sizeof(PeccancyRecord)); } memset(&stCarInfo.Record[stCarInfo.RecordNum -1], 0, sizeof(PeccancyRecord)); } //list.cpp #include #include "api.h" #include "car.h" #include "malloc.h" /************************************************* Function : CreateList Description : 创建链表头节点 Return : 链表的头指针 *************************************************/ AutoHistoryNodeTypeInfo* CreateList(void) { AutoHistoryNodeTypeInfo *pHead = NULL; //的头指针 pHead = (AutoHistoryNodeTypeInfo *)malloc(sizeof(AutoHistoryNodeTypeInfo)); //判断是否申请成功 if (NULL == pHead) { return NULL; } pHead->data.Index = 0; pHead->pNext = NULL; return pHead; } /************************************************* Function : FindNodeByGlobalIndex Description : 根据指定参数,查找某个节点 Input : pHead 链表的头节点指针 要查找的学生ID Return : 正确:返回指定节点的指针 失败:返回空指针 *************************************************/ AutoHistoryNodeTypeInfo* FindNodeByGlobalIndex(AutoHistoryNodeTypeInfo *pHead, int iGlobalIndex) { AutoHistoryNodeTypeInfo *pNode = NULL; if ((NULL == pHead) || (iGlobalIndex < 0)) { return NULL; } pNode = pHead->pNext; while ((NULL != pNode)) { if (pNode->data.Index == iGlobalIndex) { break; } pNode = pNode->pNext; } return pNode; } /************************************************* Function : Insert2ListTail Description : 向链表中尾部插入某个节点 Input : pHead 链表的头节点指针 pStudentInfo 学生信息 Return : 正确:返回头节点指针 失败:返回空指针 *************************************************/ AutoHistoryNodeTypeInfo* Insert2ListTail(AutoHistoryNodeTypeInfo *pHead, QueryResult *pAutoInfo) { AutoHistoryNodeTypeInfo* pNode = NULL; AutoHistoryNodeTypeInfo* pNewNode = NULL; if ((NULL == pHead) || (NULL == pAutoInfo)) { return NULL; } pNode = pHead; while (pNode->pNext != NULL) { pNode = pNode->pNext; } pNewNode = (AutoHistoryNodeTypeInfo *)malloc(sizeof(AutoHistoryNodeTypeInfo)); if (NULL == pNewNode) { return NULL; } pNode->pNext = pNewNode; pNewNode->pNext = NULL; memcpy(&(pNewNode->data), pAutoInfo, sizeof(QueryResult)); return pHead; } /************************************************* Function : RemoveList Description : 删除整个链表 Input : pHead 链表的头节点指针 Return : 正确: RET_SUCC 失败: RET_FAILURE *************************************************/ int RemoveList(AutoHistoryNodeTypeInfo *pHead) { AutoHistoryNodeTypeInfo *pNode = NULL; AutoHistoryNodeTypeInfo *pb = NULL; if (NULL == pHead) { return RET_FAILURE; } pNode = pHead; pb = pNode->pNext; if (NULL == pb) { free(pNode); } else { while (NULL != pb) { free(pNode); pNode = pb; pb = pb->pNext; } free(pNode); } pNode = NULL; return RET_SUCC; } //API.CPP /****************************************************************************** 版权所有 (C), 2009-2009, 华为技术有限公司 ****************************************************************************** 文 件 名 : api.h 版 本 号 : 初稿 作 者 : 生成日期 : 2009年9月9日 最近修改 : 功能描述 : api.cpp 的头文件 函数列表 : 修改历史 : 1.日 期 : 2009年9月9日 作 者 : 修改内容 : 创建文件 ******************************************************************************/ #ifndef __API_H__ #define __API_H__ #ifdef __cplusplus extern "C"{ #endif /* __cplusplus */ /** 本文件中的枚举、结构、API接口等供考生使用,但不允许修改 **/ //返回操作信息 enum OP_RST_INFO { S001, //初始化成功 S002, //录入违规记录成功 E001, //系统未初始化 E002, //输入时间超出系统允许范围 E003, //输入违规类型超出系统允许范围 E004, //车牌已吊销,操作失败 E005, //输入缴纳金额超出系统允许范围 E006, //缴纳动作无效 E007, //无违规记录,不需要缴纳罚款 E008, //时间参数小于上次操作时间 E009, //违规记录已满 E010, //无违规记录 E999 //系统内部错误 }; //车辆违规信息 typedef struct CAR_SYS_INFO { int Time; //违规时间 int Reason; //违规原因 }CarSysInfo; //历史违规信息 typedef struct QUERY_RESULT { int Index; //历史违规序号 CarSysInfo stCarSysInfo; //车辆违规信息 int Fee; //总罚款金额 enum enPayStat PayFlag; //罚款是否已经缴纳 int Score; //剩余积分 }QueryResult; //缴纳罚款输出信息 typedef struct PAY_RESULT { int ReturnMoney; //找零 int Score; //剩余积分 int PeccancyNo; //剩余违规记录数 int Fee; //剩余罚款金额 }PayResult; /***************************************************************************** 函 数 名 : api_print_result 功能描述 : 打印返回码信息到socket工具窗口 输入参数 : enum OP_RST_INFO enResultCode 输出参数 : 无 返 回 值 : extern void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2010年1月21日 作 者 : 修改内容 : 新生成函数 *****************************************************************************/ void api_print_result(enum OP_RST_INFO enResultCode); /***************************************************************************** 函 数 名 : api_print_query_info 功能描述 : 打印查询信息到socket工具窗口 输入参数 : QueryResult *pResult 输出参数 : 无 返 回 值 : extern void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2010年1月21日 作 者 : 修改内容 : 新生成函数 *****************************************************************************/ void api_print_query_info(QueryResult *pResult); /***************************************************************************** 函 数 名 : api_print_pay_info 功能描述 : 打印缴纳信息到socket工具窗口 输入参数 : PayResult *pResult 输出参数 : 无 返 回 值 : extern void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2010年1月21日 作 者 : 修改内容 : 新生成函数 *****************************************************************************/ void api_print_pay_info(PayResult *pResult); /***************************************************************************** 函 数 名 : api_server_start 功能描述 : 启动socket服务端,以阻塞的方式接受用户输入 输入参数 : 无 输出参数 : 无 返 回 值 : extern void 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2010年1月21日 作 者 : 修改内容 : 新生成函数 *****************************************************************************/ void api_server_start(int argc, char* argv[]); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __API_H__ */ //CAR.H /****************************************************************************** 版权所有 (C), 2009-2009, 华为技术有限公司 ****************************************************************************** 文 件 名 : car.h 版 本 号 : 初稿 作 者 : 生成日期 : 2010年1月21日 最近修改 : 功能描述 : car.cpp 的头文件 函数列表 : 修改历史 : 1.日 期 : 2010年1月21日 作 者 : 修改内容 : 创建文件 ******************************************************************************/ #ifndef __CAR_H__ #define __CAR_H__ #ifdef __cplusplus extern "C"{ #endif /* __cplusplus */ #define MAX_PECCANCY_RECORD_NUM 10 //最大违规记录数 #define MAX_SCORE_VALUE 20 //初始积分 #define MAX_DAYS_VALUE 1000 //最大时间(天) #define MAX_MONEY_VALUE 6000 //最大金额 #define RET_SUCC 0 #define RET_FAILURE -1 /*违规类型*/ enum enPeccancyType { PECCANCY_TYPE_0, //违章停车 PECCANCY_TYPE_1, //超速 PECCANCY_TYPE_2, //闯红灯 PECCANCY_TYPE_3, //超载 PECCANCY_TYPE_4, //醉酒驾车 PECCANCY_TYPE_BUTT }; /*违规罚款缴费状态*/ enum enPayStat { STAT_NO_PAY, //未缴纳罚款 STAT_HAVE_PAY //已缴纳罚款 }; typedef struct PECCANCY_RECORD { int PeccancyGlobalIndex; //全局违规序号 int PeccancyType; //违规类型 int Days; //时间 int fee; //罚款 }PeccancyRecord; typedef struct CAR_INFO { bool WithdrawFlag; //车牌吊销标识 int Score; //剩余积分 int RecordNum; //违规记录数 PeccancyRecord Record[MAX_PECCANCY_RECORD_NUM]; //违规记录,最多支持10条 }CarInfo; typedef struct PECCANCY_RULE { int Fee; //罚款 int Score; //扣分 }PeccancyRule; typedef struct AutoHistoryNodeType { QueryResult data; //历史信息结构 struct AutoHistoryNodeType *pNext; }AutoHistoryNodeTypeInfo; /***************************************************************************** 函 数 名 : opInit 功能描述 : 考生需要实现的接口 完成“系统初始化”操作 命令实例:i 输入参数 : 无 输出参数 : 无 返 回 值 : 无 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2010年1月21日 作 者 : 修改内容 : 新生成函数 *****************************************************************************/ void opInit(void); /***************************************************************************** 函 数 名 : opRecord 功能描述 : 考生需要实现的接口 完成“录入违规记录”操作 命令实例:r 0-1 输入参数 : int Peccancy : 违规类型 int Days : 时间 输出参数 : 无 返 回 值 : 无 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2010年1月21日 作 者 : 修改内容 : 新生成函数 *****************************************************************************/ void opRecord(int PeccancyType, int Days); /***************************************************************************** 函 数 名 : opQuery 功能描述 : 考生需要实现的接口 完成查询违规记录操作 命令实例:q 输入参数 : 无 输出参数 : 无 返 回 值 : 无 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2010年1月21日 作 者 : 修改内容 : 新生成函数 *****************************************************************************/ void opQuery(void); /***************************************************************************** 函 数 名 : opPay 功能描述 : 考生需要实现的接口 完成缴纳违规罚款操作 命令实例:p 100 输入参数 : int Money : 缴纳金额 输出参数 : 无 返 回 值 : 无 调用函数 : 被调函数 : 修改历史 : 1.日 期 : 2010年1月21日 作 者 : 修改内容 : 新生成函数 *****************************************************************************/ void opPay(int Money); void opPayFee(int *pMoney); void opPayLargeFeeOnSameDay(int *pMoney, int i); void opDeleteRecord(int i); AutoHistoryNodeTypeInfo* CreateList(void); AutoHistoryNodeTypeInfo* Insert2ListTail(AutoHistoryNodeTypeInfo *pHead, QueryResult *pAutoInfo); AutoHistoryNodeTypeInfo* FindNodeByGlobalIndex(AutoHistoryNodeTypeInfo *pHead, int iGlobalIndex); int RemoveList(AutoHistoryNodeTypeInfo *pHead); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __CAR_H__ */
/
本文档为【车辆违规vc】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索