Board logo

标题: 一个计算四则表达式的模板 [打印本页]

作者: zw2004    时间: 2008-1-21 20:17     标题: 一个计算四则表达式的模板

在9月8日那天我特意编写的,给大家分享的,
. m  D# e9 V/ T6 {. X一个很方便的函数模板,可以并且只可以计算含括号的四则表达式* L! l. O, J/ ~
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)6 E( N  q/ i1 f, Q, w& {2 a
参数解释:: L7 e' o0 F9 @9 R  g: q  @
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流0 L7 W* M4 j8 j
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定% l' {. M& |. i, A* ?4 }9 a# c- X
返回值:
9 H: Z" n- G, x返回非0表示计算成功,0表示计算失败有错误. d' p/ R, V' R# y' E) J
  y1 }7 y5 [  e/ ]% z2 J

: L% t9 g: ^; J# W9 T8 v7 G3 ]+ Y, R* b! I/ ~) A8 X3 i
程序代码: ' t' i/ G  B7 W% r6 m1 {

! [+ C# y* f. I1 B+ Ynamespace fy_Exp{
0 C3 {$ X2 H( B. nnamespace {template <class _T>
7 h+ ^1 `1 U- x( o+ ginline _T GetExpValue(_T t[], char& csym){
' p5 k: ~  j& t$ _% t/ _9 q    char c=csym; csym=0;6 R$ ~, ~; E% C1 B8 c, b
    switch(c){
/ u* e# B' U  ~( w$ x# A    case '+':return t[0] += t[1];) S1 N: B. D+ F, O+ K2 S8 G: [
    case '-':return t[0] -= t[1];) s# L7 d/ a+ a3 |
    case '*':return t[0] *= t[1];
) B7 h& B4 N. s/ d8 l$ q9 |    default: return t[0] /= t[1];//case '/':0 t. g" G. S) p2 C# o1 j( k  z, s
    }, O8 N" I6 y) {/ P) V- N& x
}}( ?" _6 l4 M% r/ B
template <class _T, class _Tstream>6 u1 }! H  V5 D' V3 g
/* _Tstream: inputstream, _T: get return value
  b% L0 R* y) b* Return nonzero if get value successfully */* J0 H4 ~3 y- B9 t
int GetExpValue(_Tstream& istrin, _T& nReturn){* c% p& s6 x  n0 {. c1 F
    _T t[3] = {0}; //雨中飞燕之作6 i4 \5 q6 k% s4 j5 }. y( N
    char csym[3] = "++";
2 q; o3 S" ]  M7 W* V6 W" p    int nLevel = 1, nERR = 0;. }1 L* [) f' R- V5 X; p
    if(!(istrin>>t[1]))istrin.clear();% ~( P( T, Y5 V4 M) @5 j! u
    for(;;){& c$ i8 ^+ [% f$ ?
        if(istrin>>csym[2]){
( j/ B# S: E) Q  r9 t7 c+ t            switch(csym[2]){
, F3 W+ T9 C) Q) X# d1 Y' T            case '(':6 |/ |) L! g# N. O' \
                if(!csym[1]){nLevel=0x100; nERR=1;}else6 R4 S) o( |0 P/ L/ |
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;! a$ j: E, g0 |' H# J1 D7 u7 I
                else{nLevel=0x100; nERR=1;}
! n5 w5 ?. }5 i' N5 s: I" w8 D0 H                break;
- I( Y  |$ N: ~6 U! X& [7 n            case ')':
; t: o/ J' q& ~) B8 @                {nLevel = 0x100;}break;
: i, v% E3 _) m. L            case '+':case '-':case '*':case '/':
4 `* b* y- s2 L, N) h; E; ?                {csym[nLevel++] = csym[2];}break;
+ B, f+ J* V3 z! ]: r/ `            case ' ':case '\r':case '\n':case '\t':continue;
  j8 Z2 [+ H! a" Z; t4 V; }$ M            default:
* \- x7 w8 Y( _" A+ ?5 Q% n: }  O                {nLevel=0x100; nERR=1;}
* @5 y2 P! g6 q0 S) i# @- a" U            }
4 I5 K2 F( c9 q: O6 b) |            if(nLevel==0x100)break;
' W  m8 z1 `5 X4 a! T            if(nLevel&0x10 || istrin>>t[2]){( K% z0 i9 C/ Q: t3 ~/ R$ Q
                nLevel &= 0xF;# ^# w" v1 M8 E0 S' s+ {$ e: n
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}" r, ^$ L- U5 Q1 ^7 d
                if(csym[1]=='*'||csym[1]=='/'){
+ V4 \$ x9 b, ~" E; `                    GetExpValue(t+1, csym[1]);
- ~& q9 B) P9 P" |                }$ V. m* [0 W( U( K
                else{6 P( v& m& X( m& u1 @* [) [
                    GetExpValue(t, csym[0]);( x. v4 r: f8 C6 |% P1 ~" C0 V4 L
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;0 `( {5 G( N8 K0 ^& g! W, Q5 R/ J
                }
8 J1 h" f  ?/ x/ _                nLevel = 1;
0 }, Y- G, V  c& I  k5 R! W5 k0 j            }6 ^3 j" _% ~+ n0 |0 J: n0 {
            else istrin.clear();
$ Q/ S0 b/ x* z2 m* x3 W        }
3 y" H' j8 j8 B        else{nERR = -1; break;}
/ }( n0 k2 X5 r. {1 Z0 F# N  P) i    }) Q  g- W/ }' B0 R. ~
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);5 |3 y% O; `2 e5 L8 _
    else nReturn=GetExpValue(t, csym[0]);: p# p  l; y& p
    return nERR==-1?1:0;6 X6 k9 t% |$ t. K' O+ F$ Z
}}
7 w9 ]/ }4 Z: B9 @+ x2 |: Z7 Y, @
/ F+ W  }% T$ o0 ^9 e! v! A) x  ]& S- f( k! v; E
* q5 h5 Q2 z. u$ d  P: |- ^6 |" v% W
函数模板使用示例:
" x: X# X  H8 h4 ?在以上那段代码的后面加上以下代码:
0 Q1 o3 @' u1 l4 W! R- j7 Q
+ [; l& o1 B' j9 U0 I* F% a. x2 ^ 6 l. o9 e; |& o2 K
4 P' X" ]+ k- ~; L6 I
程序代码:
! c* E2 w/ b- U3 u# z1 o8 s: J" l2 T- L6 M( B! \
#include<strstream>4 R4 R5 F8 G& y
#include<iostream>% c$ ~2 T  |9 B0 s
#include<string>6 i8 Q3 F) u' `
using namespace std;
- \, O; G, s( Q4 n6 k6 S8 Fint main(void)
  |0 b% n$ Q% y* w- h2 \5 v- z{' G1 j. ]6 ^" E* {$ g; m; k) W
    string s1;- A5 b8 H" L$ _6 h' _; s  G1 \
    while(cin>>s1)
$ p: i5 I1 B- j2 ]1 Q0 c& H  u    {5 K- [1 E% y2 f$ Y0 {7 ^3 b: C/ ]
        istrstream isin(s1.data());- G2 i! w9 D$ N; U
        double d;
6 ?, h4 h; o5 h& h        if(fy_Exp::GetExpValue(isin, d))
) t, I6 o0 m: I3 {0 V        {) N1 r& y) @2 O9 l: h' s% {
            cout<<d<<endl;/ h/ [4 G/ O) M; l
        }; v! u+ @3 ~- f5 ~  N% w1 \: Y
        else
! T. f- C" A, `% x        {# H. n7 g& r9 O8 w  F/ @
            cout<<"ERROR"<<endl;# X$ u( w4 }3 K  B# l/ T0 B; h1 _4 u
        }
7 u, x9 D+ @  t: D    }
5 U. F- G- q( {2 B) |4 ^8 s& e/ j    return 0;
+ G4 P8 O, p7 \}
. i! p; G3 q/ h- _' }2 S! Z# ?  ~' t% v( r

- D6 E3 K( g7 I+ q. o7 R, j然后编译执行就可以了(*^_^*)  e5 R3 w* j7 \7 s2 K+ ]
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
5 e. {1 e$ ?0 M9 l3 b" \. s6 n" W      建议使用VC7或VC更高版本,或者使用GNU C++编译




欢迎光临 捌玖网络工作室 (http://www.89w.org/) Powered by Discuz! 7.2