返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
: ]; e9 d; x8 {) q+ Q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
9 d3 V5 y2 V- K只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)3 l: |6 K, w( ^  s) A6 R
参数解释:2 S+ }5 O7 ^+ ]
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流( n  B* I; w, \# \$ T& `
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
8 R' J' r0 t% J% _返回值:
6 h5 D  O) k/ S  T/ u2 l5 M返回非0表示计算成功,0表示计算失败有错误, v, H& r5 m8 J' o# i3 n

( L' ^2 g' k4 ?  P9 V; j
4 n# J3 f: U- Y: F1 F
2 C' v+ o5 b. A程序代码:
7 L( J- w! Z0 `2 T! k+ Y4 T8 ]" i" d, h) y
namespace fy_Exp{
( V$ l# l0 U4 {namespace {template <class _T>
3 H. P1 d1 I% O4 O' Ainline _T GetExpValue(_T t[], char& csym){
% E. D0 R1 o1 t3 l    char c=csym; csym=0;
' x, ~2 Z' q. U% ?# i    switch(c){7 E7 ^* e( q# D- Z
    case '+':return t[0] += t[1];, i3 ~, G; W- E; f3 ~: ~
    case '-':return t[0] -= t[1];
- H9 r; v3 x/ L2 D) H, J5 N" Q    case '*':return t[0] *= t[1];
" Z8 T+ i2 j- y- k) c    default: return t[0] /= t[1];//case '/':
4 f: O& J* C; _+ V  C; N# @2 i2 s    }' w" f- ^8 x- l
}}
0 d9 q  H; D) N. t: Itemplate <class _T, class _Tstream>8 A5 ?2 `8 c/ h6 B
/* _Tstream: inputstream, _T: get return value
; b3 q/ X1 r" x+ P3 e* Return nonzero if get value successfully */
" T* o% h* K6 H  U  g1 @- o# x+ lint GetExpValue(_Tstream& istrin, _T& nReturn){
0 n1 H+ q) M8 U/ n    _T t[3] = {0}; //雨中飞燕之作
' h* g  v5 S) C) a( p    char csym[3] = "++";
  B, F$ T1 D" m5 j    int nLevel = 1, nERR = 0;& l, ~- [' R& v
    if(!(istrin>>t[1]))istrin.clear();- g" z+ o8 _  C5 Q0 C0 u3 ?4 m
    for(;;){+ s" i) S( H/ s! n8 k2 E" T
        if(istrin>>csym[2]){
  l* J, Z. w7 o: I- E1 }            switch(csym[2]){
% Z9 y8 I1 G1 `( e3 k5 T" u6 O2 _            case '(':$ s6 [/ C2 C- }7 F  L
                if(!csym[1]){nLevel=0x100; nERR=1;}else
& n: Q" N* p, ^* _* h$ l                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;8 {; \& s" ]8 X7 f
                else{nLevel=0x100; nERR=1;}; c$ ]8 j+ ~1 x, i/ I
                break;
: M* N7 _3 f! T+ `3 _) |& m- k$ g6 E            case ')':
3 J' P7 ]! O' \! V7 r                {nLevel = 0x100;}break;- J& v' `- ~8 Z- v
            case '+':case '-':case '*':case '/':
2 s) l7 X" q; s5 W- v                {csym[nLevel++] = csym[2];}break;
$ P' A+ ~" j8 M+ s            case ' ':case '\r':case '\n':case '\t':continue;8 s3 K* b5 W# O% k8 V2 f$ F
            default:9 Q" n. e8 Y+ z
                {nLevel=0x100; nERR=1;}& x* E5 X+ F* ]
            }
& `" |; X5 w" c* D9 V            if(nLevel==0x100)break;
# x4 s2 ~4 c1 `; N, q0 `            if(nLevel&0x10 || istrin>>t[2]){
  ]- U( @; C5 d( l* X( A                nLevel &= 0xF;3 l; t2 X: l, V, t7 ^) {: F
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
  A. V6 f  ~' O% e5 z$ q                if(csym[1]=='*'||csym[1]=='/'){& l9 |2 b# \) ~5 h! L+ ~. y
                    GetExpValue(t+1, csym[1]);1 Z/ f) k% w5 c$ z
                }
: I$ }( F3 d6 f  q7 K5 {                else{
& g6 E% H  z5 s$ u7 r                    GetExpValue(t, csym[0]);, @! A+ p2 X+ w6 s) q- ]
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;' n& {! g/ g5 M# X7 P0 F! L
                }
6 }! E- e" ~# k8 N                nLevel = 1;) F. S8 P) f2 F9 m( S/ R# w2 `
            }
  _8 \& O: ^. ]; V            else istrin.clear();) f9 g8 v. ^9 M/ g
        }9 v  _; e1 r4 c1 {" f9 x% x8 {- d6 R
        else{nERR = -1; break;}# c8 I8 G3 z% e7 _
    }
) `* b! U8 p) e9 V* v- v: n    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);( Q& `/ L+ W6 ~0 M( D" q
    else nReturn=GetExpValue(t, csym[0]);8 ?* }% C+ X/ G1 q1 k# L
    return nERR==-1?1:0;
) c; Y+ {" s* j  O}}9 o$ r* r& Z) T2 V/ K+ e- o9 L
% J/ S9 A7 q9 ^% V6 |

3 ]% K+ L6 p* |% z5 b( I7 ]  H4 k: v; S8 i% H, k7 n
函数模板使用示例:
8 M$ e+ V. L6 v; ?! S在以上那段代码的后面加上以下代码:- G( f. o: {2 z, H: J0 m
' ~8 O1 S" _; T4 d7 s+ U
3 F# x: `) b6 V: }5 H
. `1 [6 e" X+ S/ D
程序代码:
* D; i7 ~( E* x7 Y$ f; V: s- ?( @0 c) q& S. C9 n( u' C# X
#include<strstream>
( v2 i& T7 G8 S$ X4 l* X  p5 V#include<iostream>
: n+ g. \8 y8 e1 @/ \! a4 [! Y#include<string>
" V8 l2 r. `5 P$ a- a( ]9 f* busing namespace std;
1 F1 r& d) o8 }# q& \9 Sint main(void)
0 W( E# t% H4 d{
" K$ l5 M) E" j! d: g4 E/ G    string s1;
: @' |. Q3 X1 ?    while(cin>>s1)
: U! Z* z$ L# }! I    {
$ d0 g* N0 W/ r3 d: }. h% I        istrstream isin(s1.data());
& H5 n- t$ ^" u& m. M        double d;
$ ^8 n& f- j; @! w4 s        if(fy_Exp::GetExpValue(isin, d))
6 q* x( s8 ?8 ?% S: j/ u% P  q2 n6 {! a        {
* y+ t& N% W1 n% m- \' B' G            cout<<d<<endl;/ Q  n) A) D$ @. J+ O& u1 S
        }9 y8 z& f# l. h3 z4 t
        else1 n$ b7 \6 r. c5 a3 I
        {# {) W# Q: i3 k1 g8 @$ r' s: Z: V
            cout<<"ERROR"<<endl;; q: z1 H7 F9 G4 _8 b; P
        }
* J4 T' p) [2 h8 p' r    }
1 q" ?/ F# ?/ \8 J, B    return 0;
7 J' C$ G. Q7 {- {$ Q( [}
8 ~% x  p5 v$ X3 b) U+ Y4 g# @4 N3 S; C0 ^! a7 N' \/ K0 w3 _
% i9 [, n7 a8 }# w
然后编译执行就可以了(*^_^*)
4 T+ ^* e+ P* C6 c其它:TC++上一定编译错误,不保证在VC6上也能通过编译
5 A  ?" _3 v4 H0 `      建议使用VC7或VC更高版本,或者使用GNU C++编译

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