返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,6 k1 W! {$ N8 d- z& ]2 p
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
: i7 s( n+ d# b0 l) Y只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)0 s8 o! m% I1 z7 T
参数解释:
7 g+ G/ Q: L8 u7 W! ?" @: m  cistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流& X8 Z/ K: z( j2 d, G( }9 }
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
* v* q5 D2 L! M" m; y返回值:
( P. j- W" [! h* y* L返回非0表示计算成功,0表示计算失败有错误+ f- o9 R1 q7 |% D4 w% s6 A

& N' ?' W! c% {3 Z 2 k$ S% V5 T% Q* `5 g- G
- o. N* S% k# a9 F7 p  Y" S
程序代码:
; `; o3 T/ J. x! Z! R! `
& m- T9 _; y: ~3 k+ _namespace fy_Exp{
1 s" P# E/ O4 F7 k. O  ^namespace {template <class _T>
$ x. T! G1 j0 X0 |+ g* C9 Ainline _T GetExpValue(_T t[], char& csym){" t7 o! q# ?. }. Z
    char c=csym; csym=0;& j1 V/ S# G# p
    switch(c){9 `5 x8 W+ {) J/ a& R! V" T
    case '+':return t[0] += t[1];% w; X2 u1 j' c7 U) o) p( {
    case '-':return t[0] -= t[1];
9 m! m8 c9 g8 L8 y. R    case '*':return t[0] *= t[1];
0 Y$ w( s: K! |( P  J    default: return t[0] /= t[1];//case '/':
  S' b- [0 d/ D    }% ?* K: l/ a! P7 X) H! }+ z5 X
}}
: C1 H  _% k2 c& ]" o# B5 Itemplate <class _T, class _Tstream>+ m- M$ A$ k$ l& [$ G
/* _Tstream: inputstream, _T: get return value
5 E3 v8 N; g7 r. s4 t* Return nonzero if get value successfully */2 y# d2 h/ Y+ [2 L- C
int GetExpValue(_Tstream& istrin, _T& nReturn){
' {, y9 ~1 U) N8 j# r    _T t[3] = {0}; //雨中飞燕之作
+ J& i2 ?* {/ [% G; l    char csym[3] = "++";
$ J. q1 V# j# k/ T4 G" M/ \6 {    int nLevel = 1, nERR = 0;0 Y* k. b6 [. m8 v% E* u
    if(!(istrin>>t[1]))istrin.clear();
' i0 w, |) a0 r& \    for(;;){1 i! z& G& h# E* y8 f8 |* o
        if(istrin>>csym[2]){5 M2 G7 {7 e4 l2 s7 Z; N$ d
            switch(csym[2]){
$ l1 b9 U! b% h. ]6 t4 t/ n            case '(':
) W" l. m3 N; K$ ~9 k, H8 }                if(!csym[1]){nLevel=0x100; nERR=1;}else) P6 Z% f' S. \
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;! p# x( L# C# @% r3 r: r
                else{nLevel=0x100; nERR=1;}3 g* y& o& d. }! ?, d0 C% D
                break;* j1 j! v* S' E. C
            case ')':
- m. p" r3 P/ a/ k2 n. r! m* `: v                {nLevel = 0x100;}break;6 Q! S8 [. S0 e$ t
            case '+':case '-':case '*':case '/':) ?1 s. Y7 c6 E0 t0 u: P& P9 B
                {csym[nLevel++] = csym[2];}break;
1 l- E9 U, v- R. _            case ' ':case '\r':case '\n':case '\t':continue;: M2 }: F; C7 U) F. ~% ?( M
            default:- {0 `3 ~) k) _6 l) H/ c6 a
                {nLevel=0x100; nERR=1;}
2 A0 p! ~( u9 n8 w" u( Q! W            }3 j' a' ]% A: w
            if(nLevel==0x100)break;
: ^! k; f  B% H2 q' s% j" p$ s" M' b            if(nLevel&0x10 || istrin>>t[2]){; G8 l4 [. \0 T& t
                nLevel &= 0xF;  q, a) h" a; @% R
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}% @8 M. O( G' i3 [. C+ `
                if(csym[1]=='*'||csym[1]=='/'){
6 l3 l4 ~, {8 y* _7 @$ V: a                    GetExpValue(t+1, csym[1]);$ v6 _* f5 k8 k7 q% f& d) Q
                }( c# m) E) H% L! K" V% d( H
                else{
2 }* K& Z+ A9 b' m/ b                    GetExpValue(t, csym[0]);
9 p' ^  S  k% J5 G6 P, y                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
9 j) f$ B6 G3 p6 U8 `! d) O6 p                }
- S0 z  D# P- c                nLevel = 1;
% f& B2 g) Y' _* O7 I0 J            }
8 ?) b. U" e5 C9 j            else istrin.clear();
* r3 o; j% |0 l8 n        }
1 P* p9 E$ `" |7 ^5 T$ p- M        else{nERR = -1; break;}
# r2 r+ b8 C" x8 t    }6 i. k# k+ d* b* i
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
1 B8 h- h: t" T, }$ `# G; H    else nReturn=GetExpValue(t, csym[0]);
! m: Q' S* [! p9 E* ~/ O    return nERR==-1?1:0;; L. ?/ U7 C! K
}}1 L& z1 N) P- K: k4 l0 T! d

! z! n# B7 _! Q4 W1 _4 ^, [. X, N5 D( E
$ n( W+ S  @- D6 {& j& N" ^2 i
函数模板使用示例:
2 z; s" F* m- w* p# G- R在以上那段代码的后面加上以下代码:
. L2 c. J! R# q1 @, }' D+ q( ?
! w6 t& X8 h6 ]4 y; u/ | / O0 V" U0 H/ q8 D/ C9 z1 B8 t

9 A( [( f7 e" U程序代码: . ~1 F8 x3 R/ K4 P! ]
. s8 W/ w) l' S+ u8 X' S( r
#include<strstream>
4 ?' T9 J% I6 R#include<iostream>
+ k/ ~& l7 E% B7 U2 c#include<string>
: d4 @8 D7 N8 S0 y: t9 z- U/ w& G1 \using namespace std;4 j0 w/ t7 a5 s9 i/ C
int main(void)' F. P) v0 R' X# P8 ?( u
{
2 F- o9 U, K5 n5 a2 i$ T+ T1 {. O    string s1;
- Z% s1 D+ c" w7 F    while(cin>>s1)3 u2 R/ ?6 g* u' a* A
    {6 w/ }* ^% I& I3 d
        istrstream isin(s1.data());
$ R6 o/ v9 |0 ]8 z        double d;2 n$ ]6 _* R+ \  O  f
        if(fy_Exp::GetExpValue(isin, d))0 g0 l& \6 u. |1 Y' j5 Z5 \& }7 j
        {; b9 M8 }% S0 R% I
            cout<<d<<endl;; T5 ~6 m0 b  O! A# i" o
        }
; ]8 F* d& N* ?; H9 l        else
7 s0 {( c/ W+ @& M        {6 Z0 H* p5 |" i% _# F
            cout<<"ERROR"<<endl;) X" P: v- K& e# V
        }7 v. S/ G6 o( B7 C9 k7 I2 h% y# C% u
    }6 e. _0 u5 @: L& I
    return 0;$ ^9 b; v7 c% ~0 V' k8 Q
}0 z$ T1 i4 D6 g, V+ P. K

1 E9 R- z* C5 j4 ?8 I
9 t0 M4 ~  X$ x' y# h. s然后编译执行就可以了(*^_^*)
( h5 z3 Z# o9 W% [5 Q7 \' |其它:TC++上一定编译错误,不保证在VC6上也能通过编译
/ d/ V. u6 m3 R7 x1 x% u5 i/ p      建议使用VC7或VC更高版本,或者使用GNU C++编译

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