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逆波蘭表達式的算法吧---工資計算專用
 
數學表達式的計算——如何捕捉異常
在寫程序的過程中,難免會出現各種各樣的情況,有的情況也許不是我們想要的。有的人也許會用很多判斷要嚴格控制程序,使其不會出現異常情況,但這樣做可能會增加寫程序的難度。其實我們還可以用一種更加簡便的方法,...查看完整版>>數學表達式的計算——如何捕捉異常
 
利用API 實現字符串表達式的計算
下面實現字符串表達式計算代碼由筆者收藏的本論壇代碼改編,記不清是哪位網友提供的了,非常感謝。Option ExplicitPrivate Declare Function EbExecuteLine Lib "vba6.dll" (ByVal pStringToExec As Long, ByVal Unk...查看完整版>>利用API 實現字符串表達式的計算
 
計算出用字符串表示的數學表達式的值
// built by Liu Yang 2002.1.8library Expression;uses Dialogs, Math, SysUtils;Const Symbol_Mod='M'; Symbol_Div='D'; Symbol_Shl='L'; Symbol_Shr='R'; Symbol_Or='O'; Symbol_Xor='X'; Symbol_And='A'...查看完整版>>計算出用字符串表示的數學表達式的值
 
基于堆棧的一位整數中綴表達式計算器, 用C++編寫
很簡單, 還有些不太完善, 只支持一位整數. 在因爲有朋友表示, .net無法訪問, 所以我把源碼拷貝到這裏. 1 /******************************************* 2 * file: stack_cal.cpp 3 * author: 4 * date: 20...查看完整版>>基于堆棧的一位整數中綴表達式計算器, 用C++編寫
 
公園式的企業交友網站模板下載
資源評價:★★★★★語言界面:簡體中文資源類別:網頁模板資源格式:PSD資源大小:5.63M資源網址:上傳時間:05-10-30 資源作者: 授權方式:免費軟件 下載次數:不顯示資源簡介:公園式的企業交友網站模板下載[韓...查看完整版>>公園式的企業交友網站模板下載
 
 
回到王朝網路移動版首頁