返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,0 s% G1 _) w' z. x' m" ?% z; F
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' l3 {3 T! l5 @8 Q6 A
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)7 a" x% }: E" i/ O, Y3 T
参数解释:( z) h3 C$ q, ^7 t* X
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流! @$ @4 f2 l% C/ Q" j
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定# K- X* J- f8 t
返回值:, ^& n- q1 P! g/ G& @8 W) J, a
返回非0表示计算成功,0表示计算失败有错误8 k, _( |) U4 t

5 k, X) n) e0 m. g0 ?2 m4 P2 F% ~ / c) x" q# |$ }7 c3 d/ P

' G2 ~, [) ~; j0 m9 p7 l( @程序代码:
4 `9 `2 @/ j, A) D' M$ b: J( \1 S7 H9 [) B
namespace fy_Exp{# I! Q: j1 n. ^2 O
namespace {template <class _T>6 o: H' B% Q/ |6 |1 e; i
inline _T GetExpValue(_T t[], char& csym){
. k7 v0 r* `! I3 Q7 V    char c=csym; csym=0;- d, g+ L2 W0 M+ B; }
    switch(c){& E5 O) a4 h& M) E7 R( T% a3 ?
    case '+':return t[0] += t[1];; X- ^' G. `/ ]! v, ?" d8 z$ s; |
    case '-':return t[0] -= t[1];
6 M, r$ Y4 L% z- f% P- {    case '*':return t[0] *= t[1];  |2 p9 v# g0 u* D* B, H4 `; N$ w
    default: return t[0] /= t[1];//case '/':
1 L% u, ~4 s% B. D% o    }3 S# x* R7 @( b0 O
}}
6 q3 ^% V5 j. n; e& `; Stemplate <class _T, class _Tstream>
6 a* ?; X* d: S- G/* _Tstream: inputstream, _T: get return value
% F% \2 Q- {. q0 M% s* Return nonzero if get value successfully */
0 x9 D2 N4 X2 Eint GetExpValue(_Tstream& istrin, _T& nReturn){) v, C4 M, K+ R$ ~$ ^
    _T t[3] = {0}; //雨中飞燕之作
4 d0 F. ]4 J: Q/ Q, U/ d    char csym[3] = "++";+ I& j* ]$ r6 @+ ]& T$ M
    int nLevel = 1, nERR = 0;
( t2 ^7 s1 T. R8 o    if(!(istrin>>t[1]))istrin.clear();3 B4 d$ U6 q! r2 Y# E
    for(;;){/ v. m  j4 U! {& f: e/ O* z6 x
        if(istrin>>csym[2]){- x& v! N( b% g2 o# M% R% C/ j
            switch(csym[2]){
7 ^5 I% h& R4 C* A4 Y, l; o' u            case '(':$ g  U+ j9 g' S  B
                if(!csym[1]){nLevel=0x100; nERR=1;}else( r1 w5 x  \7 w' |
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;, X; m/ o# b9 D
                else{nLevel=0x100; nERR=1;}* S' R/ V1 U6 Q3 w
                break;
0 y( c; m, r& q0 q  v! [            case ')':
6 E! {: x8 a2 g7 h                {nLevel = 0x100;}break;
# A) Q, s- |6 q7 ?( W2 a            case '+':case '-':case '*':case '/':! P5 t, X$ d! u0 r- {& b: Q
                {csym[nLevel++] = csym[2];}break;- p& e: m' R' N+ E" f
            case ' ':case '\r':case '\n':case '\t':continue;2 `' Q  B$ ]. w4 Y( I
            default:
  L0 _7 |- F& b" g+ @! @( O                {nLevel=0x100; nERR=1;}7 `5 P- [0 k4 ^9 `1 W  s
            }" W7 N, J: e8 g) m
            if(nLevel==0x100)break;
$ i. C, P! c& Q' Q+ [1 \- j            if(nLevel&0x10 || istrin>>t[2]){/ t7 k% u5 k1 B$ G8 T* M
                nLevel &= 0xF;% M) [7 C' ^4 m/ s
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. \% J! G! _5 a8 I% T3 u/ l
                if(csym[1]=='*'||csym[1]=='/'){( V; n& C1 E, V8 k
                    GetExpValue(t+1, csym[1]);) J$ ?/ ]3 d  K3 q0 p2 o. p
                }
) ?$ q3 v! W6 ~) _                else{# Y3 K- k7 k+ U
                    GetExpValue(t, csym[0]);" e+ C: W, _+ I' w. E- v, X
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;9 K% H4 e( Y1 H, f' {' M3 F
                }. d! y) J# |& o
                nLevel = 1;
) r3 _' J# O1 u+ c            }
* V9 [0 \/ Z* u5 a0 B1 J            else istrin.clear();
# J( G2 J2 q. v! ]+ x4 o        }* j* c3 j" F# p* k# Y, ^% D
        else{nERR = -1; break;}: @- }. V" m7 ]$ e3 s* r, t7 Q
    }
* g. ?% L5 U7 f" M    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" s4 k' J, J# ?/ `$ Z    else nReturn=GetExpValue(t, csym[0]);
- a/ l# _8 Q( U1 J$ `/ G    return nERR==-1?1:0;
5 R. i' b& u% G}}
% b& s4 Y2 w+ }5 o) z2 m! l' A" G9 k! d# N" j% b* K$ I" k

, E9 k  w5 U2 q: Q. r  ~& Y9 }
" b. e: l2 h& u; O函数模板使用示例:
; Z# V, C; r) l/ p/ @在以上那段代码的后面加上以下代码:
% E: L" L0 H8 K: C; Q0 S, {5 L- H5 ]: S  E* l
1 B- J9 f" ?" b6 f$ H! {! a

) f  o" w- B+ @4 M- W程序代码:
: H- y& Q- {8 r# Y0 L
2 W: h& x( e( B3 k8 g6 T+ x#include<strstream>! f2 ~7 t, Y  t- [, q% X! @
#include<iostream>3 ]3 A- I$ |+ `, Q
#include<string>
. U! T1 A; D8 E1 wusing namespace std;
4 v0 [1 q& f, G1 _* @& Aint main(void)$ v: R. D$ C9 i3 J0 N# H, O
{; V/ ~, f5 f7 Q6 E7 D7 P6 G/ u, p
    string s1;9 ?  w( s2 [& ^) |- b/ L4 A+ y. y
    while(cin>>s1)6 ?; E/ A& Y' ^- x+ }6 b3 J
    {
/ S1 w2 l" z9 {  o* a3 y        istrstream isin(s1.data());! I4 ]& A5 |, z
        double d;
! I. Z, r5 D) Z) Z        if(fy_Exp::GetExpValue(isin, d))! d+ }! H0 W; W
        {$ |4 k+ Y! Q+ v0 h$ e
            cout<<d<<endl;, R& x- G" e6 F/ J5 S- W: Q
        }! T- g) u9 o  t4 Q* J1 N
        else% [1 A% r# }% |$ l" u' ^
        {
7 G; s' I; P5 |' U; U" S            cout<<"ERROR"<<endl;
2 k1 L" |7 p: }: n4 _        }- Y) l4 d, r, b& v6 n' l
    }
) d5 y) J) z. Q6 C& D/ V3 d0 w) G    return 0;
3 M" I, \7 S7 n6 T8 o6 n}
+ S$ T" ?. Q- K) K; \* Y% b) |: m8 `
) M# ?4 p( m# a" @
然后编译执行就可以了(*^_^*). K1 L4 i  N/ v1 A( {4 x$ t3 @8 t
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
( p& C* ~8 L( S) s      建议使用VC7或VC更高版本,或者使用GNU C++编译

返回列表
【捌玖网络】已经运行: