车辆违规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
//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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。