返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,; Z  ?* A% v2 k3 m5 |
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式+ t* a  u+ l4 `: n
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( R; i: t5 c3 d7 f- o/ `
参数解释:
' q& l. l( l9 Pistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
  t( w2 A2 z% ^. O. wnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
3 @! p: r/ x3 t* G/ ]7 F8 |返回值:: _* x' U* a7 r/ v: o( l  `8 l
返回非0表示计算成功,0表示计算失败有错误6 P8 @# \) V+ Y9 [  q7 K8 H3 |

0 j9 [9 K/ z* k+ c) p
# @- e+ S# A8 F; K8 O
1 Z/ R; P- m. X) s6 S) q9 l程序代码:   _2 i# Z0 T" b3 K; k) x( _

5 x( M# A5 H, Q2 t" g, m2 O0 q% Nnamespace fy_Exp{
" o" ^: q% B+ m# Wnamespace {template <class _T>
- \# B) V- ?5 q2 n( N' Rinline _T GetExpValue(_T t[], char& csym){
7 v* J$ T  A" Z  P0 r    char c=csym; csym=0;
% z( u  J6 J) y, j7 R    switch(c){
  ?, ~& F8 j1 u% V8 z- F7 U    case '+':return t[0] += t[1];
: ]7 {7 f0 x" j# Z8 q* l% F5 o4 O2 v    case '-':return t[0] -= t[1];
+ K! u# Y1 R% p% \    case '*':return t[0] *= t[1];% Q! ]$ j+ W9 U; M2 ^# \# n
    default: return t[0] /= t[1];//case '/':
* S7 F: `: }7 o+ H/ n    }
) G( D$ S1 f+ m# k}}
/ s. R: u: W1 J( R* ]/ @template <class _T, class _Tstream>
( e% o0 H& S2 J/* _Tstream: inputstream, _T: get return value! K- y- H3 l1 Q/ Z( ?+ A
* Return nonzero if get value successfully */
7 t3 S* f2 W4 I+ s8 bint GetExpValue(_Tstream& istrin, _T& nReturn){  \6 U, }' Q# ?$ q3 `2 {
    _T t[3] = {0}; //雨中飞燕之作3 ~, H! l! z! I5 d' K
    char csym[3] = "++";( D3 k& @! [' R& |+ Q/ Z5 K; P
    int nLevel = 1, nERR = 0;
- Z2 B9 N$ P% u$ s    if(!(istrin>>t[1]))istrin.clear();% ]9 Y% ?, K" S: ]( ~& ]
    for(;;){- s8 U7 V+ ]: U: `7 [# p; m
        if(istrin>>csym[2]){- P" G" k# J: s8 {! e. e# p
            switch(csym[2]){% l" M+ g5 l0 C7 J- t4 ]
            case '(':
+ B8 J( G; d) h9 D* i+ L- q                if(!csym[1]){nLevel=0x100; nERR=1;}else- B  f  ]. y- q& ?, q) y
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;! W: ~& ]) G" u3 k5 |" p
                else{nLevel=0x100; nERR=1;}
+ G* p8 w, k! ?1 a5 D                break;
8 a% h7 X' o' Y0 H            case ')':- X$ |- L- w2 B) t4 \' C# M( L
                {nLevel = 0x100;}break;: D' u1 M2 m8 B; G* `8 E
            case '+':case '-':case '*':case '/':  ]: D5 n3 }, ^7 E" r
                {csym[nLevel++] = csym[2];}break;
0 ]+ w, o$ J( F: q: X            case ' ':case '\r':case '\n':case '\t':continue;
! [3 D" k* a* N2 i" A5 v2 R            default:
( o  A. {; P$ m0 _                {nLevel=0x100; nERR=1;}  C* M+ \" Q% F7 w4 h
            }
( @6 ~+ V4 Y! e3 X/ j5 e" ]8 I" W            if(nLevel==0x100)break;
5 e# Z! J2 H; t6 c+ S# u1 H            if(nLevel&0x10 || istrin>>t[2]){0 C/ \) C1 J0 k( \
                nLevel &= 0xF;7 c3 q1 _# o. n7 n5 i2 `% O8 E7 r; N  G
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}7 q5 T7 E' p1 V: U& C
                if(csym[1]=='*'||csym[1]=='/'){
, }3 n- G0 B" k; A7 a5 i7 [                    GetExpValue(t+1, csym[1]);
5 W# h* i9 g1 ]. G& O9 I. q. H                }
' G7 v& d+ b6 w3 V                else{% E* p; Y+ L, K" {8 ^
                    GetExpValue(t, csym[0]);
4 l1 w' d# ~$ @5 a( ~" e; S8 f                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;! \) t, Q/ @, M- X3 r/ R
                }
3 R* `% H) k# D2 m' T                nLevel = 1;
4 k3 k( I" R8 j; G( Y* v% o8 [6 j            }) k4 g5 C* a# H  z8 |9 p
            else istrin.clear();0 `* b% z2 y: j7 X$ \4 ]
        }
% J6 O! E; F6 W) s; Z# I6 G        else{nERR = -1; break;}6 u& T/ Y% O' Z! d4 H
    }) ~& {4 A2 _* A* F- N4 W
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
# Y8 }$ ~, E. A3 M8 U+ U# l    else nReturn=GetExpValue(t, csym[0]);
5 I1 u! r* u& V1 b1 E0 i0 L    return nERR==-1?1:0;0 G$ R5 H% v; `& C3 @( I6 d
}}
, m  I  Z& w; e, k( \" h  M0 l2 d1 v6 c& T+ q" k
3 b4 N# R! x, b3 s
" r2 b# {6 d6 l+ y# L
函数模板使用示例:$ U5 m$ Z: u3 z+ ?- e* h: J7 P) [3 r
在以上那段代码的后面加上以下代码:' K; R1 c& G6 y( @  v

" i7 f; i; `# |1 a
) V! _" w* p/ U' Q0 G6 c( s1 D5 R# b  L" A+ U" a
程序代码: , B8 w: D3 a4 d. f- x) p" ^  k
4 F  ^. d5 \  ~1 f+ D
#include<strstream>4 s7 O; B) `! Y4 D
#include<iostream>; e9 e. w  f9 w9 b
#include<string>
* Z% q2 y* D0 j# }using namespace std;) Q. {+ k7 t$ q+ u8 M
int main(void)! f+ ?% T) S, t# g  N
{/ r  o) e$ S7 W# G& v4 x' A+ c
    string s1;. y5 N9 U+ C) |+ s: R; @0 K
    while(cin>>s1)" b. @+ t1 l" |
    {, `+ A* p7 _, k* ~# {4 a% U
        istrstream isin(s1.data());
. T3 B. U% u! v- p        double d;& v0 y0 [/ Z; o2 d
        if(fy_Exp::GetExpValue(isin, d))
* q; w, ]) b8 l2 c4 i! b# I$ j) _        {$ U* p3 ?( _% @5 C! T
            cout<<d<<endl;
* V, w- ^: K$ C% Q8 y% S        }
7 |2 ?4 U# [0 R) a0 U        else# y7 }. _4 p  s+ @% T
        {$ _7 O  j" i& [( V0 S
            cout<<"ERROR"<<endl;
. T0 z' q& ~5 T- s9 x# h2 ]        }9 P) p0 i; F8 D. i
    }
  u2 S% ~1 U) \: o5 N. O0 p    return 0;
; ^4 v! t/ z# M2 M}
( z& p3 M$ D& ^, l% A. M" s- L: {& e) B  J% `. w* P1 Y& P

0 I2 P0 d2 y& b  g- }4 k( u然后编译执行就可以了(*^_^*)
' |4 ?& N  p# D( v0 T: o1 z其它:TC++上一定编译错误,不保证在VC6上也能通过编译) m& L2 v2 u0 e
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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