返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
# L/ @0 p6 [# I9 u' a8 t8 ]  W7 }一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
+ o# Y/ s8 O; p( |2 R只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
. B' m* q: D0 T2 v7 R4 \% @2 M参数解释:, h2 K0 u4 s; C4 R# q- x2 g/ \
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
* K- u4 j$ ~# P* t& E+ ^% p, _nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定2 k: @- n' Z5 B2 x: R+ i
返回值:
* o& W( a: e; a5 v9 q1 |" I返回非0表示计算成功,0表示计算失败有错误8 x9 ^% Y% x: X; F1 H, {

: L7 O( j2 ^. b' `% g ) ]8 ~3 ^9 ^0 o9 t3 r7 N. b( B
, q3 `; \4 J& C9 K  \9 e7 _
程序代码: # {2 `$ r! L; x

- D! i% ~! M+ ~) f5 Hnamespace fy_Exp{
2 M2 K5 P* p9 D2 R; L' k0 ?5 pnamespace {template <class _T>6 N* \. l9 p7 @+ U5 L
inline _T GetExpValue(_T t[], char& csym){  w2 b: v3 w$ Y: r
    char c=csym; csym=0;. L! m% L2 Q8 z" h
    switch(c){
  m8 z% ~! P* K5 t    case '+':return t[0] += t[1];
! e$ @/ q- f6 I' u% p% L, ?    case '-':return t[0] -= t[1];8 O# w, X5 v4 _+ ^
    case '*':return t[0] *= t[1];. o" h: o& F& g# D5 R+ B
    default: return t[0] /= t[1];//case '/':9 D, L6 n! ?8 W% _
    }
2 J9 X! N: ?0 k6 M( V}}
; M' Z5 A! v4 ~" X' z1 d* Rtemplate <class _T, class _Tstream>; a: m/ r  e5 K  S
/* _Tstream: inputstream, _T: get return value1 f6 Z7 g$ a! u% M$ d; T
* Return nonzero if get value successfully */
: T% U: ?( K& k2 j8 A4 V7 x* tint GetExpValue(_Tstream& istrin, _T& nReturn){$ V. I6 J# G# T
    _T t[3] = {0}; //雨中飞燕之作0 m. o6 j+ d1 l0 e5 s; `, \. J
    char csym[3] = "++";
4 U) Y7 L) I, _    int nLevel = 1, nERR = 0;$ E& I+ x/ D3 ~6 f5 j3 l; y
    if(!(istrin>>t[1]))istrin.clear();0 S* T+ F# }! ~1 g# c
    for(;;){
5 }# N2 l+ |# \4 ^6 i        if(istrin>>csym[2]){( q  G) Y8 g8 o3 \4 J8 h
            switch(csym[2]){
! @  a- C0 k1 F& M8 A, `4 j; H# Y            case '(':$ r$ s& m  l/ d  O& P
                if(!csym[1]){nLevel=0x100; nERR=1;}else
  C3 `$ |; D8 N( `0 `                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% j/ O& G, o" z3 r
                else{nLevel=0x100; nERR=1;}4 b" \; a) F, ~2 o! L( R4 v
                break;
, ^8 v! u( M0 _1 k5 w: j            case ')':
8 `$ K# D* @/ f( P* k& I; n9 _                {nLevel = 0x100;}break;
$ S! o4 d+ t- l: l            case '+':case '-':case '*':case '/':( U! G" q+ u  C; o
                {csym[nLevel++] = csym[2];}break;
( I$ a7 V4 n7 j# ]7 r" N  E            case ' ':case '\r':case '\n':case '\t':continue;) H  T/ l8 q3 `2 u
            default:7 `: i- {- I/ F& r
                {nLevel=0x100; nERR=1;}
# D7 c( L  p" \5 q0 b! X0 D            }
% I3 d+ m2 Q3 c8 Y: `& \' k            if(nLevel==0x100)break;) c5 i4 |7 c* C: o
            if(nLevel&0x10 || istrin>>t[2]){
' F. s& c' p9 @9 \5 B: M4 A                nLevel &= 0xF;% p) j% n. u' \9 O3 M- x; N
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
, p7 m. |7 L1 y                if(csym[1]=='*'||csym[1]=='/'){
: s- o; b( m: |6 l& o1 L5 Y0 J. |                    GetExpValue(t+1, csym[1]);8 `% o. b- L3 R+ l, d
                }: h- b# [* F3 @
                else{. F6 X+ L; A7 C% Y7 R  ]
                    GetExpValue(t, csym[0]);/ X; c& I' n$ o- @3 v3 M
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;' i. I$ F4 Y* m
                }
8 o$ M0 Y  ?0 y- h7 T" v  ~                nLevel = 1;
3 z3 \6 o* s; ~8 X* x            }6 X1 u, t6 ~" F4 i3 Q6 o3 d8 O. L
            else istrin.clear();
" W* i, Q0 B0 _        }
$ ~/ V9 q2 y; o; G( r( z% p( g: q        else{nERR = -1; break;}" Z5 F" b9 [; \
    }
  E0 z" H! S* k    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
& N) T/ F  D, c0 J. }9 b. K& c8 z    else nReturn=GetExpValue(t, csym[0]);
" T0 z* O1 u7 g: ?  F    return nERR==-1?1:0;5 d6 }/ L4 S5 ~/ i6 U& q, S& ?
}}
1 u: ^+ j; }" F: ?! K7 e, X) d" I) O, I- G/ h: r" V! M! B/ [2 l
+ D* A3 _( w/ Z! i
3 L/ s. p9 D* N3 i  H. J. S2 k
函数模板使用示例:
- ]: ?+ ^1 b3 T在以上那段代码的后面加上以下代码:
; z) X) y0 W2 Z2 m
" w; G8 w0 }+ E! B
# _; i9 b7 {5 _  M7 n7 X: Z4 r
/ K" r% {$ M+ A程序代码: . A' p+ T# }$ ?' W5 W; q
8 C* f! w+ v9 Z  S3 V- n
#include<strstream>$ \0 z( a( Q  }( {/ h# r- R
#include<iostream>7 ^  c& n; f5 a
#include<string>
" h) t" z& T  a- r1 a: Vusing namespace std;! M$ E3 o' e8 ^& d
int main(void)
/ I; R1 q; C6 V* P  a) `, Q{/ l: R/ m2 L! f8 i, u9 k/ G; o
    string s1;# C1 M1 b7 j  U' l8 B; S0 f0 ^
    while(cin>>s1)- B* W6 u7 v( |6 D2 p! H" U
    {7 u$ i9 a9 x2 a0 e' d
        istrstream isin(s1.data());4 K1 |& R3 q$ r9 x
        double d;
" f+ ~, |4 }, M% }# F4 S3 Q: r        if(fy_Exp::GetExpValue(isin, d))
; j5 V) G7 J1 ?7 M        {
- W& P% o8 \* I# E3 J" U6 I6 }            cout<<d<<endl;
( P+ j$ N  F' \! Y6 O        }* ~5 ?' P( |' E3 f; i8 j
        else
  T3 l8 m4 G6 j7 X. \6 }: L        {6 t5 j2 s* w3 t2 q
            cout<<"ERROR"<<endl;
, v: s$ |" O0 m4 B        }7 Z2 b  G# x7 \9 h+ e9 j
    }
$ h! ~* m4 R" N) l5 ~1 D5 ?    return 0;9 c7 y/ L# u- b/ u
}5 u6 Z  m. E0 m7 f; i8 S

4 r) P: w0 h0 z) `7 B
9 H& a1 c6 f& j! J8 i$ ]# @8 i然后编译执行就可以了(*^_^*)
1 W+ H: s( J9 e7 n  O其它:TC++上一定编译错误,不保证在VC6上也能通过编译
2 r; ]. S& K0 G      建议使用VC7或VC更高版本,或者使用GNU C++编译

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