返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
% j5 ~, M1 h% k一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
8 r/ H' X; `  z6 l) ^只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( {+ ?7 I/ I8 ~9 S/ i9 j7 s
参数解释:
9 ?. F9 C$ v8 uistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
2 A( j" a2 c' {! b- }nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定$ ?/ e3 r7 o  P) [+ \
返回值:6 Z& K0 z- [4 T- t) j
返回非0表示计算成功,0表示计算失败有错误3 {1 H8 v& O- ]8 r

& L9 T7 Y: j: q! ]/ A5 e
* }8 Y4 }' G0 C7 E8 k6 R* j1 e) @8 O! ]3 y# z4 S5 f
程序代码: ; w; e3 C4 N; p" ^

8 f5 k; I  |. c( R4 hnamespace fy_Exp{
2 L4 \) h3 j5 t' `' Cnamespace {template <class _T>
" H4 i: P+ ]5 g# B& Tinline _T GetExpValue(_T t[], char& csym){$ U: b6 ?5 `9 [: ]- i7 I
    char c=csym; csym=0;+ R6 V' x6 r* s& x
    switch(c){
$ ?/ S( s2 }, D7 T) l- u    case '+':return t[0] += t[1];- f- A; v3 e! |# i' z
    case '-':return t[0] -= t[1];
8 }( Z2 `9 L8 b0 U" R    case '*':return t[0] *= t[1];$ u& d5 }/ I" P1 D9 y6 Y
    default: return t[0] /= t[1];//case '/':5 ]' @1 U: V/ ~, d9 E2 _* d: D% C1 H1 h
    }( @' n( ~8 D" h7 V
}}' m" W0 K: M' B' U
template <class _T, class _Tstream>4 A" w0 H1 B) E! X1 x9 X2 L
/* _Tstream: inputstream, _T: get return value& g# a: `' q: ^. t; K0 [$ u" g: E# E: N* x
* Return nonzero if get value successfully */
9 ^) i0 m* u( T0 I( t- g% ^% |- Sint GetExpValue(_Tstream& istrin, _T& nReturn){4 |9 R+ P) l! E3 s0 b
    _T t[3] = {0}; //雨中飞燕之作; f& o: g# Q) F# m
    char csym[3] = "++";7 L8 z4 Z0 L! z5 k. r0 P1 z. ~
    int nLevel = 1, nERR = 0;; `" o" u5 C' p$ ]3 g
    if(!(istrin>>t[1]))istrin.clear();0 s; H' q( y! g  Q
    for(;;){' r% m0 j0 M6 y: {
        if(istrin>>csym[2]){
9 O9 T9 \1 _* X& L. @( Q            switch(csym[2]){
7 z; u- ^# X, h# O& p+ A            case '(':" A- M) m! m+ n& V* k! m
                if(!csym[1]){nLevel=0x100; nERR=1;}else8 z3 a4 T1 k& ]4 U, P5 X4 q
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
2 M6 L. K8 {+ t  v% I                else{nLevel=0x100; nERR=1;}
6 a" b* V. D$ e8 ?                break;
( H) Q1 [; a" s( K            case ')':
: D' Y# ~5 C( C* G% Y                {nLevel = 0x100;}break;3 M9 |  @8 R1 {1 ^
            case '+':case '-':case '*':case '/':: w5 J) V' r* g  k( I8 g; L- N9 n. {
                {csym[nLevel++] = csym[2];}break;2 w% i5 E3 W+ R
            case ' ':case '\r':case '\n':case '\t':continue;
7 ^: V* l/ v8 t5 `2 f5 r6 I% c; @$ o            default:9 b- Y8 g; u) |) |
                {nLevel=0x100; nERR=1;}
- F# S7 E4 D* F4 D: D$ N            }" [* l+ L4 Q4 a
            if(nLevel==0x100)break;
" ~) u) P* {  t- L) c# ]" y8 J            if(nLevel&0x10 || istrin>>t[2]){, T; y5 \* q/ M) j" e$ @4 }. u
                nLevel &= 0xF;
8 L4 D) K: n7 S                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}9 x: x5 o% g1 \% `7 t. x
                if(csym[1]=='*'||csym[1]=='/'){
5 b/ a. F7 N2 H6 P9 [7 H* A+ G2 }                    GetExpValue(t+1, csym[1]);
) f: k% i. V5 P; a1 b1 o+ T  C                }1 I. U5 U% |4 k4 S) x1 V5 a5 ?% J
                else{! |0 N1 q/ c; U( J# Q
                    GetExpValue(t, csym[0]);
+ Q3 V- n' b/ F                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
+ a$ f; h% L* L3 n$ Q8 T3 v; [& n                }
3 S  s. d$ ]/ a$ ]) h% R0 F                nLevel = 1;
. X* V* r3 f" U0 K1 `2 j9 V6 }            }/ K$ u" @+ s+ f% L: ?
            else istrin.clear();! R( K7 c# V8 Y, o
        }
; n: Y- d6 K% r, i( x+ K% o! @6 k: \        else{nERR = -1; break;}
$ i' G% j6 @  W- V    }
. _: d( G9 t. ~1 A7 a4 i( z    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
. g  M4 b/ O3 a& }* U- Q    else nReturn=GetExpValue(t, csym[0]);
6 r. n$ q! ?$ j5 ]+ C    return nERR==-1?1:0;
( e' h+ A0 {9 A; _' k. g5 W1 M}}
# L# U4 S8 w- `) U# g1 M& g- N9 ]
3 r* R9 }( x1 k, O

+ U0 O9 M+ M- Z1 ~5 U函数模板使用示例:
3 W; z1 p5 T3 k! L$ S在以上那段代码的后面加上以下代码:- \# B4 L. n4 ~' |8 w

9 _7 o; v# O+ C+ f : h7 b# h+ h' `, J# \7 [

) u  t. l  ?8 n" A; n& q: h程序代码: / ]3 G# b' q' b

; _: p, b: u% L: @# y#include<strstream>9 z; K# J5 a" @0 H! g+ @0 r
#include<iostream>
) p5 q# v! y, s8 ]. p0 O#include<string>
- `" r0 k# z! j4 s& A! tusing namespace std;- u3 R! F; q, N. s* c, S; `
int main(void)
" ?3 n% B  V  K0 {6 @& i{
  u% h5 |. y% h" O& A# K    string s1;( ]3 e( d7 ]/ @1 x% k# x
    while(cin>>s1)
, [0 f- A6 r; @: N' x9 L# @6 F$ M+ U    {7 E* U3 V" G5 L" R. u% B; J- l9 g
        istrstream isin(s1.data());
) X) T, T: f7 N6 z4 m' S        double d;6 h  n" W* n0 M# |+ }) R
        if(fy_Exp::GetExpValue(isin, d))
+ C+ [1 y# s5 C" v9 A# W6 g: Q        {
$ l% z, z/ [7 T3 b            cout<<d<<endl;) }" X, `+ w! B4 W
        }
3 d" o! ~! o& G        else
7 P$ L) ^2 C) [0 w6 b, q. W, j        {
( e3 O/ F) U" D1 G# `            cout<<"ERROR"<<endl;& d9 ^) U# n+ T) G+ s) t- [
        }
3 C& [0 l$ C: F0 N7 q- E    }- v+ i4 j6 K! t9 E
    return 0;3 k. c; e( t8 u1 b
}
# ^& w% `2 q) ]; \7 H* I9 U) P- ~' q: g0 h
" j" M+ z( E% t! w: w
然后编译执行就可以了(*^_^*)
6 B# F. p# V$ Q& K( ^) V1 T  Q其它:TC++上一定编译错误,不保证在VC6上也能通过编译" U, [( W5 w! p& r
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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