// car.cpp : 定义控制台应用程序的入口点。
//
#include <string.h>
#include "stdio.h"
#include "api.h"
#include "car.h"
#include <vector>
#include <algorithm>
typedef struct RecordList
{
int index;
QueryResult QR;
RecordList* next;
}RecordList;
RecordList* RecordListInit()
{
RecordList* ql = new RecordList();
ql->index = -1;
ql->next = NULL;
return ql;
}
RecordList* Append(RecordList* np, QueryResult qr)
{
RecordList* newr = new RecordList();
newr->QR = qr;
newr->next = NULL;
np->next = newr;
newr->index = np->index + 1;
return newr;
}
int GetNotPayCount(RecordList* header)
{
if (header->next == NULL)
{
return 0;
}
RecordList* temp = header;
//开始计数
temp = temp->next;
int count = 0;
while (temp != NULL)
{
if (temp->QR.PayFlag == enPayStat::STAT_NO_PAY)
count++;
temp = temp->next;
}
return count;
}
RecordList* GetLastPoint(RecordList* header)
{
RecordList* temp = header;
if (header->next == NULL)
return NULL;
while (temp->next != NULL)
temp = temp->next;
return temp;
}
//获取最小待缴罚款数
int GetMinPay(RecordList* header)
{
RecordList* temp = header->next;
int min = temp->QR.Fee;
while (temp != NULL)
{
if (temp->QR.PayFlag == enPayStat::STAT_NO_PAY && min < temp->QR.Fee)
min = temp->QR.Fee;
temp = temp->next;
}
return min;
}
//获取待缴费数据列表
void GetPayList(RecordList* header, vector<RecordList*>& List)
{
List.clear();
RecordList* temp = header->next;
while (temp != NULL)
{
if (temp->QR.PayFlag == enPayStat::STAT_NO_PAY)
{
List.push_back(temp);
}
temp = temp->next;
}
}
//代缴费列表按照缴费规则排序
bool sort_pay(RecordList* val1, RecordList* val2)
{
if (val1->QR.stCarSysInfo.Time > val2->QR.stCarSysInfo.Time)
return true;
else if (val1->QR.stCarSysInfo.Time < val2->QR.stCarSysInfo.Time)
return false;
else if (val1->QR.stCarSysInfo.Time = val2->QR.stCarSysInfo.Time)
{
if (val1->QR.Fee < val2->QR.Fee)
return true;
else
return false;
}
}
typedef struct User
{
int Is_Inited;
RecordList* Record;
int basescore;
int score_now;
bool Is_butt;//吊销驾照
}User;
User newuser;
void main(int argc, char* argv[])
{
/* 启动Socket服务侦听5555端口(sapi_server_start函数在lib库已实现)。
* lib库已实现从Socket接收到字符串后的命令分发处理;
* 考生只需要实现分发后的各命令即可。
*/
//api_server_start(argc, argv);
opInit();
opRecord(1, 200);
opRecord(2, 300);
opRecord(3, 300);
opRecord(3, 250);
opQuery();
opPay(800);
// 此处不会执行到,注意不要在此处添加代码
}
/*****************************************************************************
函 数 名 : opInit
功能描述 : 考生需要实现的接口
完成“系统初始化”操作
命令实例:i
输入参数 : 无
输出参数 : 无
返 回 值 : 无
调用函数 :
被调函数 :
修改历史 :
1.日 期 : 2010年1月21日
作 者 :
修改内容 : 新生成函数
*****************************************************************************/
void opInit(void)
{
newuser.Is_Inited = RET_SUCC;
newuser.Is_butt = false;
newuser.score_now = 20;
newuser.basescore = 20;
newuser.Record = RecordListInit();
api_print_result(OP_RST_INFO::S001);
}
/*****************************************************************************
函 数 名 : opRecord
功能描述 : 考生需要实现的接口
完成“录入违规记录”操作
命令实例:r 0-1
输入参数 : int Peccancy : 违规类型
int Days : 时间
输出参数 : 无
返 回 值 : 无
调用函数 :
被调函数 :
修改历史 :
1.日 期 : 2010年1月21日
作 者 :
修改内容 : 新生成函数
*****************************************************************************/
void opRecord(int PeccancyType, int Days)
{
if (newuser.Is_Inited != RET_SUCC)
{
api_print_result(OP_RST_INFO::E001);
return;
}
if (newuser.Is_butt == true)
{
api_print_result(OP_RST_INFO::E004);
return;
}
else
{
if (newuser.score_now <= 0)
{
newuser.Is_butt = true;
api_print_result(OP_RST_INFO::E004);
return;
}
}
if (PeccancyType < enPeccancyType::PECCANCY_TYPE_0 || PeccancyType >= enPeccancyType::PECCANCY_TYPE_4)
{
api_print_result(OP_RST_INFO::E003);
return;
}
if (Days < 1 || Days > MAX_DAYS_VALUE)
{
api_print_result(OP_RST_INFO::E002);
return;
}
if (GetNotPayCount(newuser.Record) >= MAX_PECCANCY_RECORD_NUM)
{
api_print_result(OP_RST_INFO::E009);
return;
}
RecordList* lastpoint = GetLastPoint(newuser.Record);
if (lastpoint != NULL && lastpoint->QR.stCarSysInfo.Time > Days)
{
api_print_result(OP_RST_INFO::E008);
return;
}
QUERY_RESULT qr;
if (lastpoint != NULL)
qr.Index = lastpoint->index + 1;
else
qr.Index = 0;
qr.stCarSysInfo.Reason = PeccancyType;
qr.stCarSysInfo.Time = Days;
qr.PayFlag = enPayStat::STAT_NO_PAY;
qr.Fee = (PeccancyType + 1) * 100;
qr.Score = newuser.score_now - (PeccancyType + 1);
newuser.score_now = newuser.score_now - (PeccancyType + 1);
//加入违规信息
RecordList* tem = newuser.Record;
while (tem ->next != NULL)
{
tem = tem->next;
}
Append(tem, qr);
api_print_result(OP_RST_INFO::S002);
if (newuser.score_now <= 0)
{
newuser.Is_butt = true;
}
}
/*****************************************************************************
函 数 名 : opQuery
功能描述 : 考生需要实现的接口
完成查询违规记录操作
命令实例:q
输入参数 : 无
输出参数 : 无
返 回 值 : 无
调用函数 :
被调函数 :
修改历史 :
1.日 期 : 2010年1月21日
作 者 :
修改内容 : 新生成函数
*****************************************************************************/
void opQuery(void)
{
if (newuser.Is_Inited != RET_SUCC)
{
api_print_result(OP_RST_INFO::E001);
return;
}
if (newuser.Is_butt == true)
{
api_print_result(OP_RST_INFO::E004);
return;
}
if (newuser.Record->next == NULL)
{
api_print_result(OP_RST_INFO::E010);
return;
}
//输出违规记录
RecordList* temp = newuser.Record;
temp = temp->next;
while (temp != NULL)
{
api_print_query_info(&temp->QR);
temp = temp->next;
}
}
/*****************************************************************************
函 数 名 : opPay
功能描述 : 考生需要实现的接口
完成缴纳违规罚款操作
命令实例:p 100
输入参数 : int Money : 缴纳金额
输出参数 : 无
返 回 值 : 无
调用函数 :
被调函数 :
修改历史 :
1.日 期 : 2010年1月21日
作 者 :
修改内容 : 新生成函数
*****************************************************************************/
void opPay(int Money)
{
if (newuser.Is_Inited != RET_SUCC)
{
api_print_result(OP_RST_INFO::E001);
return;
}
if (newuser.Is_butt == true)
{
api_print_result(OP_RST_INFO::E004);
return;
}
if (Money < 1 || Money >MAX_MONEY_VALUE)
{
api_print_result(OP_RST_INFO::E005);
return;
}
if (GetNotPayCount(newuser.Record) == 0)
{
api_print_result(OP_RST_INFO::E007);
return;
}
//查询是否可缴纳
if (GetMinPay(newuser.Record) > Money)
{
api_print_result(OP_RST_INFO::E006);
return;
}
//开始缴纳
vector<RecordList*> List;
GetPayList(newuser.Record, List);
int count_ = GetNotPayCount(newuser.Record);
int li_mon = 0;
std::sort(List.begin(), List.end(), sort_pay);
for (int i = 0; i < List.size(); i++)
{
if (List[i]->QR.Fee <= Money)
{
List[i]->QR.PayFlag = enPayStat::STAT_HAVE_PAY;
Money = Money - List[i]->QR.Fee;
count_ -= 1;
}
else
{
li_mon += List[i]->QR.Fee;
continue;
}
}
//返回缴费数据
PayResult PR;
PR.Fee = li_mon;
PR.PeccancyNo = count_;
PR.Score = newuser.score_now;
PR.ReturnMoney = Money;
api_print_pay_info(&PR);
}
答案2
最新推荐文章于 2021-05-18 04:24:07 发布