返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
7 u3 m. `1 J7 U* L6 X3 H  V" N1 b一个很方便的函数模板,可以并且只可以计算含括号的四则表达式6 X3 w! [0 U8 N) i8 D" \
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 C0 `; L: V, [. j- w( L% @参数解释:! a0 L6 B+ P# K4 A
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流7 H% n1 k( W5 d2 s% \0 ^
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定! F* W5 g8 i) u. X# `
返回值:2 G& B$ X& v; C+ J+ w( u
返回非0表示计算成功,0表示计算失败有错误
* s, [7 M  s2 L( m1 _9 o5 B
' r# X( ~. r* A6 K. F( m5 |* ]
0 N3 U0 v; ]' p0 a' `/ T0 R! n. U1 d! h6 E/ X0 P2 d4 a, A9 E
程序代码:
3 u4 G! T. Y$ V  J# n- B) I$ G* B# ]
( e/ R3 d% `; k4 g& G( R0 Dnamespace fy_Exp{+ w7 a- |9 j5 G+ z% V# P
namespace {template <class _T>6 _) T. ^5 u) }1 a+ ^
inline _T GetExpValue(_T t[], char& csym){1 A+ @# o& |9 }% W9 J' |
    char c=csym; csym=0;
* \8 D% p* r6 m1 n, z) P    switch(c){! T* U# Z2 W: g7 i
    case '+':return t[0] += t[1];
9 G- _9 A7 S3 x4 Y$ a    case '-':return t[0] -= t[1];
' o: a4 ~" f6 I" B  N    case '*':return t[0] *= t[1];
, o) F% h/ J' Y9 y/ n    default: return t[0] /= t[1];//case '/':
9 a6 Y+ p  ~( u! U; W% C    }
2 n& X9 R" j# y1 I/ G}}3 t( y6 N, R7 S
template <class _T, class _Tstream>
7 Q+ V0 |4 q- P( L" Q" q3 F/* _Tstream: inputstream, _T: get return value5 k5 n0 T8 E  s
* Return nonzero if get value successfully */
; W- f4 r! J  f! Gint GetExpValue(_Tstream& istrin, _T& nReturn){
6 d) F& m5 P5 I6 j2 {    _T t[3] = {0}; //雨中飞燕之作
. z" d8 c; Z, d3 G$ e) Q    char csym[3] = "++";
; Y( ]9 x( a$ E& _) t& V9 s# [    int nLevel = 1, nERR = 0;! d( `8 y) B7 }" ^, V2 `
    if(!(istrin>>t[1]))istrin.clear();2 A2 m$ Z) k' C6 k3 ~
    for(;;){; W7 A+ Z/ i/ y; J' d
        if(istrin>>csym[2]){
0 ]6 S+ q% C! M1 h5 q+ G            switch(csym[2]){* i- a* z1 Z/ m. a6 {  g, s, s
            case '(':
1 C/ M" ^7 F( @1 e, j9 S                if(!csym[1]){nLevel=0x100; nERR=1;}else7 l  y8 Z# b, e% J) m% k- V; C
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;6 Q% S0 x6 F, @/ c/ i: x+ `& A
                else{nLevel=0x100; nERR=1;}
# Y" P& X/ D, p- d  r$ u                break;3 ^' b$ m9 d6 q2 M' _2 s
            case ')':
" O8 t# X- V8 `! W* P( Z7 m2 e                {nLevel = 0x100;}break;$ J0 l+ q/ J; t
            case '+':case '-':case '*':case '/':
$ @. Y3 k& |8 U( ^, R                {csym[nLevel++] = csym[2];}break;& b/ i3 I& C/ W; P, L9 M. X
            case ' ':case '\r':case '\n':case '\t':continue;
& `( T/ r) h$ k9 Z- b% U2 ^            default:
* _: p) ^8 Q8 B! e. S1 i+ ^                {nLevel=0x100; nERR=1;}. v3 F* Z) \2 J  s1 R. m6 O: d
            }5 c# G% N( R5 ]9 [; T
            if(nLevel==0x100)break;4 g/ {7 p8 ]/ P8 v7 U' f) o  W# Y! J
            if(nLevel&0x10 || istrin>>t[2]){1 t2 R5 O: w: ^; O6 _$ ]
                nLevel &= 0xF;
& b) D- W( s( K                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! o& U7 @* e7 N; B. h
                if(csym[1]=='*'||csym[1]=='/'){
- ~* [- h# `2 c                    GetExpValue(t+1, csym[1]);6 b& Z% X; g" |4 P  V0 \$ h
                }
- |0 u: v! ]6 o  z                else{- Y0 E: k5 t$ W+ o  u
                    GetExpValue(t, csym[0]);: U8 O; Z+ {- o' {0 d" {
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
3 U( C* s  s" O* g$ s, M                }
* p5 l( \$ g+ I  M: p                nLevel = 1;/ N- D! z! C0 P" t/ F
            }
; \3 p* p  i  y7 {- }6 k            else istrin.clear();
' `" H$ l4 V8 A* F4 }4 f) c* m- c, z        }
- a  O  N: I' K0 t  A( A        else{nERR = -1; break;}
. `6 {# b0 h& O" O& q: }    }1 f7 b8 z% S3 y. m) l
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);/ v5 \" ^: m- A5 f7 l' B
    else nReturn=GetExpValue(t, csym[0]);2 \' K) M' d' ~2 ?5 ]& `6 j
    return nERR==-1?1:0;* @/ V( M1 v& [" r% o6 }
}}" K1 r  \! _9 T2 N# E) Z, ?- J/ i0 B/ |

5 l9 o" J6 L# N; s9 B- {: Z
$ l$ u5 }& R6 ~' W0 r8 x  \6 ?5 E- U- b& g; D, G
函数模板使用示例:
6 _+ W# p9 p, F$ p( k& o/ K在以上那段代码的后面加上以下代码:0 R' D% D4 F! g+ O$ v/ `( x4 s
; x+ f+ z9 w1 X! W; e6 M
2 y, w+ {6 S0 _/ Q
6 G' g' s0 Q8 l9 a% X! o
程序代码: $ \. j* Z) j& U( G
' C5 W3 p9 ^7 k. @* N4 \
#include<strstream>$ D! R/ n$ v0 |: z
#include<iostream>
. _$ H) U# k! g6 v#include<string>
! N1 v. N2 O2 susing namespace std;
& N8 e: k) g; y& i, Nint main(void)
/ P) W3 `0 i6 p3 G( }% |. l2 M{
+ M9 `/ t6 @7 |- `& l$ I, v    string s1;* g8 i3 k' q% Q, `0 w! Q
    while(cin>>s1)
7 N& E5 b  F: ~5 W; i7 W    {! p( r% D' F; ^) w0 e- C
        istrstream isin(s1.data());
$ m. t" n# \' T! _% Q5 U        double d;3 O9 o* p7 o% R" G5 R; j7 A* \
        if(fy_Exp::GetExpValue(isin, d))
, b7 a) P/ i  t& d        {
* M. ^5 G+ A, @4 M            cout<<d<<endl;
: L' }4 r+ `, H4 C' v  i$ ^: b        }4 y9 I- Q  i; A$ E
        else
+ \5 z7 w# P6 e: V7 L        {7 {6 `8 b. P) w* R* M
            cout<<"ERROR"<<endl;
9 W, q1 {7 f5 ]* g1 n2 z        }
' F! G: P* T& `% C3 K& J8 q    }
; X0 w/ w, X! I+ ]: H7 q    return 0;; N; B8 t) U. {6 j9 J$ W! ]
}
% A+ F/ B0 G- }5 R4 A0 K
( ^- _, e/ h" e  T$ s
* b% Q* m5 [* K/ O7 p% o然后编译执行就可以了(*^_^*)
* t0 \: v' q: `+ `+ c其它:TC++上一定编译错误,不保证在VC6上也能通过编译* d7 m: @6 y; ~3 i' v
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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