捌玖网络工作室's Archiver

zw2004 发表于 2008-1-21 20:17

一个计算四则表达式的模板

在9月8日那天我特意编写的,给大家分享的,
4w%UUu x-x 一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
.F jh]$i4@n7E 只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
pN Cj2L J 参数解释:
&?w1O5o(Crj O"` istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流Xtp| O)D,Od,q4^
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定,Z@-EZb@
返回值: tmy@]
返回非0表示计算成功,0表示计算失败有错误
?(vd[2ZG
+zEE0jTE.G)Kq Z /tGxwAw

.`1aT V;J"p 程序代码: )@lF#\ z9V
l5r3A&_O@tE$m%R
namespace fy_Exp{
+xk`^)L"m(] L namespace {template <class _T>3o2y:t\;a/f4b
inline _T GetExpValue(_T t[], char& csym){D3ei iW
    char c=csym; csym=0;
s/z9Q!e Vd Jd7pH     switch(c){
)|'|'f;}I5i0@     case '+':return t[0] += t[1];
P})O i$?Y!Y Zq,B     case '-':return t[0] -= t[1];
x)YbK4c-~o sQ     case '*':return t[0] *= t[1];9@fIS+Ip3sn)l#MSl N
    default: return t[0] /= t[1];//case '/':W@ NO7sV!x dSy
    }
_]Pa c }}mBor JbaZ
template <class _T, class _Tstream>,ku#P({IG
/* _Tstream: inputstream, _T: get return value%bi6v1M/{X{)H }
* Return nonzero if get value successfully */}]\4cp
int GetExpValue(_Tstream& istrin, _T& nReturn){
_#cU5^{2^4e     _T t[3] = {0}; //雨中飞燕之作
|,V1h[ z-x     char csym[3] = "++";
s%i+V,V-m     int nLevel = 1, nERR = 0;
krN4i-i?Z     if(!(istrin>>t[1]))istrin.clear();6h(V!h4_"V'Yq
    for(;;){
.Rdz(HLq6Zb         if(istrin>>csym[2]){hIo K^x
            switch(csym[2]){
-[ep$z(y ?             case '(':
oA;V}l$c2X4j                 if(!csym[1]){nLevel=0x100; nERR=1;}elsec%iIl i
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
#bY5kNQ~^                 else{nLevel=0x100; nERR=1;}
8g;c _ V!^|U/_                 break;!pRko F v2\
            case ')':+JF T P)_WT:c%F4w
                {nLevel = 0x100;}break;
2Gp ScrZ l             case '+':case '-':case '*':case '/':8@+w7b9u1C+s
                {csym[nLevel++] = csym[2];}break;
,W7Q[X;Fc             case ' ':case '\r':case '\n':case '\t':continue;4x4foQP/WCxB
            default:
#z,YX[8mn                 {nLevel=0x100; nERR=1;}
OQV(eWx"y5K             }G+e sx&c|v
            if(nLevel==0x100)break;
tQ-f@o N Gfl             if(nLevel&0x10 || istrin>>t[2]){8T~g^ hEV5g
                nLevel &= 0xF;r8u3~}1L{OG
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0|E%E-R2C                 if(csym[1]=='*'||csym[1]=='/'){{0RaZ*W*iO8R
                    GetExpValue(t+1, csym[1]);)q`R Z.E/i |J
                }
4Zw"Z7i_#H                 else{
#u,\pY:N                     GetExpValue(t, csym[0]);
$n5}W*c\+R$@S                     t[1]=t[2];csym[0]=csym[1];csym[1]=0;
~#d3M9[dJ]B,JEO                 }
%G7m {4f Cbi k                 nLevel = 1;
ej5~XQ`q,HA             }
6P8a,r"M(T             else istrin.clear();
&c%lf'U!L mx)v         }!E4n mq G/?+mhX
        else{nERR = -1; break;}a-E7~:Llu{6d
    }5C m mj;a!V#Y
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);;tzZ.Q%Z
    else nReturn=GetExpValue(t, csym[0]);
2]X ~x[;Tn+U b     return nERR==-1?1:0;8Xn%f u9X
}}
^%m T-N1Y3QR'H(o +sA,}5V1WJ-|-W

;u8`~"RoY-F WQ1b
1x V'qy6X D`5J8R 函数模板使用示例:
hV"v0fT$B!|4FX 在以上那段代码的后面加上以下代码:
*J9O*P+~ RK#`*mS t#U&w&o.vK(e3?D

.]`J_&|7l @'Q 7\z}}0|q4g-i
程序代码:
v#F_5l3w1n&g{
0E]o'_Z M #include<strstream>!XlH"aI;E
#include<iostream>
ML5XM.N3o)v+ba)b #include<string>#x5@;` aH B D"zn
using namespace std;;\*gp6b*w5N/\^
int main(void)
uW(Sc"O2Y9_].r {
:@2cAS.n:T5Q5K     string s1;
i*z;EFw!L'F     while(cin>>s1)
w,V^,DZ#J&e     {H*JfD$}$a#I.D
        istrstream isin(s1.data());wl(u\~"uYb4H
        double d;}#Y(|)R]L&S
        if(fy_Exp::GetExpValue(isin, d))
{"tB9ANI         {(X'iUN$Q ^,Y'X }o
            cout<<d<<endl;
Cg4W6gAW'T ] U}         }
2a+c wf.jK4N         else0gTO.sX.q@@
        {
xA C[ ~}.c:J-W             cout<<"ERROR"<<endl;
F&Y4hw?2cPD         }1F'BMN!dZG~
    }_]HVg|J?6q
    return 0;
w"CI{(|Hww&Oc \7X }3x5DiU+^jp

L,b/~ Q$jUl
#{7BG1L,@a&j 然后编译执行就可以了(*^_^*)|n Ffv3B}
其它:TC++上一定编译错误,不保证在VC6上也能通过编译O8bc1U{}0n#t*QIo^
      建议使用VC7或VC更高版本,或者使用GNU C++编译

页: [1]
【捌玖网络】已经运行:


Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.