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

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

在9月8日那天我特意编写的,给大家分享的,1 |# u4 J' X9 o
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式# C1 w' L( Z% X
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
$ U& _! Q* Q* M$ [5 n' G参数解释:: p* ~# o! S- ?  ~& N# f- {
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
, H, l) Y' f& YnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
5 F- B) ?- Q% ~9 q3 ]/ D( a返回值:! a- M5 A6 ?, @9 U
返回非0表示计算成功,0表示计算失败有错误
' ~0 q: E+ }1 Z* Z- V, U' y
% J+ o, f% t& k9 d $ C0 k* z" I4 D

$ z4 s! T8 w. W& W4 V程序代码:
7 d( j. P# u: k+ Y1 W: f( G' y. A' `6 }/ h
namespace fy_Exp{& x5 g2 r* o9 c" F. `3 q
namespace {template <class _T>
0 @! l! V: Q! }+ }& V! E9 y# H1 {inline _T GetExpValue(_T t[], char& csym){
5 z8 q/ W8 M5 T: d: d% [' `/ y    char c=csym; csym=0;
: z  z. \$ R1 T7 u* e8 v  Y    switch(c){* B) T9 E) I; g7 H+ T; k. {6 c1 l
    case '+':return t[0] += t[1];* y, c4 W$ G5 r/ [2 R, b
    case '-':return t[0] -= t[1];. v6 s9 p2 L; Z' d$ n
    case '*':return t[0] *= t[1];5 ^6 `& `, Q$ d" n! u5 l" m& t
    default: return t[0] /= t[1];//case '/':
( P  ~7 z- x* @7 E  I2 u    }5 w1 G' V" j5 t/ v7 M
}}
" G) Z. K# L, X3 ]7 r% y$ otemplate <class _T, class _Tstream>
" Q. [  Q8 J5 C! R$ A1 p/* _Tstream: inputstream, _T: get return value
# S" z6 C0 R. M8 P7 E* Return nonzero if get value successfully */
4 L) I' a# ?! f9 k" h5 N. f' Jint GetExpValue(_Tstream& istrin, _T& nReturn){. i, ~/ H3 T: [3 s
    _T t[3] = {0}; //雨中飞燕之作
2 D! c+ R) ~! p. R) `    char csym[3] = "++";. d% D% A; p3 K0 C( b# Y
    int nLevel = 1, nERR = 0;
- H5 R; R9 ~% e" P  {    if(!(istrin>>t[1]))istrin.clear();8 L0 M/ d3 ^2 D& I' t8 G, @
    for(;;){4 H2 S% f  ~. o" [/ m
        if(istrin>>csym[2]){
5 b* I* Y, v4 k            switch(csym[2]){) Y' c: {0 \6 N+ u  a' e( u
            case '(':- b9 r- M3 x4 ]- I9 z9 g- w1 [/ `
                if(!csym[1]){nLevel=0x100; nERR=1;}else$ W0 L$ o; w4 D  {! z. i8 R. }
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
" i2 {0 h. Y" z0 _                else{nLevel=0x100; nERR=1;}
+ O% k2 B6 g$ s' }7 ^  ]                break;
9 s, I0 r8 x) U+ l6 ~0 `            case ')':4 G, y, T- V4 n, A7 J4 t3 t
                {nLevel = 0x100;}break;
+ o& T/ q) e: E" [% |- F  x            case '+':case '-':case '*':case '/':
* D( g- k5 n9 S: Y                {csym[nLevel++] = csym[2];}break;7 r/ f% ~- z  O
            case ' ':case '\r':case '\n':case '\t':continue;
, @$ P9 `  ~+ ^            default:
" w1 o) l, u. }/ M                {nLevel=0x100; nERR=1;}
- a+ D) q2 ~  R( N0 N            }+ e6 y7 ^6 o% M' S; Y& g0 Z: {
            if(nLevel==0x100)break;1 x' v. V4 a! P5 c1 G9 b
            if(nLevel&0x10 || istrin>>t[2]){5 p1 t9 u4 V9 S' t" l
                nLevel &= 0xF;
/ D: t: P. u' r  c/ V& A2 [8 R0 g. S                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}( `9 w: t* ?/ X2 s9 x7 S/ N5 w
                if(csym[1]=='*'||csym[1]=='/'){( E$ k: A5 ?% ]' _: O4 h! m5 o: n
                    GetExpValue(t+1, csym[1]);2 @9 Q4 Z4 J4 y# |/ j$ w
                }( U* E9 `- U2 N* R0 i
                else{) V* M" E0 A0 `, X- L
                    GetExpValue(t, csym[0]);1 w  Y1 U' v* K9 G$ \% A! P
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;, {( t# ?9 @2 e( B  [
                }
! ]0 ^3 z' O" Z                nLevel = 1;3 M: ]* T' B7 A
            }
% E" ?- N+ X+ x, e            else istrin.clear();1 {9 j; Q6 O% [% S) r
        }
6 W3 X% O( n! \+ @+ h        else{nERR = -1; break;}
9 j! g6 B: V4 f5 Z5 z! O# i    }3 o1 ^+ B; X& `  r+ J; F/ e- ^7 c
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 i6 L8 y2 E* X+ C    else nReturn=GetExpValue(t, csym[0]);
. w! P  c$ K# c! [' {" ~  F    return nERR==-1?1:0;1 {/ E! H! {  ]- e$ e; r! `! s2 P
}}' t" g; x" M# ?9 O( c

) W3 P) t7 @( ]9 ?* O1 l
8 |- h: F8 Z: _" A, u9 {% Y1 x! U# g$ a: d7 x" E' |6 V7 M
函数模板使用示例:
0 X2 @) u8 A% H7 X* ~在以上那段代码的后面加上以下代码:  N! e0 c" D9 M/ S! K! E: }1 l+ @; `
/ [+ a5 l" p; Y. M) M9 C3 G

  q/ D+ {2 }2 j& t& W1 @
1 f. j' S0 w( z8 }* g程序代码: 2 t+ p% s/ Z9 U1 A, U& P8 {3 W
9 J4 p0 \' W5 W* }" W. R
#include<strstream>
$ ?9 |, |! W7 ~& @7 K, |  R#include<iostream>5 k' ]# h7 Y8 m( I
#include<string>
4 D6 }  T( F: u" ]- y# `using namespace std;" K: l$ Y/ y8 O) e; F
int main(void)- i9 j$ N" h! ]  A  ]
{% A1 e7 ~% V. l
    string s1;1 `1 x7 h  x$ n: f2 h
    while(cin>>s1)8 I: n- `" y- n% \9 S) O
    {
3 b: a* j7 ]- c9 P0 M        istrstream isin(s1.data());
9 j2 C+ a+ ^) K0 b        double d;# v- o- M" m0 r0 e+ U
        if(fy_Exp::GetExpValue(isin, d))
2 J7 m) g7 R1 J3 X% \        {! c# c8 o# u9 z* V0 D$ C; E
            cout<<d<<endl;- r$ {- \+ ~2 S9 T1 v! J
        }
$ U5 {) O& D6 v6 k        else
# s, K3 A( t" [        {
5 B5 ~6 O* m% f9 R) }            cout<<"ERROR"<<endl;  r5 N* X9 H" z" p" D0 F( ^  G/ X) S
        }/ }/ T% ~! o. f% }2 J' ]0 Q8 b# @: c
    }
& g  \: g* `. V) e7 _    return 0;
. j6 J9 u% E4 M: s- y' p}5 @1 x- B' ^6 L
# x8 v, s, t# `" o& M  ]4 H# i
# ?" r1 ~# R. i' S  |
然后编译执行就可以了(*^_^*)& L7 U6 o) w) J
其它:TC++上一定编译错误,不保证在VC6上也能通过编译1 ?( |9 j# O, _( l
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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