返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
, U5 O/ ^5 q$ T7 c一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
5 |/ S/ h7 `+ B# v  {  k只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
! q$ Z  e1 a0 b! e0 {' p- {参数解释:
0 V4 t: v+ f- o  Oistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
7 |+ y% k$ u/ p. L; c* nnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" p3 Y+ c0 ], y# V% B1 Z
返回值:
0 A5 t# z9 A2 n# c3 M. ~返回非0表示计算成功,0表示计算失败有错误
4 A- }) D' d  G5 n0 Q+ q3 T& m3 n( ]
% K% [) E, h# y, V7 B4 \ # X0 d. W5 T" m; b4 U  M" p6 ~

5 ^* n3 M7 a% O程序代码: % @: ^8 M( j+ t! D( H2 j4 g$ Y
4 I4 y4 d' O% _+ y% h
namespace fy_Exp{8 E( Y$ R( m/ d* e: D6 h# R1 Y; @0 l
namespace {template <class _T>! H0 Z, l/ _4 ~  j+ `# L& H  t
inline _T GetExpValue(_T t[], char& csym){) q8 u+ S2 ?. ~( t
    char c=csym; csym=0;& D* U6 a8 }; H/ ^2 N) }
    switch(c){
- c' k; O9 d- F$ `1 S- Y6 p    case '+':return t[0] += t[1];
& d" X- Q* }8 a- a9 U: \5 ~    case '-':return t[0] -= t[1];* K# Z% X5 m2 b& C4 W2 |
    case '*':return t[0] *= t[1];
# [8 J/ ^! S: _7 i/ r2 `$ Q  z    default: return t[0] /= t[1];//case '/':# a$ u9 D/ x" r  L* i
    }% j! g( E: o9 ~* d" f5 d9 ^2 o
}}
. \0 l. j, C! v7 `# _! ]template <class _T, class _Tstream>
" {; u7 a8 E- q  V, p/* _Tstream: inputstream, _T: get return value7 J) W! v& ], V& H' R2 a
* Return nonzero if get value successfully */4 G. o5 ~% I6 n, B, N9 R% q1 T: v
int GetExpValue(_Tstream& istrin, _T& nReturn){/ C+ j# [: Y# z! r9 l
    _T t[3] = {0}; //雨中飞燕之作
. k# O% A; ]- u- b, f    char csym[3] = "++";
& L( s7 Y& u+ k: w) |' }1 b+ v1 j    int nLevel = 1, nERR = 0;
5 E- ~, v) Z/ D8 r7 e8 Z6 E9 P    if(!(istrin>>t[1]))istrin.clear();' P# o1 K5 t# G8 ]
    for(;;){0 g7 Y, {6 r3 J
        if(istrin>>csym[2]){$ }+ v; P0 f, t0 b/ O4 f3 r/ Z
            switch(csym[2]){/ S2 }/ Z* d7 U1 Y  D$ I
            case '(':7 \) H! b1 R0 m; E
                if(!csym[1]){nLevel=0x100; nERR=1;}else/ U) d' B3 g& B4 @' b
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
7 L* d4 o4 r" |6 C( Z, i                else{nLevel=0x100; nERR=1;}
  I% E) h4 A, Z                break;5 S) p+ _' J/ c' T# {( u, q5 c+ X& I
            case ')':/ _# ?; H* o% W3 }6 F- y  t
                {nLevel = 0x100;}break;6 n0 n- _! _; q' e( M' W5 r5 }
            case '+':case '-':case '*':case '/':# q* m( q1 M9 s/ h5 w' N* I
                {csym[nLevel++] = csym[2];}break;$ i( a; ~6 j% z* q
            case ' ':case '\r':case '\n':case '\t':continue;0 j$ n4 {) y3 X% [3 t) ~! L5 k' r+ w
            default:, K8 d% x. q1 `0 s( u1 L1 L
                {nLevel=0x100; nERR=1;}
: G7 n/ e9 _; Z3 M/ V4 Q            }! _+ g, ^) Z* C7 Q# d" q5 S7 n. u! v
            if(nLevel==0x100)break;
5 A% h- V' K0 J7 J, y            if(nLevel&0x10 || istrin>>t[2]){
+ m& z/ H9 V9 X                nLevel &= 0xF;
  C+ k' `5 E. e                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}3 n) D0 P6 u7 i( F
                if(csym[1]=='*'||csym[1]=='/'){/ q3 z$ d! n% J+ w+ i
                    GetExpValue(t+1, csym[1]);. Y8 }5 Y, f( P6 X5 ~7 H* E
                }% u. k  K' A) y' v1 H
                else{" W+ ~7 c5 r' g  O7 s
                    GetExpValue(t, csym[0]);- u7 w/ s! @1 ]! r6 f
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;1 o& ~  H: V  ?! H4 |/ j
                }
" M  C1 U' N9 X! l7 `                nLevel = 1;
! Y; f# S& f$ q1 z            }
+ q* K6 t$ N  p+ @            else istrin.clear();9 t( G1 k4 Q  n, F, g% t7 _9 \
        }  Y% n- s7 v" X, @& Q5 p
        else{nERR = -1; break;}
0 P5 \" Q3 E1 D2 f8 j    }
$ o4 ?& V: V, x" _& g    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);4 p6 i/ q. g3 S8 O6 `
    else nReturn=GetExpValue(t, csym[0]);6 b1 g, M# Q( s
    return nERR==-1?1:0;% ^) K& M7 J' x
}}8 Y4 Q8 |1 W1 z9 ]* y. x2 i0 m3 }  ^
4 N& [0 N0 w3 E) S4 t
! }  P5 E! S) W

: @. m$ l& ~( s) ^函数模板使用示例:
1 P3 E& j, P2 o% z; V- g在以上那段代码的后面加上以下代码:' x/ x# j7 G8 J/ p# P

& f) p/ U3 t, I/ s: {" E ) Q% k" A6 G/ F: [: F2 G

( P+ H# }5 G" h$ ]9 s/ R4 Z" T程序代码: 4 }4 t# u/ r6 T

1 ?0 L% ^# g; z, I6 z#include<strstream>: I& I, a( H, S' l
#include<iostream>4 ~# U3 O, h( S, D: J
#include<string>; ~8 I0 ]' P6 H3 R
using namespace std;
7 B* C& J9 Z* j5 z0 d; A& Uint main(void)
) G5 O# v7 e2 c{
1 o' [' F& t) j" s    string s1;
; @4 y( J9 R! V/ L* V" ]- ~    while(cin>>s1)
* V% O  i* m* {% S    {# O) J6 ?  g+ _4 W" x2 A. X
        istrstream isin(s1.data());
2 Y& E/ O9 k5 i, M9 Y  K        double d;
# [; o: e0 E5 v& F( S. |        if(fy_Exp::GetExpValue(isin, d))1 k! F6 ]9 a4 @* `+ u4 O
        {
) v8 ]+ U( V( Q! Q8 ?7 r. V            cout<<d<<endl;
, }! w6 d8 G% g6 n; J* I  a( b        }
1 N( `0 {4 Y; X" {* [8 v  e8 ^: m        else
2 Q- N3 _6 R0 Z9 N' a' v, Y        {
9 U3 O; {/ u. h6 @  [+ r2 _            cout<<"ERROR"<<endl;* P" ~# N1 q7 z4 M9 _( ?) a
        }) ]8 e  n8 O& h1 J+ t
    }. V* q: I6 a8 W& p+ Z
    return 0;
  z! J" d. a9 t4 ^% t}. @8 e: c0 D, s7 M7 V' u( n7 p

6 r- X  t9 @3 r  \
7 Z9 j! y, L! m7 @# S然后编译执行就可以了(*^_^*)- z4 u# O& I) G6 \% w: L
其它:TC++上一定编译错误,不保证在VC6上也能通过编译" O0 R; h9 v$ j  c# H
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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