获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,$ _" V/ t4 ]; l9 U2 ]# E
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
# e3 ^6 n1 c; K* r* g只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
$ K5 y/ w7 S- I8 n1 g- H" X$ j* B参数解释:
, q6 n7 r. [' e, Histrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
8 T8 s+ L2 v' A( }$ H) N8 _nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定- c8 l% ?! X2 x* I# m5 L6 h. G+ ^
返回值:
/ D/ u% J. \0 f) q0 ]1 ]返回非0表示计算成功,0表示计算失败有错误
8 C6 @/ T$ Q" u0 F
5 X3 A% }1 d# T8 O3 q 1 R7 [# b% [5 ^3 F% p5 {% y! G2 u
6 V1 C+ d! I! f* \. q8 `1 X5 l! x
程序代码:
6 a6 f! M" o3 Q2 Z  G& f
5 U, x0 u7 M- P5 v( v; A: Bnamespace fy_Exp{
9 z6 Z+ z1 c" m; f5 V0 Xnamespace {template <class _T>
& L/ k, t0 w5 I/ v6 m! einline _T GetExpValue(_T t[], char& csym){' o4 S$ g2 e1 |. Y# d' r
    char c=csym; csym=0;
3 P4 c0 U' p: T7 e  O, C    switch(c){2 d6 D8 k% {2 r& _
    case '+':return t[0] += t[1];5 S4 K) V, g: M; o( T% R5 N
    case '-':return t[0] -= t[1];
6 U) R  @, ]  L% Z; h    case '*':return t[0] *= t[1];& b2 T) P. t7 h
    default: return t[0] /= t[1];//case '/':6 }1 u" C* q) _3 E8 }) z
    }
$ e5 n1 Q' K5 W; e) S}}
% U) ^( a: o3 L3 I6 f7 p# n6 rtemplate <class _T, class _Tstream>: `# K/ w3 ^4 f' p
/* _Tstream: inputstream, _T: get return value
3 a$ T- C- y% i; t2 N1 l* Return nonzero if get value successfully */
* y+ Q7 U! E  M7 E5 Yint GetExpValue(_Tstream& istrin, _T& nReturn){$ z- O. M0 P2 T* P; L6 |4 v% z, n
    _T t[3] = {0}; //雨中飞燕之作3 `( H( D( ]# m! M+ J1 L
    char csym[3] = "++";+ O! v7 O+ W+ _
    int nLevel = 1, nERR = 0;7 \. o1 x9 {7 \
    if(!(istrin>>t[1]))istrin.clear();' k7 Y7 b3 L2 l% @% R* r3 ^; J
    for(;;){
! o1 F# V5 k$ S0 p" u        if(istrin>>csym[2]){- a# R0 d9 M  W  B
            switch(csym[2]){
8 V8 J9 J4 a9 p9 l: b            case '(':
" z, }9 ~) C2 j" Y/ Q7 F* ]) k                if(!csym[1]){nLevel=0x100; nERR=1;}else
+ q  [. S" R& g5 K; {7 S9 P: q                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;' M3 }# d# u" O9 O
                else{nLevel=0x100; nERR=1;}
1 ]. v( \. X5 ]2 ~" }9 ]                break;
8 r7 k- p1 e* Z  p8 E7 h' ?# }            case ')':) k) S8 f: Z5 U) s: F9 k& x' w+ G3 H
                {nLevel = 0x100;}break;
, [) }  W2 s$ y) T1 r            case '+':case '-':case '*':case '/':
2 R' v9 ]7 g9 h8 z' Y8 ~                {csym[nLevel++] = csym[2];}break;" p/ T  D% D  r+ x& A
            case ' ':case '\r':case '\n':case '\t':continue;
( u8 I2 q- f& d7 c            default:1 s: A' z# B6 j# W% d! Y' V
                {nLevel=0x100; nERR=1;}
+ e1 `: x# ?/ p            }1 A3 g& ?+ v1 e: j' L0 f4 |
            if(nLevel==0x100)break;& ?) e, _9 l: V  i. Y( t) @8 ?0 _
            if(nLevel&0x10 || istrin>>t[2]){
( l7 f& q2 E4 O                nLevel &= 0xF;
* r4 L- x8 r. @* E- }                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
1 L5 J2 n! b( @" H* O  L6 f                if(csym[1]=='*'||csym[1]=='/'){
" C$ V! Z& y  O! s3 o1 r/ ]! w                    GetExpValue(t+1, csym[1]);
" C5 y# t5 |0 \" ?- R& P5 w                }
" H5 v1 U& x- k2 ^$ {9 F' Z                else{9 Z3 ?- k0 A) |+ V1 R% h
                    GetExpValue(t, csym[0]);
; T9 g5 v0 b! i) E+ h9 _                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;3 i1 u% @4 y$ }$ i; A6 w$ B
                }
; e( H3 V% q: h1 M                nLevel = 1;
# h4 w- H0 O, s& ~: M            }  e* s" ?- [7 k1 e& W8 R+ V" g
            else istrin.clear();
' U: f. Y6 T5 V2 b        }
4 e' D  o! B8 x5 {3 t        else{nERR = -1; break;}$ P4 U; O& n8 X+ ]9 O( v
    }- @1 \# L" W1 X' X
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);- z  x9 Z2 o3 _# X! I. c
    else nReturn=GetExpValue(t, csym[0]);
  ~/ U: m" W! Y' ~3 N/ J+ \    return nERR==-1?1:0;- E! j5 l$ h" J8 L+ y2 m: j1 ?
}}
' }$ ~( s1 d6 |+ |7 }5 N) T1 {+ [# o5 g4 L" p) D

9 f1 i* Z  l4 x3 x* _! X
2 r8 g0 v/ C7 a函数模板使用示例:% {+ R) E1 Q& w2 M  y- `: D
在以上那段代码的后面加上以下代码:
7 b8 [* q0 y, S9 {! m) W3 B1 o; a6 {& m0 g" |# m

$ X# ~1 w& D; N; l" j9 ?
" i  A: U) n/ |& \( S8 k/ A8 x6 o程序代码: ; U: Y( }8 V2 P4 n, I3 F( N" ]2 ]" F

+ h; Z. c' Q; S1 P" y#include<strstream>1 W% T% f6 `) b
#include<iostream>
, p; ^: L- x' n7 L& n#include<string>
' a1 q5 a$ z; D0 Gusing namespace std;4 S- Y, `" P% m' D' g
int main(void)1 y, R6 w) ~5 w/ S; x
{
- b6 r  y) p2 h- V    string s1;$ _5 _2 Z& @! v- Y
    while(cin>>s1)/ _* o( w% ~, X( l. u/ s" F
    {
* r  o2 T4 f. H2 m8 @        istrstream isin(s1.data());
* N) R" R/ w; Q; j( e0 ~- g6 k: f        double d;
* g' V/ z9 P, t0 J2 O, K- a/ G" r        if(fy_Exp::GetExpValue(isin, d))
* W  S$ ?; n( C+ u0 w7 _        {
/ a* e7 T" ^. ^# w% h9 r            cout<<d<<endl;1 _2 i5 o& \" {$ E
        }
9 d/ i& ^/ S- W) o& N        else
) P& X4 c+ {: e# s, V. g( ~+ L/ m6 f        {, V) \- N% ^0 n" C3 Z0 e& Z
            cout<<"ERROR"<<endl;
/ R; i& |6 N1 o: w        }
! L1 X: B1 I# q: d5 a, o0 H    }7 d* s( l/ u7 C/ i- U' R9 r
    return 0;% \2 T# w% D3 d( _' g$ n
}
, P0 h/ ^8 L2 g. p/ M- e  |
6 P! V" Y( A) ]% B# @' Y
& c7 P. g/ Z) D! z! a( {然后编译执行就可以了(*^_^*)
3 Y9 K5 s; w7 C4 B7 w4 O" t8 v- [其它:TC++上一定编译错误,不保证在VC6上也能通过编译
. I; b: q: c8 Y- H; S      建议使用VC7或VC更高版本,或者使用GNU C++编译

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