捌玖网络工作室's Archiver

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

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

在9月8日那天我特意编写的,给大家分享的,l5F#Clb'_`'v_R2e
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
n*s mzwPm 只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)8a,yE@D-j9\V
参数解释:
W/\ P(?,U|X9UD istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
9Nh&Zb8g nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
Q*Y(?E@*b 返回值:
h/t xk| dw8~)d+g 返回非0表示计算成功,0表示计算失败有错误,t _xe-l

vFR;T^ Ql%vdErx&A` _/We+_'x
sr5aI)]h
程序代码:
[;dr@ wr0lw&tBKm
rU$z~ mE^J namespace fy_Exp{j5YAy@2m4{7i+f
namespace {template <class _T>
tx v*ruU inline _T GetExpValue(_T t[], char& csym){y sh0i{ w
    char c=csym; csym=0;
bG1x's0l/WG     switch(c){3rp5T!MT
    case '+':return t[0] += t[1];,~?;e+sC#m!]\.{
    case '-':return t[0] -= t[1];
!N&v{X%g d `:~J+q     case '*':return t[0] *= t[1];j~YvD2kK6PZV
    default: return t[0] /= t[1];//case '/':
'B A5];i E!s     }^z?r;l
}}
+T K+F2eeU&m,t template <class _T, class _Tstream> \&NgK3`Y#C
/* _Tstream: inputstream, _T: get return value
G:u2u5d"S#\i E^ * Return nonzero if get value successfully */W,v0O']o'iW4|
int GetExpValue(_Tstream& istrin, _T& nReturn){
-H|` pr.wq`^+Q     _T t[3] = {0}; //雨中飞燕之作
S pu!Yr     char csym[3] = "++";po1b Ii\u6S
    int nLevel = 1, nERR = 0;ne7`j-XWy
    if(!(istrin>>t[1]))istrin.clear();$\:Ts{*rD|6G!m F
    for(;;){
X+R)L)c g^6`p         if(istrin>>csym[2]){
3wBR~VTe'^             switch(csym[2]){-fy#^)nPh E
            case '(':;VO:HG"d
                if(!csym[1]){nLevel=0x100; nERR=1;}else QBGN~4RR-N!p.P
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
{\kJ(F2N                 else{nLevel=0x100; nERR=1;}5Cs.tu&kGN0k ~+E
                break;
0{b4L {5~.U]!p             case ')': oT$]8N-LG`c
                {nLevel = 0x100;}break;Z Z,kD Y?+k.s%`
            case '+':case '-':case '*':case '/': _qi5|'[8|D
                {csym[nLevel++] = csym[2];}break;
9VJ2c9kRcCZ             case ' ':case '\r':case '\n':case '\t':continue;
mtG(Am             default:
%qhv{5A[                 {nLevel=0x100; nERR=1;}
FR+`v/gcy(C             }QcIC0V+[
            if(nLevel==0x100)break;
*i2^e"z/},Ws6I             if(nLevel&0x10 || istrin>>t[2]){B R+q.vZ3i
                nLevel &= 0xF;8mgG _+@
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
;jH xn&M \)l G4k                 if(csym[1]=='*'||csym[1]=='/'){
5e)?5g5Y(^L V)Y                     GetExpValue(t+1, csym[1]);1^+{0\O8E6jmt
                }7N%C]5X ~#Nk7B.u,D8Q
                else{ j:G!quYU
                    GetExpValue(t, csym[0]);
[8D"XJe/{A(t9s){                     t[1]=t[2];csym[0]=csym[1];csym[1]=0;UQPgDz0E{*Nl
                }
8[a+};Sg!b#n5I/j+ln                 nLevel = 1;
:h Mshwc"C5Zs             }
;G"\g(^ t7}G)W$L?             else istrin.clear();7Wzr[ lmV
        }
k3@:E+Dy         else{nERR = -1; break;}
0G*Wjl9VP     }4E LVZ4I6n
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
p ~$g&` r!JWF2?3z     else nReturn=GetExpValue(t, csym[0]);#}Id)hqQ6{&n nGK"o
    return nERR==-1?1:0;
Q1Ccp9g\4H }}G5?%iU!L^

8l4{R A A0I7]
*o[MG] `)o ~,t(`%T+Ji3@u N)[d
函数模板使用示例: j'aAt'N;A9I v2W0D1K
在以上那段代码的后面加上以下代码:8AJ[E8e4PW_[%VfQ

/}*f yt"DkM
?zM9X%_4L 4oEtIw#pB
程序代码: ,Y!i ~ C(}#`W

/nvf*Y"KZ #include<strstream>#mle%adS/J N
#include<iostream>0Fu){MHQ U S
#include<string>^7]"A/X/iwk(yz,H
using namespace std;
YM^Y#in@!M int main(void)
.Q&t~p$?A~K {
0U3~ K;boEM;gF#k]     string s1; ^&c B,u3V{ c"Ew
    while(cin>>s1)8s X#rr;_e'Q
    {
xbQ1cN         istrstream isin(s1.data());2Q(K [D E'xV1\ ?Z HW
        double d;
VZ!W FT         if(fy_Exp::GetExpValue(isin, d))
p:l9sMf7y7m-X         {
(n ku"\I             cout<<d<<endl;
;o1R| v*GB+]}6j         }Rl5@b"~O
        else
ks{H;z!S8j*Thu]0e         {@%[s8?:ZD/nA!J5O
            cout<<"ERROR"<<endl;
R.P%y6K;] HA2?O c         })`q8\K3m
    }+@/kT#JT4B
    return 0;
+Zt7KO5M }
Jku*t C+S-[ G b~5^2JxCGc8Q(Q m

,|'b1g'Iile 然后编译执行就可以了(*^_^*) wG[;GQ$cJ'U
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
8C6u6fNcuQ       建议使用VC7或VC更高版本,或者使用GNU C++编译

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


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