在9月8日那天我特意编写给大家分享的,一个很方便的C++函数模板,可以并且只可以计算含括号的四则表达式,只有一个函数接口int GetEXPValue(_Tstream%26amp; istrin, _T%26amp; nReturn)
参数解释
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
返回值
返回非0表示计算成功,0表示计算失败有错误
程序代码:
以下是引用片段
namespacefy_Exp{
namespace{template
inline_TGetExpValue(_Tt[],char%26amp;csym){
charc=csym;csym=0;
switch(c){
case'+':returnt[0]+=t[1];
case'-':returnt[0]-=t[1];
case'*':returnt[0]*=t[1];
default:returnt[0]/=t[1];//case'/':
}
}}
template
/*_Tstream:inputstream,_T:getreturnvalue
*ReturnnonzeroifgetvaluesUCcessfully*/
intGetExpValue(_Tstream%26amp;istrin,_T%26amp;nReturn){
_Tt[3]={0};//雨中飞燕之作
charcsym[3]="++";
intnLevel=1,nERR=0;
if(!(istrin%26gt;%26gt;t[1]))istrin.clear();
for(;;){
if(istrin%26gt;%26gt;csym[2]){
switch(csym[2]){
case'(':
if(!csym[1]){nLevel=0x100;nERR=1;}else
if(!GetExpValue(istrin,t[2]))nLevel=0x10;
else{nLevel=0x100;nERR=1;}
break;
case')':
{nLevel=0x100;}break;
case'+':case'-':case'*':case'/':
{csym[nLevel++]=csym[2];}break;
case'':case'\r':case'\n':case'\t':continue;
default:
{nLevel=0x100;nERR=1;}
}
if(nLevel==0x100)break;
if(nLevel%26amp;0x10istrin%26gt;%26gt;t[2]){
nLevel%26amp;=0xF;
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
if(csym[1]=='*'csym[1]=='/'){
GetExpValue(t+1,csym[1]);
}
else{
GetExpValue(t,csym[0]);
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
}
nLevel=1;
}
elseistrin.clear();
}
else{nERR=-1;break;}
}
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1,csym[1]);
elsenReturn=GetExpValue(t,csym[0]);
returnnERR==-1?1:0;
}}
函数模板使用示例
在以上那段代码的后面加上以下代码
以下是引用片段
程序代码:
#include
#include
#include
usingnamespacestd;
intmain(void)
{
strings1;
while(cin%26gt;%26gt;s1)
{
istrstreamisin(s1.data());
doubled;
if(fy_Exp::GetExpValue(isin,d))
{
cout%26lt;
}
else
{
cout%26lt;%26lt;"ERROR"%26lt;
}
}
return0;
}
然后编译执行就可以了。
其它TC++上一定编译错误,不保证在VC6上也能通过编译。
建议使用VC7或VC更高版本,或者使用GNU C++编译
