返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
! W! Z  ^% _: d) k" e9 o) ]% s一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
: Y% H/ ~& a: d$ x6 y* R只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)- Z4 D' _/ m/ H
参数解释:, L2 C0 P& d* h# ~: ]- K
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流" _/ }) G! N( Y' y% J
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定9 V4 ]1 s! i" c' |" C5 F1 |5 F2 ^
返回值:' ~* X* C. `  x8 Z1 X. }
返回非0表示计算成功,0表示计算失败有错误
/ h+ A' U4 q- S4 g7 B# l$ f/ [6 S. B9 n+ C6 f
4 m  Z+ w! s% O6 q( v. a* f/ U; r

( ]! v: Y0 Q! r" p2 ~  C. I程序代码: + \, G& W  k3 }& @0 e7 B
$ \# V9 S# G/ q' z4 H& a7 Q4 ^
namespace fy_Exp{/ E9 |( i& p+ R/ T+ b+ L% h
namespace {template <class _T>' `+ ?% O0 J, z5 y6 O& z
inline _T GetExpValue(_T t[], char& csym){3 E4 F4 L9 Z; t7 p
    char c=csym; csym=0;  e( o* X" B! z* _$ D) `
    switch(c){
  }3 I% D- U  q5 k; Z    case '+':return t[0] += t[1];
- T' b" x* Q& v) X) e6 a    case '-':return t[0] -= t[1];- F3 C0 s# s( h$ w4 o4 J# t
    case '*':return t[0] *= t[1];: m& `* B! N: r+ o
    default: return t[0] /= t[1];//case '/':
( I6 X& V) r( _- n/ a" G6 F0 v    }
. w8 d' z3 c, H( N" D6 a/ N}}7 s& ~6 t. i( w4 B- I& u+ h
template <class _T, class _Tstream>9 |6 X6 K/ j. s' ^% j/ ?5 I
/* _Tstream: inputstream, _T: get return value
2 Z8 l9 f* s4 I! B* Return nonzero if get value successfully */  Z& n* b  t9 M! b. j7 U% V
int GetExpValue(_Tstream& istrin, _T& nReturn){
) t4 M+ Q' u7 T    _T t[3] = {0}; //雨中飞燕之作3 d6 q/ o8 u0 R# M: W6 }' }+ L
    char csym[3] = "++";2 R, [" y: U# S% w( E$ M
    int nLevel = 1, nERR = 0;
" K; H# |3 w9 d& B3 S. d) q& ^    if(!(istrin>>t[1]))istrin.clear();  e! N9 Y) d# l' r
    for(;;){2 j, W; L# }1 j8 U: j4 }% g
        if(istrin>>csym[2]){2 E) j5 p" A0 i. }
            switch(csym[2]){5 r* X& s3 M5 R# L6 t# n0 ^
            case '(':* I0 b7 \) t5 e
                if(!csym[1]){nLevel=0x100; nERR=1;}else
, U7 H) q% Y9 C1 v$ P. [, l                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;& `- s$ j5 ~6 A& C; v
                else{nLevel=0x100; nERR=1;}
& y4 j# c1 {2 z4 Y                break;
! u' p% D% g$ i  Q9 S            case ')':9 f! t! r8 }/ ]; n
                {nLevel = 0x100;}break;
+ I! Q, ~4 G6 N; L) h" n            case '+':case '-':case '*':case '/':
' l* k; T; \# t; ^1 ^( _/ W                {csym[nLevel++] = csym[2];}break;
! E2 R- V# v2 R6 I7 ]            case ' ':case '\r':case '\n':case '\t':continue;. y9 \( e5 ?" Y3 e" _
            default:
! I4 U" I0 i, z% A; ^                {nLevel=0x100; nERR=1;}" ~3 S. ^3 o, d9 D: N1 b7 g
            }
+ x4 F" g# d+ x( Q0 k1 j+ c- L            if(nLevel==0x100)break;- I. f* q/ W& c1 m5 A
            if(nLevel&0x10 || istrin>>t[2]){# e% n: D( s9 @; f# q
                nLevel &= 0xF;+ F& s7 ]/ t1 t" }; }
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
8 p5 b+ ~" E8 H3 m+ N) K5 i                if(csym[1]=='*'||csym[1]=='/'){- W2 p7 d; o: P* |2 {
                    GetExpValue(t+1, csym[1]);
' x. `) k; Z7 o: b1 i                }
8 A5 ~' V- F, x: g3 K, n                else{% F0 M) M* v+ k2 |4 Z5 U- J
                    GetExpValue(t, csym[0]);
3 ~  M# |: x( a                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;4 n3 ?+ E8 H/ [, N( N% {
                }2 s. F0 ]9 ]( K+ {$ i$ F3 [% j
                nLevel = 1;
( P" W8 I- T3 N9 @            }
8 U' u# L  l  ^* b( S4 M& M            else istrin.clear();
" v. h+ b, B  F: {# U$ J+ v        }# k8 w7 y, c2 D4 Z, j9 Y: m
        else{nERR = -1; break;}
& Z( S4 q+ _% P& B    }
* X6 |+ p; U4 d! y' ~$ I    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
( f5 B( {) H! L    else nReturn=GetExpValue(t, csym[0]);, }# @7 w- i* N; p
    return nERR==-1?1:0;8 t8 c, p" s1 ]% }- O
}}
4 c9 M: b4 D5 ^' q& L! w, O$ f' p7 j. `9 r8 S3 \

: d8 z* `; {* u, n% @) M  @& k3 t
函数模板使用示例:4 U- p9 v5 V7 l
在以上那段代码的后面加上以下代码:
* p# M, w. z- f5 g( K8 c, w3 O0 x% u1 d+ h) P8 F- W* G6 Q# ]

) }; E: s( }- K$ i6 q' h1 {7 _" G- l( E( H0 v2 E/ L" P$ r
程序代码: ) l* i+ W/ z( u4 G
. {% I7 W, J  i9 a  a; M
#include<strstream>
3 W$ X  k5 T) c  P8 P* ]#include<iostream>' l# A, D5 ?( m1 c
#include<string>2 d1 m: {5 ~/ D  J- j$ `% g
using namespace std;5 l' ]9 R1 ?2 s/ d6 z
int main(void); ~8 _9 X7 ]. u
{2 M" N; i( \0 r( H' R
    string s1;1 p+ ]$ I2 v& @3 J' ^; Q
    while(cin>>s1)
- H$ }$ y9 S# C5 c    {
' {7 }( ?3 v$ ?. h: }/ F6 o" e        istrstream isin(s1.data());. A$ E5 r$ ]6 W# t, Q; n
        double d;
) g2 l% ]! [) F9 a        if(fy_Exp::GetExpValue(isin, d))+ O/ w) p  K6 C9 o% _1 d, _+ c' d2 G
        {4 n( r6 {3 t/ V1 ~0 P
            cout<<d<<endl;
. q$ I% [* b$ x% {. y9 f3 A( D        }
! }- V7 Z$ c2 F6 s4 t* \7 S  u6 ^! k9 m; R        else
- j& Q) o' j0 k& L6 A' u( j9 B        {" j, t, ?5 _$ S8 v4 H  w8 p- D) \5 k
            cout<<"ERROR"<<endl;. U* M) X% W0 z% o  K+ h% K2 U# a
        }) s: o, ?# ?% Q
    }* l3 `. _8 p) U: t: F
    return 0;6 ]5 o+ T, L$ X9 J
}
# o5 `! H* j$ k% t
4 b" J- i) P# \$ d9 a) a% ?# O6 D3 f6 g% ]1 i  _. ~* G
然后编译执行就可以了(*^_^*)
- Z0 Y; y7 Q7 d! I6 ~其它:TC++上一定编译错误,不保证在VC6上也能通过编译( E" [2 n- E  d1 I- D
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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