c++常用数组功能函数

vector查找
排序
读文件


#include <vector>
#include <fstream>
#include <algorithm>
#include <functional>
#include <iostream>
using namespace std;
vector<Number> num;
struct compare : binary_function<Number, string, bool> {

	bool operator()(Number &value, string str) const
	{
		string va = value.id;
		if (va == str)
			return true;
		else
			return false;
	}
};
bool SortNum(const Number &v1, const Number &v2)//注意:本函数的参数的类型一定要与vector中元素的类型一致  
{
	if (strcmp(v1.id, v2.id) <= 0)
		return true;
	else
		return false;//升序排列  
}
//用分隔符解析字符串
void splitToArray(const std::string &src, const std::string &sep, std::vector<std::string> &destArray, bool filtEmpty = false)
{
	if (src.empty())
	{
		return;
	}

	std::string::size_type posBegin = 0;
	std::string::size_type posEnd   = src.find(sep);
	std::string value;
	while (posEnd != std::string::npos)
	{
		value = src.substr(posBegin, posEnd - posBegin);
		if (!(filtEmpty && value.empty()))
		{
			destArray.push_back(value);
		}
		posBegin = posEnd + 1;
		posEnd = src.find(sep, posBegin);
	}

	value = src.substr(posBegin, src.size() - posBegin);
	if (!(filtEmpty && value.empty()))
	{
		destArray.push_back(value);
	}
}

//号码解析:把文件中读取到的一条号码记录解析成一个结构体
RET_ERRORCODE parseNumber(const char* record, Number& number)
{
	if ((NULL == record) || (strlen(record) == 0))
	{
		return E001;
	}

	std::string numberRecord(record);
	std::vector<std::string> recordArray;

	std::string::size_type posBegin = 0;
	std::string::size_type posEnd   = numberRecord.find("\r\n");

	//去掉回车换行
	if (posEnd != std::string::npos)
	{
		numberRecord = numberRecord.substr(0, posEnd);
	}
	else
	{
		//去掉换号
		posEnd = numberRecord.find("\n");
		if (posEnd != std::string::npos)
		{
			numberRecord = numberRecord.substr(0, posEnd);
		}
	}

	//获取|分隔符分割的数据
	splitToArray(numberRecord, "|", recordArray);
    
	//合法数据只有6个字段
	if (recordArray.size() != 6)
	{
		return E004;
	}
	
	strcpy_s(number.id, recordArray[0].c_str());
	number.price = (float)atof(recordArray[1].c_str());
	strcpy_s(number.brand, recordArray[2].c_str());
	number.status = atoi(recordArray[3].c_str());
	strcpy_s(number.customer, recordArray[4].c_str());
	number.time   = atoi(recordArray[5].c_str());
	
	return E001;
}

//初始化:使用初始化指令让系统重新完成初始化
RET_ERRORCODE initSys()
{
	num.clear();
	initTimeSeconds();
	return E001;
}

//加载号码:读取numbers.txt格式的数据文件,加载所有号码信息到系统中。
RET_ERRORCODE loadNumbers(const char* fileName)
{
	if (fileName[0] == 0)
		return E002;
	ifstream infile(fileName);
	RET_ERRORCODE ret;
	if (!infile.is_open())
	{
		return E003;
	}
	Number tem;
	Number t[10];
	int l = 1;
	string s;
	int i = 0;
	while (getline(infile, s))
	{
		ret=parseNumber(s.data(),tem);
		if (ret == E004)
		{
			infile.close();
			return E004;
		}
		vector<Number>::iterator t = find_if(num.begin(), num.end(), bind2nd(compare(), tem.id));
		if(t==num.end())
			num.push_back(tem);
		else
		{
			(*t) = tem;
		}
		i++;
	}
	infile.close();             //关闭文件输入流 
	sort(num.begin(), num.end(), SortNum);
	return E001;
}
//查询:号码信息查询。

RET_ERRORCODE queryNumber(const Number& number, Number numbers[], int& count)
{
	int i = 0,j = 0;
	int numsize = num.size();
	Number *tem=new Number[numsize];
	if (number.id[0] == 0)
		;
	else
	{
		for (i = 0; i < numsize; i++)
			if (strcmp(number.id, num[i].id) != 0)
				tem[i] = num[i];
	}
	if (number.price == 0)
		;
	else
	{
		for (i = 0; i < numsize; i++)
			if(number.price != num[i].price)
				tem[i] = num[i];
	}
	if (number.time == 0)
		;
	else
	{
		for (i = 0; i < numsize; i++)
			if (number.time != num[i].time)
				tem[i] = num[i];
	}
	if (number.brand[0] == 0)
		;
	else
	{
		for (i = 0; i < numsize; i++)
			if (strcmp(number.brand, num[i].brand) != 0)
				tem[i] = num[i];
	}
	for (i = 0; i < numsize && j< count; i++)
		if (tem[i].id[0] == 0)
			numbers[j++] = num[i];
	count = j;
	delete[] tem;
	return E001;
}

//随机选号:根据品牌,随机选取未被预定的号码,供客户选择
RET_ERRORCODE randomPick(const char* brand, const int randNumber, Number number[], int& count)
{
	Number serch;
	int j = 0;
	serch.id[0] = 0;
	serch.price = 0;
	strcpy(serch.brand, brand);
	serch.time = 0;
	Number tem[1000];
	queryNumber(serch, tem, count);
	for (int i = 0; i < count && j<randNumber; i++)
	{
		if (tem[i].status == 0)
			number[j++] = tem[i];
	}
	count = j;
	return E001;
}
void random(const char* brand, const int randNumber, Number number[], int& count)
{
	Number serch;
	int j = 0;
	serch.id[0] = 0;
	serch.price = 0;
	strcpy(serch.brand, brand);
	serch.time = 0;
	Number *tem = new Number[num.size()];
	queryNumber(serch, tem, count);
	for (int i = 0; i < count && j < randNumber; i++)
	{
			number[j++] = tem[i];
	}
	count = j;
	delete[] tem;
}
//自助选号:根据选号表达式,返回满足条件的未被预定的号码列表
RET_ERRORCODE selfServicePick(const char* brand, const char* expression1, const char* expression2, Number number[], int& count)
{
	char serch[11];
	char s;
	int i = 0, k = 0;
	Number *t = new Number[num.size()];
	random(brand, 1000, number, count);
	if (expression1[0] == 0)
		;
	else
	{
		for (i = 0; i < count; i++)
			for (k = 0; k < 11; k++)
				if (expression1[k] != number[i].id[k] && expression1[k] != '*')
					t[i] = number[i];
	}
	if (expression2[0] == 0)
		;
	else
	{
		std::string numberRecord(expression2);
		std::vector<std::string> recordArray;
		splitToArray(numberRecord, "!", recordArray, true);
		for (int j = 0; j < recordArray.size(); j++)
		{
			s = recordArray[j][0];
			for (i = 0; i < count; i++)
				if (s == number[i].id[10])
					t[i] = number[i];
		}
	}
	for (k = 0,i = 0; i < count; i++)
		if (t[i].id[0] == 0)
			number[k++] = t[i];
	count = k;
	delete[] t;
	return E001;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值