返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,1 i8 x7 Z: [" y6 F
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
: \/ k, s) ?7 P只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
) W/ e! @. a6 Q5 g参数解释:
+ p9 D" d% R- U+ Histrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流# F- b3 h0 ?8 p- |) P! x
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定$ M, _% R: P. H2 ~$ ?
返回值:+ Z  E6 W5 S! y! f* f1 X$ g/ u
返回非0表示计算成功,0表示计算失败有错误
& @7 g  d0 B/ R$ W- t7 \7 K0 L$ U1 w7 h. y% `
5 Q4 s) R4 z6 A/ _4 J! P4 G7 [2 O% n

0 b, `. {6 i; F; W程序代码:
5 c+ U4 p5 z8 D1 ]- W8 z
* W! m/ K# ?, M8 m( M6 jnamespace fy_Exp{1 @2 h( t. I0 X+ |2 I6 f5 g
namespace {template <class _T>2 [% w% F9 o% K$ S" O0 k% ]
inline _T GetExpValue(_T t[], char& csym){
* T' R% F5 w, f* D" t# @  q    char c=csym; csym=0;4 f) f6 H/ U0 f" j
    switch(c){
9 H8 C* P1 _! F  a- x% A    case '+':return t[0] += t[1];
1 h+ D) t* S4 ^  V* Q  U    case '-':return t[0] -= t[1];
; w( {; \9 g: |! X( z    case '*':return t[0] *= t[1];
6 w( i0 v+ y0 q  |  U    default: return t[0] /= t[1];//case '/':+ f+ o# j, w! U+ {/ o1 D
    }
6 ^6 r# i" f! g( X. ~}}
- t- V" G) S; K0 U, V  Z. k9 Ptemplate <class _T, class _Tstream>2 s) i5 Z$ X# P
/* _Tstream: inputstream, _T: get return value
# E. ?; `0 E1 ?& M4 b2 T* E! c- K% @* Return nonzero if get value successfully */; _) |; s  V. z$ @( G: _2 E2 U$ F! h
int GetExpValue(_Tstream& istrin, _T& nReturn){
/ I; Q, @$ X1 M  A9 O    _T t[3] = {0}; //雨中飞燕之作& `6 D1 o2 G  v8 O2 X
    char csym[3] = "++";2 A3 z2 x2 e' A9 p+ h9 p! C4 N
    int nLevel = 1, nERR = 0;9 E: t6 H3 N8 U6 W& M3 S7 A
    if(!(istrin>>t[1]))istrin.clear();
6 l- Y- h+ l1 b- D5 W4 R% |: s    for(;;){
8 Q- p0 u* q5 q6 Q5 e2 v        if(istrin>>csym[2]){: |$ o1 N! ]; U. c3 Z+ |. K
            switch(csym[2]){1 h& d* [( ]# B% L
            case '(':
: p8 Y8 f& x2 O. k3 a: `8 {                if(!csym[1]){nLevel=0x100; nERR=1;}else) s+ t/ k! _. \- q5 Q
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;  ~3 p6 x$ ?. `
                else{nLevel=0x100; nERR=1;}' Q* g' F( m- @1 z) n5 j
                break;' S2 j- ]& a. ]4 x& X$ S! f
            case ')':
* V8 r0 ?9 q- u                {nLevel = 0x100;}break;& H9 F8 T# u- k5 E2 u
            case '+':case '-':case '*':case '/':
: L4 ]) w( {9 D. y8 |                {csym[nLevel++] = csym[2];}break;
! v! s% D% K5 z' ~( S: I            case ' ':case '\r':case '\n':case '\t':continue;
6 j  V7 [/ H  D            default:: q# A, r" e7 ^4 h3 l3 @  W
                {nLevel=0x100; nERR=1;}
% Z4 t- z7 h  b3 \( |) Y' |            }
, m  L5 o1 m6 o6 O# t2 d. w            if(nLevel==0x100)break;$ g' y% f1 d) D
            if(nLevel&0x10 || istrin>>t[2]){
" M2 i9 y2 P! m  Z. u                nLevel &= 0xF;6 m" {" A2 Z% O
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
; r" r; M  S2 v4 H, W" c- K2 ]                if(csym[1]=='*'||csym[1]=='/'){
" V- r9 g! O7 X6 e9 x( p4 s                    GetExpValue(t+1, csym[1]);
, u- K8 Y+ V/ u                }
- p6 c7 \: r# B8 B9 ]1 s8 ^                else{/ F: x$ l! a* O$ c  M  ?: U4 _
                    GetExpValue(t, csym[0]);3 a2 Y/ Z5 u2 |+ P: s* M& Q+ u7 u( ^
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;. g& w4 ]# z6 ]2 N6 G/ s. `, F
                }5 E/ N) E% d9 U$ c5 u+ ]; W
                nLevel = 1;, ~. ~- W* p  P7 B6 ^8 u5 ^
            }0 s& w4 b/ E! f+ _7 ]- V# d% N3 S
            else istrin.clear();
5 E. x' L, X8 T- k- J2 V8 V" h        }  f/ x' I3 E3 q- r
        else{nERR = -1; break;}
2 K7 K% b1 p6 o5 U/ ~    }
4 U8 ?- X" D+ a# C+ w; W    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);# i% @0 _& g+ c) i. r
    else nReturn=GetExpValue(t, csym[0]);
  L8 h5 o% t* K2 c& P    return nERR==-1?1:0;9 P' S. ]0 J4 `8 V
}}
! o; f: S# `& x/ B! p# K' b7 A( |8 g8 S$ ^$ z5 r
. P6 u' T' ?* m7 s# s, R% |

, I) {, n$ k( V- J  M0 p函数模板使用示例:2 @% ?, j% E4 _+ s; D
在以上那段代码的后面加上以下代码:9 V$ C' C' Q+ m, V4 o( y

& s' g2 _8 Y# H, J' m4 A) Z9 p
* p6 }9 ]! P6 ?2 B/ o  `- L
# W& u, \2 ~5 C+ H4 e7 \- |. n程序代码: 4 ?& N& H# `; ^* D# w$ q5 n
# \8 `% u. Z( B* P6 b5 A
#include<strstream>
* D3 q; D* S0 r2 J#include<iostream># v0 g- J2 T, I* e
#include<string>
) ^) ^5 T* j' m/ j6 y! W: kusing namespace std;+ e: v3 w  E4 ~" _9 O6 l- B2 s
int main(void)- ]$ I$ r8 `0 U
{
- k9 f! H: _/ Z    string s1;, y6 L# z3 J5 A% ~
    while(cin>>s1)
  x. q, g# r5 T( B* y    {0 q( W! o$ s  M
        istrstream isin(s1.data());7 L- Z7 _0 a1 B* N" c! g
        double d;  o% t2 {9 g# Y$ Q6 W' w; A
        if(fy_Exp::GetExpValue(isin, d))
5 A2 D0 p9 y" v! K  b        {- o+ X$ F0 r) \
            cout<<d<<endl;
" }, ^, ~8 V& c: S$ D1 y# _        }
/ L  i  H; n4 T" B        else0 ]7 m$ S) Q- O/ r" A4 ?" }
        {
. u7 b% ^: f4 `) Y$ u7 x8 G+ G            cout<<"ERROR"<<endl;
4 T: g0 r! E* Z& D( e$ T$ q' [# ^! D. c        }
" v  L, @  @( F6 z* p, ]    }
' s$ U" x% s9 p    return 0;
: `; Q6 [. g1 _2 e2 X}- }8 L$ N' W! H' R. F7 c
, K2 s+ e) i  L* e2 {' Z; F, b

' O, b# G% j) u+ S3 X8 g0 v然后编译执行就可以了(*^_^*)
3 ?9 ?2 d% w$ i! {其它:TC++上一定编译错误,不保证在VC6上也能通过编译( c! e- J  w+ @3 L1 L
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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