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

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

在9月8日那天我特意编写的,给大家分享的,4 M/ H# g. A! O4 x
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式7 N$ ]# L; `0 t# o
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
1 b8 ?' r, a! ]9 o5 d' H& N% H参数解释:( B8 \! a$ U2 S3 b1 O1 R
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流2 r$ N" ]2 K1 b( h- ?5 J
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
9 d* b" f- Q% y! v返回值:
: Z& c4 r8 U. y% @返回非0表示计算成功,0表示计算失败有错误- s, j& A6 K$ e7 B0 u, q9 k* I

' d' c# Q1 r# L( h2 w
* {$ ^9 x3 a- O3 X" l, G4 e2 Y- Y$ d7 s3 A0 d- L# k
程序代码: / C! ]; F) E4 H4 r9 s' J

2 ?0 F6 P5 F0 X1 D. o5 d4 Nnamespace fy_Exp{. k5 P+ U5 I$ [; ?" |0 d$ k
namespace {template <class _T>
# U3 k" m' ^4 q$ g0 Zinline _T GetExpValue(_T t[], char& csym){* A# T; F+ A0 ]7 S7 M  T
    char c=csym; csym=0;8 D8 s( Y: _' i' w! u
    switch(c){! u/ w2 Q4 [2 |5 n4 ^* W8 |, Q
    case '+':return t[0] += t[1];
+ K* e% Z- J6 j1 m, Y5 T    case '-':return t[0] -= t[1];. ~( ^& F' b: T7 B
    case '*':return t[0] *= t[1];
  f& S# u1 X0 G: j. I% m- n    default: return t[0] /= t[1];//case '/':4 E' ~% x/ j  l; J
    }! ]8 x9 o8 w+ o+ d
}}+ a2 \" @3 L  [4 v. Q" n
template <class _T, class _Tstream>6 ?8 i* s6 B( O- G: \8 t
/* _Tstream: inputstream, _T: get return value- S4 h5 p7 z  G2 @/ B* H  M
* Return nonzero if get value successfully */
$ W& V  r8 E4 c+ Fint GetExpValue(_Tstream& istrin, _T& nReturn){
/ @$ X* v7 X; F1 G* K, Q    _T t[3] = {0}; //雨中飞燕之作
. g& L3 R6 x$ W8 V! Z; A7 H& x6 a    char csym[3] = "++";, i4 q9 a5 H4 f! p
    int nLevel = 1, nERR = 0;
7 Y- t- v. |5 m" w1 a    if(!(istrin>>t[1]))istrin.clear();, n6 H# Y, ?% B6 P8 b
    for(;;){
" J% \8 `2 J7 h) ]& N        if(istrin>>csym[2]){4 X1 e( v$ x2 H" z
            switch(csym[2]){
8 w- C* \, e6 c2 z            case '(':
6 {) Q8 y: Q! ?                if(!csym[1]){nLevel=0x100; nERR=1;}else
: E/ S( X5 l6 Y                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
* j* k5 B: w1 Z$ O% U                else{nLevel=0x100; nERR=1;}
+ X* n9 Z7 N8 K# I& K. Q                break;
3 @7 _6 Y  ~) y0 T' T& U4 F# ?- G            case ')':
* W0 p6 e3 e3 R( q# b                {nLevel = 0x100;}break;
# l7 `: X9 x4 [- |* \; o* ^$ V# g7 L            case '+':case '-':case '*':case '/':
+ @* V- r9 N% m% g8 [3 k                {csym[nLevel++] = csym[2];}break;
( b" V- ^) w& X; H# l2 o3 \            case ' ':case '\r':case '\n':case '\t':continue;+ t* q% k. F+ q" S& U. @7 Z
            default:
" @2 F2 D: @4 a" N" x                {nLevel=0x100; nERR=1;}
9 N/ v3 o2 J9 I8 r            }* {0 C0 K# ~( ~  }
            if(nLevel==0x100)break;
' i3 \1 u) E' @2 f0 ~1 ]            if(nLevel&0x10 || istrin>>t[2]){
6 k' u+ p( O6 z- k/ p                nLevel &= 0xF;
" d; I9 V0 [* G( A2 l  S) Q5 ^                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}) E" ?  l( y0 S  i1 q- r2 j! e% f
                if(csym[1]=='*'||csym[1]=='/'){1 P# x3 a) w$ N" }
                    GetExpValue(t+1, csym[1]);5 q; ]8 n% h" b5 ~# f
                }
& Z/ R  \! |+ M! R. m' L                else{, K6 ?. E4 A) B( S, J/ u) A( D
                    GetExpValue(t, csym[0]);
9 J; e/ L- I; M                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;/ I: h+ ~# v$ H: x" R  s% c
                }3 Y- G& R; O" U# T) I4 Y
                nLevel = 1;# |. r/ l, K) x% ~; ~
            }1 s; q- v+ ~/ V0 K( B; ~
            else istrin.clear();+ N$ I. U2 d  s( `+ h4 @
        }
$ S; M3 S" S$ m& G7 N( r  p        else{nERR = -1; break;}: T' C, Y& w, I7 |0 G
    }( g; z6 M; [$ S( s3 x# z
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
9 `3 o  ]* z2 m    else nReturn=GetExpValue(t, csym[0]);' O0 T# A5 X; b# W( K
    return nERR==-1?1:0;3 Z4 E2 }: X; S
}}0 ^3 q+ N3 u" _2 z
1 x1 {' w! K" }! e
) O& h8 \. q; ^: Q' [! y

7 u& G6 i: Z+ c6 x* A7 c2 Y/ \函数模板使用示例:, j% v, {& ^2 J* D8 Y
在以上那段代码的后面加上以下代码:# D" U6 a  f9 c. Z
: }& D. N; y  w$ n  Y% o

. u; [# W2 f* \( P+ ?8 \. X, e, {: v1 w, {
程序代码: . \8 a: g' w& H& n, ?) w8 b7 w& K

* d2 W( d. A7 E5 x% f#include<strstream>
( ~: h7 ]( c7 u) L2 U9 B) {+ i#include<iostream>
  W/ t. n6 ^6 [; _+ T# Y& |) J4 f#include<string>
+ l. p6 [5 {3 G' L6 E( X) A; [using namespace std;, d" D: S+ ?# V1 P
int main(void)
- k! h0 E6 T% X  b! }{7 a6 k1 l; Z8 _; R# D9 e
    string s1;
% w- b. `$ J" b6 Y$ e& E6 t* G    while(cin>>s1)
# c5 k1 B$ L( f' K) F  T    {5 w% _! n& \+ }3 b* d4 Q% L  p- h
        istrstream isin(s1.data());
* z8 X! |9 t1 E% w7 z5 w( g8 v        double d;9 A- @( D, K, H) h
        if(fy_Exp::GetExpValue(isin, d))( E8 B6 T- Z" C
        {, Z& ]! y' Q9 ~( P& l& F
            cout<<d<<endl;9 P- Y9 l4 o# X3 @  K
        }
; r5 Y0 x) u; y, s        else3 z5 D1 T  B9 X8 g0 ^! t) x
        {
' i  u8 g6 p) W# d2 n            cout<<"ERROR"<<endl;
' R: r0 |' i4 {- ?( `# p        }
2 w% }$ o& E3 {. z) V0 ?: g    }$ L9 n8 M( N7 S# Z; C& `: C1 k. j
    return 0;! R/ |9 D8 d! ]+ {0 O" {
}
6 g+ }; ?9 r% C
4 G! j) Z2 M2 W0 t; U5 M: C
8 N* D! I9 K" E1 [+ A然后编译执行就可以了(*^_^*)( r  s& ^  k3 A5 `2 O1 d0 S
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
) F' G4 K& M  V- N      建议使用VC7或VC更高版本,或者使用GNU C++编译

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