答案2

// 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); 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值