捌玖网络工作室's Archiver

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

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

在9月8日那天我特意编写的,给大家分享的,
^2H2kjK#mc 一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
.Hbu2n{1cLK 只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)^2^/GT2d)[
参数解释:
N9o0oG$tzX$x5of istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流h|b.wB&C{
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定Y-r d&~`"O Rj
返回值:C Wm JRK.L
返回非0表示计算成功,0表示计算失败有错误
?'I%A$_-u|"df
Y)\,~ IS-} R
^V4?x-]'e1IS 5eDD-_@W
程序代码:
\/L&U#}j)X A,N .JP'Ds$P
namespace fy_Exp{ Ob^(px]#K:_
namespace {template <class _T>
wD"zVZ%F;D q inline _T GetExpValue(_T t[], char& csym){
*zp;znwB$k]     char c=csym; csym=0;a$aHaChQ*Ch
    switch(c){Ta$c[6h N"O\
    case '+':return t[0] += t[1];
1zy2E | e)F,H     case '-':return t[0] -= t[1];
-[yh fl     case '*':return t[0] *= t[1];9V"r"|!A`,C0D
    default: return t[0] /= t[1];//case '/':
1jG o8Q[     }
3Z kXmj&D_1p }}
0PY4j7~%P bd template <class _T, class _Tstream>
xa;[9e,F /* _Tstream: inputstream, _T: get return value
YtQ,R#F * Return nonzero if get value successfully */
*x v~0c-I int GetExpValue(_Tstream& istrin, _T& nReturn){}(hA-weEDd
    _T t[3] = {0}; //雨中飞燕之作
~u"?-sg0f     char csym[3] = "++";
a2|TE0\u     int nLevel = 1, nERR = 0;$J:J3O:K \
    if(!(istrin>>t[1]))istrin.clear();+v4g*O9i.g1yX/f
    for(;;){^LK&@-i@2Lr y
        if(istrin>>csym[2]){
!lyUfg             switch(csym[2]){
H,}r-|'Ga/_             case '(':
eY1b dI)@2F                 if(!csym[1]){nLevel=0x100; nERR=1;}else J$rg P!N2X%r O
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
w4akY*P,m                 else{nLevel=0x100; nERR=1;}
,NPl|b hM$T                 break;&PsFTe:Z;k
            case ')': SJ4v*]J;M7RO8g
                {nLevel = 0x100;}break;oh_ AH_ v!u+J
            case '+':case '-':case '*':case '/':
|-i8Wx+}*`I?&B                 {csym[nLevel++] = csym[2];}break;ye-Wha%gd kWV
            case ' ':case '\r':case '\n':case '\t':continue;;UY6{/N1^
            default:
M^m~V5|K$H                 {nLevel=0x100; nERR=1;}
Ex7qrJ             }
)R C%c-`n2io^             if(nLevel==0x100)break;
;^`M7OUC8c             if(nLevel&0x10 || istrin>>t[2]){~*p,im,W K5E
                nLevel &= 0xF;
']z Qe-n@+Hl                 if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}X]-N0b$j e:I9^
                if(csym[1]=='*'||csym[1]=='/'){
Cjd|9[w5~                     GetExpValue(t+1, csym[1]);5q&UjY:B
                }
?]3p M:]8g h                 else{x[H0m}&ae7\
                    GetExpValue(t, csym[0]);5Y[e_oK0Xl
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
1IxF{?L                 }
D'El3G0N1v2b                 nLevel = 1;
+i8qc9~8i1^!tWG             }|Y2SOE.B
            else istrin.clear();[b}rt[5GoZ
        }4r?_'S@5SN]
        else{nERR = -1; break;}
r$M `1]3^%e     }
-g(I_(z#nhUsP"V     if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);nw2UXQ } ?IM9q-b6P
    else nReturn=GetExpValue(t, csym[0]);
!f \ ~EE1B(`G ~     return nERR==-1?1:0;
3v,Zv(swl G!NV }}
*RA.x(k3G'W%Y _jaU)x.D6b

u3g8|)^ [9k9V:\*~
*m1l$ks p 函数模板使用示例:s$jx3dKuR^6H7W(NE
在以上那段代码的后面加上以下代码:+`dL!Spfnn1Y

xH%P;x.SK5F _ A?^ D"a2z
le/t}r/rx7r j
程序代码:
!hOZw'p1O6v`3z*T C #V.abFWR
#include<strstream>
qxkJ(u #include<iostream>7v"_n4z@
#include<string>t7\ I(XP v
using namespace std;
L Iv'{'S int main(void)yh*y _i.R*f
{
v2Z KK5l6GFR-i     string s1;
*` @#}-LGi4j7`p H     while(cin>>s1);wZB6q1^O~
    {
~^@GDQ"av         istrstream isin(s1.data());
5bMz4`sY0c2_         double d; HE9`U)x!p,Z
        if(fy_Exp::GetExpValue(isin, d))
1{ {:e#z gXb/\dP         {
I)u)Dt])]2JfMo Q             cout<<d<<endl;
C?`hy1Nx         }
*j0K&WD7x V[ ^         else
t/V#E&WM)A@         {~ RI/[:d G'|y![
            cout<<"ERROR"<<endl;$Kr Pw7Lhi6qb
        }e7K Iwf%ns9\
    }snH;Z!Un:hLtv
    return 0;
_vYFj7ex }
i8Kw7MUW
WpE3?x
3n6MQau U$HO 然后编译执行就可以了(*^_^*)(L5dGnq7xLO
其它:TC++上一定编译错误,不保证在VC6上也能通过编译~}s"G9GK k*F\
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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


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