返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
! E7 N+ ?/ Y' a+ D6 S一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
2 o5 D' T  B! i只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)! X: O1 K& }, `  N. X
参数解释:; C' O* P! m2 C  e; _
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流' L( K) b! o, n% `" j
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定) ?. Q4 p$ o# o& G4 F3 N/ \
返回值:
8 R: K2 l, J  m8 a4 i返回非0表示计算成功,0表示计算失败有错误
! i: v4 z. f4 o2 G) N8 _
7 I* C/ V8 v' s' ^( ]
* a' `1 V" B# g* K% m# y7 ?( M/ W% m, i
程序代码: . _4 _3 x- O! ?! n; T$ F
, C+ y& W- s5 N1 l" D
namespace fy_Exp{
9 x# I' {6 i; p( b2 unamespace {template <class _T>0 ~9 ]( O$ W& b3 \" A8 e( a
inline _T GetExpValue(_T t[], char& csym){
0 ?3 @* _$ Z( o% ]    char c=csym; csym=0;- C" W, j" v8 v
    switch(c){
. A7 H& O& f/ X* M    case '+':return t[0] += t[1];, z" L0 S. x4 x) J8 u
    case '-':return t[0] -= t[1];, j3 j$ X+ x6 y5 H3 ~! `4 c" ~
    case '*':return t[0] *= t[1];  q! ]# H7 Q4 b2 O3 f! `
    default: return t[0] /= t[1];//case '/':
5 X/ s5 J% c! M0 H2 T    }8 C- B5 K  m& A: ~# |
}}: k2 T$ r. i2 g& A# Z
template <class _T, class _Tstream>/ `1 Z* r5 Z# w) W
/* _Tstream: inputstream, _T: get return value
  j2 o6 ]  u) `0 _, f/ y* g; P+ X; E$ q* Return nonzero if get value successfully */
9 D: G( D# L3 y& E; a9 ?5 Hint GetExpValue(_Tstream& istrin, _T& nReturn){
) I0 o+ J0 |4 x, G+ J" r2 ?' q    _T t[3] = {0}; //雨中飞燕之作
8 o3 A) P3 l5 h9 f$ L) t    char csym[3] = "++";* C5 ^# X' ^# i) J( _
    int nLevel = 1, nERR = 0;: _0 T, {) u3 ?( `. z# S% T
    if(!(istrin>>t[1]))istrin.clear();! d! l( S6 N# ~0 g8 Q( C
    for(;;){! \1 O; `' a0 p5 X/ e; I
        if(istrin>>csym[2]){
; P( ?9 c+ c  A, T. ^            switch(csym[2]){
) S$ ?4 ^% `4 k# ]8 w+ O            case '(':4 o  U! f$ C& r* U. h
                if(!csym[1]){nLevel=0x100; nERR=1;}else9 M6 U7 \" T( F/ o* g) z
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;' t7 S7 u: F1 H  J% C
                else{nLevel=0x100; nERR=1;}
5 m, I6 T0 t* k8 g3 X3 x                break;( \0 e7 E$ Y' U# o
            case ')':3 F/ Z; C( X: `; V7 ^" H
                {nLevel = 0x100;}break;9 ~8 Y4 Z, H+ L) Z7 ~
            case '+':case '-':case '*':case '/':
' E/ X( \& @) |! }9 }5 c                {csym[nLevel++] = csym[2];}break;
$ m5 v  K4 K% B: ?* K: G            case ' ':case '\r':case '\n':case '\t':continue;
4 e: M5 V! k3 h% }            default:
2 J) k0 J) h8 f6 n" |% l0 x                {nLevel=0x100; nERR=1;}5 q3 q. h! x- O8 s
            }
4 j; B. a: N5 q4 ?' G9 ?            if(nLevel==0x100)break;) _8 d0 W! c% A% S3 I* q$ V
            if(nLevel&0x10 || istrin>>t[2]){
& [0 x  ~) i5 n! _                nLevel &= 0xF;
6 Z, W: u0 b2 b% N% g                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
3 A: g: G- q4 B5 \1 ?5 J                if(csym[1]=='*'||csym[1]=='/'){
# x- K8 [6 b3 J5 d, g                    GetExpValue(t+1, csym[1]);
1 G) a4 G) p' h/ F  }7 F                }9 T& R  c2 s2 Q/ p! `, i
                else{9 X* }) a, a. ]3 r# Z
                    GetExpValue(t, csym[0]);7 r0 Q) s: c: c( s; D
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
3 i3 @7 R4 l7 [+ X                }
( O/ Q7 |2 u/ s+ m                nLevel = 1;
1 t# D4 ~; n$ h, g/ ?            }0 O2 g# ~3 V4 h  z0 u
            else istrin.clear();
% w7 d, s2 R% e: B+ _        }
) ?' Y! r. I8 x* o2 V: W, O        else{nERR = -1; break;}
2 K# s  A2 y! J: u1 C9 }: l: n) I    }" d- [; s& t/ O9 _% I7 ~* N
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
) n$ g0 W% u* J* t    else nReturn=GetExpValue(t, csym[0]);
0 X! S1 U6 N9 o1 Q2 D/ f( W    return nERR==-1?1:0;6 `+ H# b: y8 m- ]' m( P, G* `) F
}}* i1 \4 S+ `$ {2 g0 I( y

; y( i5 {$ W& N+ q; T- l4 N4 x- V8 ~& e4 C9 ]
/ I: x$ a; w& c2 ~
函数模板使用示例:
6 }" p8 k, L2 f8 j/ f2 z1 ?在以上那段代码的后面加上以下代码:
. r1 F) q/ X7 a+ r2 N9 Y, u+ Y* C% F
: D# H5 Z% P* p' h
5 Y9 i# M4 G: o" x, h
7 y! T! i3 `" G* D& X程序代码: ! T8 f" p* l' M9 q; J4 R

; `/ a2 z$ x: W4 \9 z#include<strstream>9 j# {$ K/ \2 Y3 i* }2 g: s
#include<iostream>5 x  C* y. z, I
#include<string>0 g* n% {* H! x- m* B, }# ~
using namespace std;8 o/ e" i! ?9 L( L
int main(void)
, a0 \% o: [4 N* W" e& J{0 V9 \! p! e5 \* z' E" |; X
    string s1;
3 |5 i: |. }: n! v% z    while(cin>>s1)& f* S" t5 X5 ^& `
    {
  C' z. V: F, }' ~3 N        istrstream isin(s1.data());
: U3 f  R' V- j, r        double d;% h& l8 g# N, K  O! I! A* Z
        if(fy_Exp::GetExpValue(isin, d))! W  [' t- K) D( ]0 B) r
        {1 O6 }! C* T' g9 j' D% r4 |% m
            cout<<d<<endl;7 @8 a" |2 S6 e8 U! N
        }7 M/ U# }- K) Z" l! [! l% P
        else
3 h) ~# c" b  d) ]- g        {8 J  Y% Q& E0 ^2 y  |- z5 b
            cout<<"ERROR"<<endl;
4 k. [4 B6 ^0 v) e: j! K        }5 {5 y) ^% H8 e5 {8 k
    }
# z2 w8 b6 X; l! W4 e    return 0;& j5 X5 K" o, h* T. M( `; j- Q
}
1 }' w0 Z! I# M" B7 `3 B* h& L7 B! s/ d" |0 p! C. h) p) `8 m
* X0 v: G7 d/ R
然后编译执行就可以了(*^_^*)
1 r; L$ {* a& ]0 H, w" i9 e其它:TC++上一定编译错误,不保证在VC6上也能通过编译
* H4 \0 V& F* Z1 B/ t, J      建议使用VC7或VC更高版本,或者使用GNU C++编译

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