捌玖网络工作室's Archiver

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

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

在9月8日那天我特意编写的,给大家分享的,Q\Jeq,W_(?,pBR
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式+m/p0}Oe3R*E
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)2AD UJ*~V4vc
参数解释:
+T!@ V9c5n|P&V istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流C O7k/ea/w&Z}4d+w O
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
0n+U]&D X@ 返回值:
&d;m RlYL 返回非0表示计算成功,0表示计算失败有错误
.Hs&G"upM)].a *RHs ]yV:E6h

&ET@0]kv(y
*f`vcc?"Z+~ 程序代码:
#H4Os g~-nv q~
T`E._^y namespace fy_Exp{3U Z0m G$m~ Df n
namespace {template <class _T>
cp)j;H@P'Y{ inline _T GetExpValue(_T t[], char& csym){
2}#v9riV B|9zLV     char c=csym; csym=0;
MX*N'Dp(K     switch(c){
}J}+Pueb     case '+':return t[0] += t[1];
:v#Q7sI4u+Z0n     case '-':return t[0] -= t[1];NE,p9fi'vMw
    case '*':return t[0] *= t[1];gY[({)Ur5V
    default: return t[0] /= t[1];//case '/':
a9E%j S.gM;B1|     }
'zE`k:~'Uoe y }}8r$pU:rzmG
template <class _T, class _Tstream>
D8S W.?*AC /* _Tstream: inputstream, _T: get return value
TW|!^p$fGL * Return nonzero if get value successfully */
8y-Dh(A)s e lPW/m"W int GetExpValue(_Tstream& istrin, _T& nReturn){
'vmg j$|^H o-P o_     _T t[3] = {0}; //雨中飞燕之作Dg1R:m;c4m%Ta+M
    char csym[3] = "++";|-U@}$F2Yy
    int nLevel = 1, nERR = 0;,u3^g5{]eB(|E
    if(!(istrin>>t[1]))istrin.clear();
,F#R:Q;}7g     for(;;){
"s~_-w+Qb.O'i         if(istrin>>csym[2]){#C5bF8?8U,B
            switch(csym[2]){4le4mS-[8c;fe
            case '(':Q F;]:HHRN8S;L
                if(!csym[1]){nLevel=0x100; nERR=1;}elseut.lIjt
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/l\EYM1D wP6?                 else{nLevel=0x100; nERR=1;}
~-E}&M)DxR                 break;
WTl3d]k             case ')':
c/I.nO#J&v;}N                 {nLevel = 0x100;}break;
L-T9O3sSg6u.Fq             case '+':case '-':case '*':case '/':'c0?s`,d[
                {csym[nLevel++] = csym[2];}break;3]!o O U$D^8pa9N
            case ' ':case '\r':case '\n':case '\t':continue;4\8F c@@ g
            default:;K&g-B f ~i1jLG9{WP
                {nLevel=0x100; nERR=1;}
{(I }:X? W             }
A3G#@Wt8Xf             if(nLevel==0x100)break;&W7V\A2_
            if(nLevel&0x10 || istrin>>t[2]){
kZ h]ll?2Yy                 nLevel &= 0xF;Z pn:k1k8W@
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;})j.yXL5p
                if(csym[1]=='*'||csym[1]=='/'){MP o|[!u'S
                    GetExpValue(t+1, csym[1]);
)H$r4EV$I                 }
"_z jRh x0l}                 else{{'z5X;g#k-o.H4G
                    GetExpValue(t, csym[0]);
9j%X5]c}Tz0F"~                     t[1]=t[2];csym[0]=csym[1];csym[1]=0;C0_u A dz2vV
                }.s)G Ky o6EDPKO
                nLevel = 1; _}#L6?.w
            }G UQt,oOh
            else istrin.clear();
D#u!_6yCD/q         }
f^$Ol8m8R'H         else{nERR = -1; break;}.@&}JFr%O7H5D
    }
w^ C&\*h@     if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);L A;f8dLD
    else nReturn=GetExpValue(t, csym[0]);
h?_ Ot"p8tua     return nERR==-1?1:0;lqo}N$[
}}9g9^5Wl U%fw$}vM
~q1w^ o.vklx

L#Z+U#^ JM,lT _$U*LD._pz/_
函数模板使用示例:
1G(a+GRd4|l 在以上那段代码的后面加上以下代码:
.A9K0Qvi5W NS h+SJf
,C5a+UNtU

ZA0Mf} 程序代码:
gP_2u:DV r G Tj~fUc
#include<strstream>yF!\"M(u:{#\z S+N_
#include<iostream>L1T DJ-x
#include<string>9tr#D{:I6o
using namespace std;
(^'t,m#E-j int main(void)p%tV)t9m|)kP
{@%ma M)l f}5P?
    string s1;t V'M/a)Z_^#M
    while(cin>>s1)
-xv2?8B$kpu     {
5fEP W5?0O7h9d0\         istrstream isin(s1.data());
{6yaI!f2A q2Z q         double d;
v,wP$U#rW2z         if(fy_Exp::GetExpValue(isin, d))
7I-^p`JJ0Jo         {._-jZY5A'n~
            cout<<d<<endl;*o7f9i}L-job7P
        }_b}P4~hul K9Ph
        elseZe"UKK'n
        {
%[N2m.ll,c \F9{             cout<<"ERROR"<<endl;(i,|!R4p ? qhIo
        }
WkY)``h7wP|     }
I$`2| y'n     return 0;Q#UscCf B+S_
}|"{&q"`SaE}[

+rM`T qV
3r5s6N%N1nG6B 然后编译执行就可以了(*^_^*)
_5QtbKk ` 其它:TC++上一定编译错误,不保证在VC6上也能通过编译
`.}l\#vSp       建议使用VC7或VC更高版本,或者使用GNU C++编译

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


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