| 導購 | 订阅 | 在线投稿
分享
 
 
 

C++計算四則表達式的模板

2008-06-01 02:11:04  編輯來源:互聯網  简体版  手機版  移動版  評論  字體: ||

在9月8日那天我特意編寫給大家分享的,一個很方便的C++函數模板,可以並且只可以計算含括號的四則表達式,只有一個函數接口:int GetEXPValue(_Tstream& istrin, _T& nReturn)

參數解釋:

istrin: 一個輸入流,可以是標准IO流,可以是文件流,也可以是串流

nReturn:用于接收計算結果的變量,計算所使用的類型由這個變量確定

返回值:

返回非0表示計算成功,0表示計算失敗有錯誤

程序代碼:

以下是引用片段:

namespace fy_Exp{

namespace {template

inline _T GetExpValue(_T t[], char& csym){

char c=csym; csym=0;

switch(c){

case '+':return t[0] += t[1];

case '-':return t[0] -= t[1];

case '*':return t[0] *= t[1];

default: return t[0] /= t[1];//case '/':

}

}}

template

/* _Tstream: inputstream, _T: get return value

* Return nonzero if get value sUCcessfully */

int GetExpValue(_Tstream& istrin, _T& nReturn){

_T t[3] = {0}; //雨中飛燕之作

char csym[3] = "++";

int nLevel = 1, nERR = 0;

if(!(istrin>>t[1]))istrin.clear();

for(;;){

if(istrin>>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&0x10 istrin>>t[2]){

nLevel &= 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;

}

else istrin.clear();

}

else{nERR = -1; break;}

}

if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);

else nReturn=GetExpValue(t, csym[0]);

return nERR==-1?1:0;

}}

函數模板使用示例:

在以上那段代碼的後面加上以下代碼:

以下是引用片段:

程序代碼:

#include

#include

#include

using namespace std;

int main(void)

{

string s1;

while(cin>>s1)

{

istrstream isin(s1.data());

double d;

if(fy_Exp::GetExpValue(isin, d))

{

cout<

}

else

{

cout<<"ERROR"<

}

}

return 0;

}

然後編譯執行就可以了。

其它:TC++上一定編譯錯誤,不保證在VC6上也能通過編譯。

建議使用VC7或VC更高版本,或者使用GNU C++編譯

  在9月8日那天我特意編寫給大家分享的,一個很方便的C++函數模板,可以並且只可以計算含括號的四則表達式,只有一個函數接口:int GetEXPValue(_Tstream& istrin, _T& nReturn)   參數解釋:   istrin: 一個輸入流,可以是標准IO流,可以是文件流,也可以是串流   nReturn:用于接收計算結果的變量,計算所使用的類型由這個變量確定   返回值:   返回非0表示計算成功,0表示計算失敗有錯誤   程序代碼: 以下是引用片段:   namespace fy_Exp{   namespace {template   inline _T GetExpValue(_T t[], char& csym){   char c=csym; csym=0;   switch(c){   case '+':return t[0] += t[1];   case '-':return t[0] -= t[1];   case '*':return t[0] *= t[1];   default: return t[0] /= t[1];//case '/':   }   }}   template   /* _Tstream: inputstream, _T: get return value   * Return nonzero if get value sUCcessfully */   int GetExpValue(_Tstream& istrin, _T& nReturn){   _T t[3] = {0}; //雨中飛燕之作   char csym[3] = "++";   int nLevel = 1, nERR = 0;   if(!(istrin>>t[1]))istrin.clear();   for(;;){   if(istrin>>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&0x10 istrin>>t[2]){   nLevel &= 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;   }   else istrin.clear();   }   else{nERR = -1; break;}   }   if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);   else nReturn=GetExpValue(t, csym[0]);   return nERR==-1?1:0;   }}   函數模板使用示例:   在以上那段代碼的後面加上以下代碼: 以下是引用片段:   程序代碼:   #include   #include   #include   using namespace std;   int main(void)   {   string s1;   while(cin>>s1)   {   istrstream isin(s1.data());   double d;   if(fy_Exp::GetExpValue(isin, d))   {   cout<   }   else   {   cout<<"ERROR"<   }   }   return 0;   }   然後編譯執行就可以了。   其它:TC++上一定編譯錯誤,不保證在VC6上也能通過編譯。   建議使用VC7或VC更高版本,或者使用GNU C++編譯
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有