获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
* r! |& o) T% u( `2 e+ W一个很方便的函数模板,可以并且只可以计算含括号的四则表达式5 L: ~! i) r& x: e" M+ B
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
2 d& S. k) D9 E( v+ Y4 L参数解释:8 r1 n& l" ]1 L0 T% q0 m  `$ y
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流* S3 B3 |+ q0 t5 i' U& v  j
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
" F: o, N2 m" d/ P返回值:! U1 g, [3 t+ Q& j  i5 a5 U$ M4 Z
返回非0表示计算成功,0表示计算失败有错误! x! L5 e$ y6 I. e& l9 E  i1 Z
/ x# r" x! k9 v6 [+ G
0 b+ h( ]# o+ @
1 J! W5 x( k/ h4 X+ B
程序代码:
- E4 t% }' @+ X7 o! p( w
/ n* O! M5 w& C( E5 }namespace fy_Exp{4 f. I" C/ d! J; c1 K/ i5 p7 f7 c
namespace {template <class _T>4 X: X/ c6 i5 _& q' Q  {8 W0 N% @
inline _T GetExpValue(_T t[], char& csym){/ c. Y' y  ]& g
    char c=csym; csym=0;
! O2 B% C# ]8 _5 S8 ~2 V    switch(c){
- R& \7 _/ l5 p6 T    case '+':return t[0] += t[1];" W& V* {3 P2 Z( M1 N5 d7 F" e
    case '-':return t[0] -= t[1];  C  H* _2 C3 o" k
    case '*':return t[0] *= t[1];
0 I, ^% }( V0 ^( G4 f  d7 g) \    default: return t[0] /= t[1];//case '/':8 b/ r$ x/ I# x( I4 J  V
    }
/ ^+ X) ?/ E4 I% B% k  C}}
  z* d" n! p1 N7 y! P: Otemplate <class _T, class _Tstream>
! Q# z1 R, W; t2 x2 c- G/* _Tstream: inputstream, _T: get return value
# A' ~, z2 t; V, }* Return nonzero if get value successfully */
: O% V4 G& Z2 @; Y5 |9 y- ~* |int GetExpValue(_Tstream& istrin, _T& nReturn){* j$ n% P4 q( i9 I, T) k: g! \
    _T t[3] = {0}; //雨中飞燕之作* z% n7 A* q# p* z
    char csym[3] = "++";4 l7 N; T0 R" e. e" j
    int nLevel = 1, nERR = 0;+ u; v; G% |3 {( ^* s8 ^3 V: J
    if(!(istrin>>t[1]))istrin.clear();
" f& w! J" j* }$ a( t. ~    for(;;){  h1 f; Y+ E$ Z& A$ s8 T+ b# e+ e# G
        if(istrin>>csym[2]){
. Y$ u) j, Q. w3 |: x6 \/ s% q            switch(csym[2]){
1 T$ r- Z" h4 {, U; b8 f% a            case '(':. x8 i. q* U0 V) Q" ]
                if(!csym[1]){nLevel=0x100; nERR=1;}else7 }  \9 c% O6 O8 u! m
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;1 d( _4 C# v2 I) c
                else{nLevel=0x100; nERR=1;}* T+ v8 [6 z% [4 X
                break;
5 Q( c+ k, F9 Z1 a            case ')':
! `' p) d1 N  {$ p3 F                {nLevel = 0x100;}break;7 W0 E% c# I2 A
            case '+':case '-':case '*':case '/':
0 ~2 A" p: c: E. Z/ `: L( m                {csym[nLevel++] = csym[2];}break;
  Z: t  }& C4 f            case ' ':case '\r':case '\n':case '\t':continue;
, Z7 B! F1 v- o$ g3 f            default:
4 C. o! y6 |1 W% r                {nLevel=0x100; nERR=1;}
4 S4 U. }/ v6 u9 m( }; h            }- s0 f7 r7 {' M% [8 a7 A
            if(nLevel==0x100)break;5 u2 B4 z5 f3 U9 ?# N
            if(nLevel&0x10 || istrin>>t[2]){
. L' E6 P% V. i                nLevel &= 0xF;$ p$ a; a  L. p3 S
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}* z$ f6 s& c8 o- v' f, V
                if(csym[1]=='*'||csym[1]=='/'){5 c3 [. W5 V0 ]
                    GetExpValue(t+1, csym[1]);$ J% {- w$ ]( a2 u2 }$ n
                }
1 F7 @0 w# b* ]0 |; J7 W) E                else{4 @4 z+ M9 ~* g6 g0 S, a# [. A
                    GetExpValue(t, csym[0]);
+ N7 a4 w1 W6 K$ i4 I: Q                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 z; ?& @* ?7 p. X: d
                }2 N" _  C' t* v! Q, c7 m
                nLevel = 1;2 Q& L4 p( n) w( f
            }& A2 \( a1 S# x) s5 L
            else istrin.clear();
; s  A5 X8 o6 m: P        }4 F" M5 N; X9 f9 O& w, A$ i  i0 J: I
        else{nERR = -1; break;}+ c* k* L5 g1 M) F! ?( H- ]
    }
7 Q+ D' h  \- u& P' ^& q5 b9 k2 D- r    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" _& O1 w: @# g! t( ^; K    else nReturn=GetExpValue(t, csym[0]);
: V5 O( \. p, k3 n; f4 y    return nERR==-1?1:0;0 I, K9 {1 N4 N6 X5 |7 K6 E
}}+ e$ }6 q' E9 u# i. m

# \& E! ~' _1 F2 W8 B2 ^& K3 B) E2 w3 a8 v# ^( l1 d+ D- G. m( o% t1 _
# J, H7 }( Q5 R5 _6 C8 u6 o
函数模板使用示例:9 a- W0 q  c4 }. V: L- M. r( P
在以上那段代码的后面加上以下代码:
! q, H$ _8 t# u" _3 b3 O' X0 L( [( [, B7 i
% ^, A- Y! D! i6 r% G% z
3 S) ?- h% C% s+ B
程序代码: 3 [  {5 L' ?6 E5 E

% X* d' k/ T" M3 v/ @% s#include<strstream>; ?$ p. N0 T/ Z) K' k
#include<iostream>/ [+ ~2 x% Z8 X& L* z, S0 q6 Z2 `
#include<string>
9 c7 `% n5 f+ J  A! |1 Wusing namespace std;9 K/ ?+ ]2 r9 x, a/ s1 J* \& N
int main(void)
# ~2 }, s7 G9 J{
  J; t1 b( s, R2 q: ?- }5 ]- V    string s1;
  f8 o8 K6 M  P& E: o    while(cin>>s1)! W9 M. k6 j+ T9 S
    {
+ M0 B) F5 G- t) T+ z& b        istrstream isin(s1.data());3 r. Y$ B1 N: R8 o% r
        double d;
9 q$ J) O, \+ F1 X        if(fy_Exp::GetExpValue(isin, d))
" Y6 N/ Z  B& P' [2 q        {
& `% p( d2 l( L  s- @2 `7 x' F# _4 H; ]# ?            cout<<d<<endl;
: [2 j' A6 ^- Q% J/ s        }
0 Z6 V8 }. S, \9 ~3 L2 i        else
# a, B$ F/ Z2 {) o! U        {
& }8 v" z2 n) G" W            cout<<"ERROR"<<endl;3 j3 A  v' \) Z* f3 P* ], K9 i# P
        }
0 e% e$ M" e9 X" _3 U6 L- b! @    }
: \, K$ Q" `9 V1 c) ^    return 0;7 X9 f% p6 W; j! n0 `3 _! L
}4 Z, }0 G) P7 p# _+ `' ]; I& B

0 T4 [8 E* l, J; W# N7 U0 s) l1 V: l6 U5 y7 l: ]$ c
然后编译执行就可以了(*^_^*)# U; x1 _, F! e0 u$ n$ t
其它:TC++上一定编译错误,不保证在VC6上也能通过编译6 U& ]/ G  ~, M: H6 ~- u
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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