返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,, \! i" `* O5 Y. |+ V
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
& n0 f4 v1 E( Z& W- f只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
  I6 n, _7 j% Y! t参数解释:" q  o$ L% a5 Q* a, u' B
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流8 H* ~6 ^* A" j; ~- C3 c6 I4 @# E
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
" M5 e! ^* X1 i, F返回值:8 @! n, \! r4 L( J, r- l% C+ ?
返回非0表示计算成功,0表示计算失败有错误6 x; m: q7 e8 p8 }9 {2 |8 k
' H* Z+ y# v' `# |( N! q- S

4 D! P. \+ A7 s2 t) _7 ^7 o: s1 E8 X1 }, Q
程序代码: ) B. P# `+ s0 l

% s+ Y5 r$ @  }6 \& a& [' A5 Q+ Qnamespace fy_Exp{
5 H* F* E- D5 q' s* i- }, ~1 `namespace {template <class _T>( Y; e4 I$ h4 o' r  f5 p+ k
inline _T GetExpValue(_T t[], char& csym){. h4 Z* l3 U  b( P! `7 Q8 R
    char c=csym; csym=0;0 z5 [! ~3 ]) t- }6 |1 ]1 Z9 @
    switch(c){# q, |# C0 j8 j2 D* d; G9 d$ B9 X7 V
    case '+':return t[0] += t[1];9 f/ Z- M( V' i: k" Q. m
    case '-':return t[0] -= t[1];" s+ W4 O# O* N! t5 F4 k
    case '*':return t[0] *= t[1];
) R% `8 @: x& ]. D8 ]" @- `    default: return t[0] /= t[1];//case '/':) [+ K+ ^1 H0 W
    }* G" O! l4 I& d) a9 B8 [' `
}}
8 _* [0 G; N! e7 H, j6 J( `" ^. V' Dtemplate <class _T, class _Tstream>
# p" y( i) N9 z: G, o# K! I7 r/* _Tstream: inputstream, _T: get return value
+ {& {& P/ A, V2 Y2 H0 Y* Return nonzero if get value successfully */! |. ]' R" c. j5 w$ }* B
int GetExpValue(_Tstream& istrin, _T& nReturn){
3 V  z0 Y, F* g2 H. N    _T t[3] = {0}; //雨中飞燕之作. m2 Y8 U6 o1 T. k$ x
    char csym[3] = "++";
( Y% T( u# I, a# O, k8 l    int nLevel = 1, nERR = 0;
0 y: g& w) U+ ~7 I1 E; y5 Y    if(!(istrin>>t[1]))istrin.clear();5 u& Z8 `. a9 j6 P+ W4 j+ s% Z
    for(;;){. T9 w5 f! k# P' E- K1 k* _) G
        if(istrin>>csym[2]){4 L0 H# W' M" K, @
            switch(csym[2]){" e& k9 G: |; K# O: s
            case '(':
0 S, v" H: l: S3 B  |                if(!csym[1]){nLevel=0x100; nERR=1;}else: k" z0 O. Y( o/ R
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
3 O7 a/ O8 E, j0 U+ V/ W                else{nLevel=0x100; nERR=1;}" }/ P" x: ~/ ~* J2 C
                break;9 Z) |/ h4 b. u0 W
            case ')':
; {, k! n4 |; A& v3 H& Y+ p4 H                {nLevel = 0x100;}break;
$ S9 @( J" a6 t- H. O, k/ R3 x            case '+':case '-':case '*':case '/':
7 G0 T. |. |$ o* D4 l                {csym[nLevel++] = csym[2];}break;
3 ~6 M& ?+ [; G6 r( E            case ' ':case '\r':case '\n':case '\t':continue;
0 Z2 \" }7 a; i% k6 h            default:
1 g" R( B: d- x6 o" h3 B                {nLevel=0x100; nERR=1;}
* D' p4 K- n' z, X* R' q, Q            }4 Y) U, E6 K- a/ ]5 K
            if(nLevel==0x100)break;
4 K5 O/ q" Z5 ]' N            if(nLevel&0x10 || istrin>>t[2]){
. S! }% i7 T: Q, J1 v                nLevel &= 0xF;
: p9 U+ P$ j9 b* k+ w5 a4 T                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
1 J, p6 U  |$ O; Y  e6 D, k4 q                if(csym[1]=='*'||csym[1]=='/'){% h# e9 {9 h5 p  b  m
                    GetExpValue(t+1, csym[1]);, `* G3 B1 q2 l% w, X1 b* d5 B
                }0 ]6 U2 m* r) F$ |
                else{/ P8 R- o* L* v
                    GetExpValue(t, csym[0]);
0 n4 U% `& u8 o. k" `                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
1 j& P+ ]6 N6 [                }
, G8 H. E- o" M  e7 m: q! V9 h1 {                nLevel = 1;# f; `+ q% U& R2 ?/ U( ^& o+ \
            }, M- T4 K: i, \3 m/ f1 C) l! f: e
            else istrin.clear();: V- ~3 |7 E% B
        }( i  D" X) p3 h% Q, ?6 \, O
        else{nERR = -1; break;}" N- H: n# q  y1 L
    }
3 @% L4 `+ q* K& |  Y% S3 Q    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);, T  I9 K- N, ]3 }1 D4 {
    else nReturn=GetExpValue(t, csym[0]);" t2 B- Q% H" L" h* Q
    return nERR==-1?1:0;
/ A! ^. D( n4 \1 l}}+ ~7 X% ]2 e) ]  O7 \' s
2 P; O( v( ^3 S1 u& P0 \* ?

, A0 g+ o1 Z% i8 m& f( {4 t. ^) f) O6 ~8 [8 Y! {; I9 ^
函数模板使用示例:* Z, u3 Z) T- e- j7 z
在以上那段代码的后面加上以下代码:* G. L* y& B2 N4 y% f" L

" n/ l- ]' M5 V( V2 m5 I' B; s
' X0 j# J. c6 k' j; `+ _
4 k. b! n* O  B. U# y3 `" [5 o' g. V程序代码:
, A! S: l  ^) j( |! v1 q3 g: i+ E/ s( t
#include<strstream>, C" z9 X5 y' K
#include<iostream>' a* R. E) {6 I
#include<string>$ L1 w& H/ J; F7 \- n2 z+ m
using namespace std;/ ?$ ^, Y- Y1 g4 ]
int main(void): @  _! N& ~3 W9 B
{
: w2 K& q- K4 l5 r- [, J1 ]" z' `% U    string s1;, g6 N# _: @% e  t1 t
    while(cin>>s1)7 F. a( q, `4 B* k: x
    {: j* ^) ]" t8 @2 P
        istrstream isin(s1.data());
  S7 g* t: {3 S$ T/ ]        double d;
8 T' e5 _0 Z7 I4 _9 z2 ~        if(fy_Exp::GetExpValue(isin, d))
) b! C) z  x3 P! [/ S9 A( n/ h        {
* w) H% O: O' W& k* i            cout<<d<<endl;* ?1 ?; F6 [6 t8 r$ R
        }+ q. [9 R& R( T; h2 O$ x
        else
* U, l! V$ E( z/ @, S1 u        {6 r4 D5 n0 U. n9 X$ H1 k0 x
            cout<<"ERROR"<<endl;
: }9 e4 z0 Z% w2 h        }
- q) p% u9 E; e5 w. b    }
: ?0 e8 q8 c7 X, }+ D    return 0;& N: r* C5 M6 ~4 Z2 A5 M7 X
}+ R' u7 @3 I  g3 R

% \8 a- H2 h& J, \. D* e. f- G' J5 y1 e: N* W- j- @0 [
然后编译执行就可以了(*^_^*)
0 K, @3 B( `1 A* p9 D其它:TC++上一定编译错误,不保证在VC6上也能通过编译$ O. T, W+ z) [, H" u
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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