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++編譯

· 湖北宜昌三峽壩區水面驚現神秘動物

近日,湖北宜昌,一段視頻在當地熱傳:有網友在三峽壩區拍到神秘動物,體型碩大數米長...

· 什麽是語段?語段的類型以及和句群、段落的區別與聯系是什麽?

句群是最高級的語言單位。 段落(自然段)是章法單位...

· 十八部好看的賭石類小說

以下是十八部(排名不分先後)好看的賭石類小說的簡介,喜歡的朋友可以去搜索書名閱讀...

 
C++中用于計算四則混合運算表達式的遞歸函數
用于計算四則混合運算表達式的遞歸函數by billow3(QQ:41965573)//---------------------------------------------------------------------------AnsiString __fastcall Calc(String sEXP){ // 計算不帶變量的...查看完整版>>C++中用于計算四則混合運算表達式的遞歸函數
 
使用模板表達式的向量類
// numeric.h#ifndef _NUMERIC_H_#define _NUMERIC_H_#include <memory> // memcpy#include <iostream> // std:: using namespace std;namespace numeric {#define max(a,b) (((a) > (b)) ...查看完整版>>使用模板表達式的向量類
 
語言決不是語法的不同之.NET 版本計算表達式的值
很多人會說語言只是語法的差異,事實上,大家忽略了一點選擇了一種語言,語言的提供者一定會提供很多的系統庫給這個語言. 接下來一個簡單的例子來結合Jscript.net 和 C# 來實現對一個表達式的計算.問題要求: 輸入一串簡...查看完整版>>語言決不是語法的不同之.NET 版本計算表達式的值
 
我就給一個PHP逆波蘭表達式的算法吧---工資計算專用
有個網友寫信給我談到關于PHP計算工資問題。我以前一篇文章中談到過一種計算工資的方法,不過是偷巧,利用現有的表達式的工具,現在既然有人想要,我就給出一個逆波蘭的算法。 我們的目標是實現如下的計算公式:假設...查看完整版>>我就給一個PHP逆波蘭表達式的算法吧---工資計算專用
 
數學表達式的計算——如何捕捉異常
在寫程序的過程中,難免會出現各種各樣的情況,有的情況也許不是我們想要的。有的人也許會用很多判斷要嚴格控制程序,使其不會出現異常情況,但這樣做可能會增加寫程序的難度。其實我們還可以用一種更加簡便的方法,...查看完整版>>數學表達式的計算——如何捕捉異常