应用描述:
在项目中,常常需要一些逻辑条件来决定做不做某件事情。比如:“当过去1小时或3小时降水量>0,且温度>0度时,判识为雨。”。由于这个判断的数值有可能经常变动,要做成可配置的。就要在代码中实现对操作符的解析。
例如要实现如下判断功能
“
//天气现象代码:判断条件:天气现象
1:temp_>_0|&&|6hourrain_>_0:雨
2:temp_<=_0|&&|6hourrain_>_0:雪
3:6hourrain_=_0|&&|windspeed_<_4|&&|vis_<_7500|&&|rh_<_80:霾
4:6hourrain_=_0|&&|vis_>=_1000|&&|vis_<_7500|&&|rh_>_=80:轻雾
5:6hourrain_=_0|&&|vis_<_1000|&&|rh_>=_80:大雾
6:6hourrain_=_0|&&|windspeed_>=_4|&&|vis_<_1000:沙尘
”
当温度<0&&6hourrain_>_0判断为下雪了。
代码实现:
一 判断是哪个物理量:
for (;iter != mapWeatherPh.end();++iter)
{
int iIndex = 0;
bool bSatify = true;
vector<string> vtCond;
//h6hourrain_=_0|&&|windspeed_<_4|&&|vis_<_7500|&&|rh_<_80:
string strCon = iter->second;
split_string(strCon.c_str(),"|",vtCond);
for (iIndex = 0;iIndex < vtCond.size();++iIndex)
{
vector<string> vtSingle;
split_string(vtCond[iIndex].c_str(),"_",vtSingle);
if (vtSingle.size() != 3)
{
continue;
}
//暂时只考虑 && 情况
if(vtSingle[0].find("6hourrain") != -1)
{
if(!isSatifyCondition(vtSingle,h6hourrain)) break;
}
else if(vtSingle[0].find("windspeed") != -1)
{
if(!isSatifyCondition(vtSingle,windspeed)) break;
}
else if(vtSingle[0].find("temp") != -1)
{
if(!isSatifyCondition(vtSingle,temp)) break;
}
else if(vtSingle[0].find("vis") != -1)
{
if(!isSatifyCondition(vtSingle,visibledistance)) break;
}
else if(vtSingle[0].find("rh") != -1)
{
if(!isSatifyCondition(vtSingle,rh)) break;
}
}
if (iIndex == vtCond.size())
{
pRecord->nowweather = iter->first;
}
}
二 对具体物理量进行逻辑判断
bool isSatifyCondition(const vector<string> &vtSingle,double dValue)
{
if(dValue == 9999.f) return false;
bool bSatify = false;
if (vtSingle[1].find(">") != -1)
{
if(dValue > atof(vtSingle[2].c_str())) return true;
}
else if (vtSingle[1].find(">=") != -1)
{
if(dValue >= atof(vtSingle[2].c_str())) return true;
}
else if (vtSingle[1].find("<") != -1)
{
if(dValue < atof(vtSingle[2].c_str())) return true;
}
else if (vtSingle[1].find("<=") != -1)
{
if(dValue <= atof(vtSingle[2].c_str())) return true;
}
else if (vtSingle[1].find("=") != -1)
{
if(dValue == atof(vtSingle[2].c_str())) return true;
}
else if (vtSingle[1].find("!=") != -1)
{
if(dValue != atof(vtSingle[2].c_str())) return true;
}
return bSatify;
}
本示例代码仅仅实现了 &&操作,其它操作类似处理即可。