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;
}