返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
: m9 H" M8 v/ k/ @' q% ?4 [5 N' c一个很方便的函数模板,可以并且只可以计算含括号的四则表达式& h( A5 U; O9 r
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)2 y* c4 I# B4 _7 m7 M4 s2 k* x. _
参数解释:0 F" _+ Y: f6 z# l7 w
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流0 v0 `, ^& |' s2 K; D
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
( A7 [4 g& l( m返回值:+ Q3 W6 I+ S0 k( q! x1 }; |7 J0 f
返回非0表示计算成功,0表示计算失败有错误
; g: m; h! P3 D3 |4 B  [
( [' o) ]/ q6 t1 B7 Y2 Q # [) r2 F  H. T9 j* P: |

) |# l$ q( S0 Z2 R2 P程序代码: / e6 o8 x, o% y

+ E' H$ N- y: c1 v' Z  ~namespace fy_Exp{
0 W1 d6 m/ B" j) wnamespace {template <class _T>
8 V$ e0 S% @9 o. H  jinline _T GetExpValue(_T t[], char& csym){, W" p, Z5 E4 `4 z: _( Y: }
    char c=csym; csym=0;
6 y* m9 p, D3 k+ k9 j    switch(c){
  e9 }- X" y5 w    case '+':return t[0] += t[1];
; U0 X: U6 L4 H    case '-':return t[0] -= t[1];5 N7 S' C5 v4 |# K3 L+ @6 E6 e
    case '*':return t[0] *= t[1];
+ c; @6 @! H  A0 y. Z7 w    default: return t[0] /= t[1];//case '/':2 S( E: |' ?3 z1 U, _
    }: v- H7 _, U3 q) U% S
}}& w: `: u' i, h" Z  H$ E
template <class _T, class _Tstream>3 ?+ w2 a7 O* p* K
/* _Tstream: inputstream, _T: get return value- K5 j0 {% V1 q1 ]! M: D' d! ^
* Return nonzero if get value successfully */& c, B: X$ Q2 \% L/ X& N$ c7 o* s
int GetExpValue(_Tstream& istrin, _T& nReturn){
8 G7 F2 N' B0 J, _& R    _T t[3] = {0}; //雨中飞燕之作7 |/ \  s  b7 ~, G
    char csym[3] = "++";
# _$ u1 N' s/ G8 Y7 s    int nLevel = 1, nERR = 0;
% }* N! S5 l& C' A8 [( \4 A    if(!(istrin>>t[1]))istrin.clear();/ h8 p, U7 ~; N, c
    for(;;){
8 Y  x/ C1 c. P: e0 ?) V+ |        if(istrin>>csym[2]){! ~" ]4 z! c) B) ?0 }# }
            switch(csym[2]){
1 }: X; W, `7 t            case '(':- S1 j$ o# _: M7 ?" C$ P
                if(!csym[1]){nLevel=0x100; nERR=1;}else4 i2 w/ [6 A5 n8 H) i4 w
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
9 v5 x7 P" O  q# y/ {3 m  H! Q                else{nLevel=0x100; nERR=1;}
) N& y$ J: c4 ~) _) I! F0 T7 p/ Y                break;- T. H2 z& x8 G* {2 U& _+ Y. \
            case ')':
& J7 `5 l- w' |; m+ C0 f* e2 n                {nLevel = 0x100;}break;0 Y) i% z9 v' d5 v9 L
            case '+':case '-':case '*':case '/':
2 J0 i% \+ ], N+ c0 M) P! \                {csym[nLevel++] = csym[2];}break;) F9 y7 w0 M2 ~- N
            case ' ':case '\r':case '\n':case '\t':continue;0 {) C' f1 c2 B- V2 p) ~
            default:
2 c4 [$ B2 l0 S; ^1 M4 Z                {nLevel=0x100; nERR=1;}2 f7 m. w% J9 o3 }5 Y1 v5 w! ^
            }# l: h6 x! d. K, N- ?
            if(nLevel==0x100)break;+ P4 [  R% a. s6 H
            if(nLevel&0x10 || istrin>>t[2]){' p' f* V. p- M
                nLevel &= 0xF;% o( k% V* o  c9 p+ M
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 [; [3 j7 f. V$ _. V  G                if(csym[1]=='*'||csym[1]=='/'){4 A! N7 J5 b# n; t
                    GetExpValue(t+1, csym[1]);6 k/ G- H$ K$ ]  k
                }' z' i4 q3 O* }
                else{
1 f( O$ d- `2 {, _5 D                    GetExpValue(t, csym[0]);
% G- @0 h: s: D                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;% A' O5 I" W1 p' O# @1 L$ y
                }! }7 G1 Q5 W1 }; y* |
                nLevel = 1;
3 J7 x4 {; n- o+ H4 E9 `! M$ N: R            }* t$ K: C2 A- t0 i
            else istrin.clear();
- S  H. q4 d: V! _) Y        }
0 c  u6 V0 X! _2 }/ @- z1 ]( u        else{nERR = -1; break;}* M- V: N: f0 F  `. ]" q) C2 z
    }
) m' n' `$ I( c; n    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
; |, k; V+ _2 Q    else nReturn=GetExpValue(t, csym[0]);
, t6 N) `$ V) G5 M. o- e    return nERR==-1?1:0;
% Z3 P% `) g& R+ ~0 ~0 l# n( L}}+ L: E1 V2 l( \2 m/ I

$ _/ k0 d6 y2 z* f! M6 a8 {; N- b* t# O
' W0 W% t7 U' l0 B/ E3 u
函数模板使用示例:
* j/ L- O7 Z% U" V5 q- x+ V3 o在以上那段代码的后面加上以下代码:# T$ F% a/ L& l  }2 Y
& {- a. k+ ^+ G( ^1 r- c7 Q% d4 L
; U$ E6 H" b0 L7 B' A) h

  R& I4 }% d) z7 A8 H- V程序代码: 8 i3 c+ M. c- G9 c0 n: A) Y+ \

5 D. a# q( m" \9 M$ I#include<strstream>
1 n4 @8 Z1 Y  |3 t/ N9 w#include<iostream>- ?* C, l  `. D! S; t& }- b# x
#include<string>7 S1 Y2 B0 i$ R9 e* C5 G* I
using namespace std;$ L& f8 _  P: C' q; \; ]0 y& E
int main(void)# W, x" }* |6 L) e" f7 O9 e$ X" M+ E
{
; X5 j" ]' P1 U1 E! A% n, Q    string s1;" M5 T: v# p# a
    while(cin>>s1)" _3 o% ]; v) ^
    {9 ~) ]' n5 d% n' x
        istrstream isin(s1.data());* u7 k6 E9 i4 K0 _7 t! T
        double d;
6 w% v* _$ |6 |) a        if(fy_Exp::GetExpValue(isin, d))& o: B/ x: ]/ W% b2 ^4 ?
        {: I. P! m3 g: E) B. ~% U
            cout<<d<<endl;) C! X9 d' Y" X5 q# z  @9 l. D: c: ^
        }
! z) k( p. Y6 x        else& I. g1 f8 ]  m5 V) i: O" i
        {
& V5 Y' g$ x4 X; ?( \) J8 Y; t            cout<<"ERROR"<<endl;; ]8 Z+ k) J! [$ n( H9 e
        }0 J. h6 Z# E4 u9 v' K/ p- `9 p6 d
    }
' ^9 k6 |0 `4 T3 g3 F& j9 U    return 0;
3 u6 {# i" W" c0 x  @8 J' t}
7 h8 P- z# X, ^- N) b% ~" ~5 C2 R$ Z0 l5 Z5 {3 I5 p
% A) Q4 W. c3 Y6 a  v: T
然后编译执行就可以了(*^_^*)5 b$ m1 C1 O& x, `- T* d. O
其它:TC++上一定编译错误,不保证在VC6上也能通过编译% \' ^/ V1 M' z$ v" t  U, F
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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