返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
, ~* f% j# H2 V; }# S3 V' R6 a一个很方便的函数模板,可以并且只可以计算含括号的四则表达式; b# c' d( U# t0 z$ z; e% x
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)8 c9 n+ {' \- o0 i: h( d
参数解释:5 |, a/ z$ `- M
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流3 V# z' D' c! @" C4 V; U
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定0 C6 C' Y' O$ ?- W; A) G, f0 M! I
返回值:( u( Z. i8 C: R2 h) A! b: ?( T) c
返回非0表示计算成功,0表示计算失败有错误
6 O% B/ ^+ @8 C) s7 P8 D8 v+ H% Y, T5 x9 R

+ n( U3 A5 L( L. `2 |3 S' p/ Q+ t$ M  A$ [& ?1 H: s3 M
程序代码:
/ }# U3 @' i' _! C! \8 ]: |) C" P5 _! e7 E7 z: n) |
namespace fy_Exp{
3 N' e5 m% Y: R# p0 J+ W0 U8 I1 Lnamespace {template <class _T>  C3 r  Y2 Q. a8 }: X
inline _T GetExpValue(_T t[], char& csym){) i( y8 s( V- h
    char c=csym; csym=0;
' x7 G; j' `+ C+ |/ d$ u    switch(c){$ O0 W" i, K) m3 c7 G% H
    case '+':return t[0] += t[1];
$ o0 L' G& E( [& x3 R  d) ]1 N' t    case '-':return t[0] -= t[1];/ N9 F' x3 d6 g6 N) H+ u4 p7 ?
    case '*':return t[0] *= t[1];
$ M. R: p4 u5 g" R9 o* D0 O" V    default: return t[0] /= t[1];//case '/':9 {. R9 B3 P, f% r8 C* t; Y; \
    }/ t: w& O, d+ u. e1 {* _5 f( f
}}1 {; j# w: N; R/ G8 j
template <class _T, class _Tstream>5 {! B4 ?% ^3 ?$ V* Y
/* _Tstream: inputstream, _T: get return value
5 S2 n( D, W6 S5 V/ A* Return nonzero if get value successfully */
" Z0 J! @- \3 I4 |7 Mint GetExpValue(_Tstream& istrin, _T& nReturn){
/ n8 |: C; G0 O7 x" h, J    _T t[3] = {0}; //雨中飞燕之作9 S- l) a- A1 l6 G/ s
    char csym[3] = "++";8 N7 S( m* x2 `* E% `! i4 S& T) X6 x
    int nLevel = 1, nERR = 0;/ T7 n  R9 Z7 B4 z& B1 w
    if(!(istrin>>t[1]))istrin.clear();
* r6 \  J8 f7 x% [0 ~  c1 t; y    for(;;){/ ]4 f, \8 g, @4 e/ T( c
        if(istrin>>csym[2]){
. M/ n* t" u* L& i/ ?) q' `            switch(csym[2]){( Z% i- u! g7 Y) u7 B1 V9 ?
            case '(':. R) }- q2 ~8 d+ \& r
                if(!csym[1]){nLevel=0x100; nERR=1;}else: X) S& w0 q; x4 R- T
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;0 |/ E1 G" _% I$ J
                else{nLevel=0x100; nERR=1;}
' |* S  L- f" l7 n  l/ k                break;+ D4 u9 v; B" w  k
            case ')':
& B5 B: |0 o" f+ A' |- h                {nLevel = 0x100;}break;0 S) f! s1 n" k& H" c
            case '+':case '-':case '*':case '/':' v2 [4 u( f* B1 t6 j3 H
                {csym[nLevel++] = csym[2];}break;
. c9 @/ l5 Y. ^6 ?3 Z! N' C4 x( K            case ' ':case '\r':case '\n':case '\t':continue;& V; A8 [9 `& [
            default:
, _( A# ]4 m$ w- X. k                {nLevel=0x100; nERR=1;}
/ q: ], y% Z# H            }
& ~( q/ W5 Z- E9 y6 F$ B            if(nLevel==0x100)break;
) G2 e  ~. o) q9 r9 g. A, B. |            if(nLevel&0x10 || istrin>>t[2]){& B* I) x& X8 s; O* S
                nLevel &= 0xF;
$ X  b8 {# v$ C% H$ H" r                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0 R2 t. ^' a- x/ r+ D: y9 \                if(csym[1]=='*'||csym[1]=='/'){
# N% B: W7 K3 \0 r6 @% ?                    GetExpValue(t+1, csym[1]);
. \7 {6 @5 Q+ q2 T' k* E                }( ^9 }5 k9 _. q
                else{/ t' B: t! }  k5 a
                    GetExpValue(t, csym[0]);+ g, ~. q9 k9 a5 B
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;. {; K# u) \* A3 {
                }
& A- r6 E1 k- o8 t' Z+ P                nLevel = 1;
" L$ S0 E0 B6 y% h0 C' h            }
' z4 N8 [( o) h3 l            else istrin.clear();
6 |/ i& `& [, t7 `9 C# f! V        }' P  a' K" F( t/ P3 E! M' ~' C, @
        else{nERR = -1; break;}
, q/ M9 W- ^5 ]3 Y6 ^0 t: ?7 e; W    }
' p; d4 B3 p/ O5 E$ h$ [. @% |4 A    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);( w/ V% c5 B. g$ j/ R4 [0 v
    else nReturn=GetExpValue(t, csym[0]);: h; S9 S4 J4 J8 ~* J5 L2 k
    return nERR==-1?1:0;; Y; y4 {2 W# y% _& `8 w
}}
" ^  y5 b& B1 J
9 m4 K5 Z9 s3 R" r5 i7 E, i2 a: s& K3 K8 L9 p
7 g; E) g* D* Y/ f
函数模板使用示例:
% m% ^* L$ l% A! U0 O在以上那段代码的后面加上以下代码:
  e1 o. d4 O+ |" L8 _1 O/ W- V! F- r6 {

6 ~8 v% ?2 L7 s% I" l' c' \1 m
; x, g7 i. n. y程序代码: ) `2 i& }# ~. [7 M4 x0 G9 G

: x7 t) }9 y# g6 ^. ~#include<strstream>
& J7 m2 T. H! w- p1 K. [0 z8 C#include<iostream>
# R/ S. F% @3 q# u. Z#include<string>
1 f! d  T6 U3 s& }+ J) kusing namespace std;; h) }! J0 t& [% H( S7 L* a
int main(void)
/ f+ w1 I4 H4 W3 U{
! T2 |! Y) B- c& S    string s1;
) }4 p4 F( d2 M0 N- ~) H3 n    while(cin>>s1)
* N+ L$ Q: a- W3 Z    {; d# b$ g! s1 W( I
        istrstream isin(s1.data());+ f3 C( H- w. ]" p6 `% `
        double d;
" ]" l0 X$ J  m* H3 J8 E        if(fy_Exp::GetExpValue(isin, d))
6 ?5 K  p$ h$ C* ?        {$ F- Y2 I$ v6 J/ D
            cout<<d<<endl;  p4 O) V9 b$ |( w  t
        }
" }; K: z3 t# f* e) K8 l- t, l        else
8 D% h: i/ G* S( U" M+ S0 C        {; D/ K: ^$ p2 m' o7 i
            cout<<"ERROR"<<endl;+ `+ W% v; w2 z3 C6 ~$ b
        }4 v  \8 e' d) G# \) X+ Y
    }
5 x9 s- I/ E" l8 f+ s& d1 z$ W    return 0;
9 ?& `, h4 T2 d1 Y& `}
, p9 B* q) Z: z( F  i. x
  L, ~. d" B+ u3 {. x3 f; r  T- }% k# m* D; n# W
然后编译执行就可以了(*^_^*)
& {/ s5 N& U' `% a( ^4 O其它:TC++上一定编译错误,不保证在VC6上也能通过编译+ u7 ?9 x1 {) t: |6 o4 f
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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