返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
% Q7 t/ \1 `) L2 o- w一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
! B3 s  i7 C2 n. U只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn); T# r. d5 \: D& W# K
参数解释:
7 o4 }# E1 N- d: Fistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流: F7 M% V& H4 }- k& Z2 [7 _
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
8 V. B! f2 W8 C9 C  [返回值:
  y- Q& l# Y( f7 B) V7 ^  t返回非0表示计算成功,0表示计算失败有错误
7 E4 `) @4 W* L/ W. n/ }
8 w' @- ?3 `9 v) N0 C! z# W
; b' {/ I! y$ t
+ F) x3 Y! G2 h1 @程序代码:
5 B. U! q* O8 g: O( u: p
& E! [1 Y$ u7 c: X8 a: V; Znamespace fy_Exp{
6 R: n" n. r4 t/ ?, l9 o) n3 ]% knamespace {template <class _T>
  |+ R- `. e8 C* s- B+ tinline _T GetExpValue(_T t[], char& csym){: a; Q& t2 T0 W; v
    char c=csym; csym=0;$ \- n- Y# z7 w- Y8 B0 _
    switch(c){
5 A/ ]/ ~$ }- S    case '+':return t[0] += t[1];+ T2 J: s0 u$ S: X* W5 |
    case '-':return t[0] -= t[1];9 R$ I* Z& D) Y) C/ L
    case '*':return t[0] *= t[1];
) k8 u" D: j  a0 H    default: return t[0] /= t[1];//case '/':
$ ~0 h9 L# e, ~" {4 m& U0 d    }) g0 `! o8 \0 k$ a; l0 c6 J
}}
( |. c/ y  e% }6 ktemplate <class _T, class _Tstream># G9 i6 Y% l" e  w! s( W5 ?
/* _Tstream: inputstream, _T: get return value: |- \" n: \, c( C' G* H5 Q
* Return nonzero if get value successfully */
4 k. {1 G. B  O: @9 u/ x; j; i7 Mint GetExpValue(_Tstream& istrin, _T& nReturn){# ?8 d7 e% H) ]
    _T t[3] = {0}; //雨中飞燕之作
6 M  p3 D7 i/ R- e/ I0 t    char csym[3] = "++";
: ^! o. Y5 g7 ]2 u    int nLevel = 1, nERR = 0;! Q1 k2 h: `: {: u: M
    if(!(istrin>>t[1]))istrin.clear();
" j/ ~3 K2 Z# }7 m6 f    for(;;){
; ~& R, J# Z; R  }4 e        if(istrin>>csym[2]){
! L+ n3 X0 b+ B! F# t            switch(csym[2]){) O% Q) W) l9 e; z
            case '(':' O) a2 \% j" Q) R
                if(!csym[1]){nLevel=0x100; nERR=1;}else7 h- m1 ^  B8 a7 Q# g
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- g1 J) g; b& O. j# ]) P6 f
                else{nLevel=0x100; nERR=1;}! H  ~6 R8 J( T1 V" l* K
                break;1 t( k/ j% \( S" Q% f/ d
            case ')':
! d9 \* F" ]; A2 h! Q+ S1 b# @' G: J                {nLevel = 0x100;}break;
! t: r! H3 A/ }5 x1 a            case '+':case '-':case '*':case '/':% {1 G2 l- ~6 F0 p; Y
                {csym[nLevel++] = csym[2];}break;
1 e8 j9 g1 e8 C! Q' E            case ' ':case '\r':case '\n':case '\t':continue;1 {9 n" I  \9 Z, U- R/ S! B1 j
            default:
6 |2 x% d* }4 f/ {4 X                {nLevel=0x100; nERR=1;}
- A5 E2 B2 U0 j1 x2 u            }. d/ u6 i/ ^9 A, ]4 H
            if(nLevel==0x100)break;( F/ ~8 H& c0 z( h, O2 e
            if(nLevel&0x10 || istrin>>t[2]){3 _9 V+ h! T4 D8 O# Z" d3 Y( l
                nLevel &= 0xF;( B% [  M0 A' Q4 W& q
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
/ E, G9 M5 H5 A                if(csym[1]=='*'||csym[1]=='/'){
2 v" m9 P: x5 c8 ~5 d, C                    GetExpValue(t+1, csym[1]);) N* @  n" Q4 I& Z8 D: t
                }
/ a% _& o. q# y% D7 ~( a                else{: f2 Y! ^4 t' E8 B
                    GetExpValue(t, csym[0]);
7 U. t+ w% {( t) j7 b$ d& v                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
9 S" u" n" C+ ?  ]                }5 n" j8 _7 l/ O7 F
                nLevel = 1;6 t$ p8 I5 [# f* E
            }; Z3 {& L( n% X0 [$ e2 d
            else istrin.clear();8 k3 ~' T0 C% K1 ~
        }
( x1 R% h- s- ~* o2 z9 ?        else{nERR = -1; break;}
4 G8 o( X' X, S9 R5 e  Z    }# H- X+ U* H* o6 A" d. f
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 ]- U( k& }) z" |& ^( m
    else nReturn=GetExpValue(t, csym[0]);, H: X6 U0 A& ~4 Y% Q' K6 ^+ I. p
    return nERR==-1?1:0;  i; q* H% a7 H: C
}}
, z' J# D+ c6 g  x# c0 d: O+ S# [# F- k. D3 g
! M( w0 N2 Y0 W1 B. B& _( H
9 }' d1 H' @" i! [/ \$ w4 A
函数模板使用示例:
& @) K* J4 J5 ]" P3 G  }在以上那段代码的后面加上以下代码:" K; H" }% D& W

8 C6 @2 Y5 L( v* g0 i ) x7 Q4 u& o  {) p+ O- U

5 N" O. T' Q: I* n1 Z. o4 M程序代码:
, l5 M3 q$ p; B/ A! ~9 o$ E& D6 P0 M0 m+ K  V$ t/ d
#include<strstream>
( X2 P9 F( T/ O8 _9 H#include<iostream>! s5 D8 o. v1 `8 ~
#include<string>
. D2 L" B9 U# {( K' z8 z+ pusing namespace std;
1 |$ A5 d/ ~. G) l1 @+ lint main(void)) h9 N) k, v% F; q
{) U4 Q4 Z3 I0 C- o
    string s1;
. L' T  X6 c" Z    while(cin>>s1)
& [& L" l& @* J0 B* T- L    {
* |; G. N& o5 r2 i& Y6 P9 U! e        istrstream isin(s1.data());6 ~' K2 [+ {- [6 `! _0 Y9 ^
        double d;
! Z& g, X3 z# j; V! r        if(fy_Exp::GetExpValue(isin, d))7 k7 X$ K! d, \
        {
* o) j1 q1 J. J/ x4 j5 q7 n            cout<<d<<endl;
: P3 a* @! ~0 k5 W. H( g        }
( M" L) _' O9 R# S- D. n# {        else- }3 D& {9 I% M& b) ]/ x4 K
        {
  ]3 r* m, _! {; f            cout<<"ERROR"<<endl;6 I# A! x* F' a) [: u* l8 n4 n
        }8 Y0 R1 t* {" q8 g
    }
4 z6 N: S% H( S& ?    return 0;: J  Q$ J* Z" y& V3 I( N/ V
}
. A5 |$ r( w+ j* x9 p% ?( U0 r# q9 }7 U% l0 E& G4 m( X4 k
% d. ?7 z8 M+ x1 G, m
然后编译执行就可以了(*^_^*)1 ]( J: v& t- z8 u9 `
其它:TC++上一定编译错误,不保证在VC6上也能通过编译7 Q2 ^. k5 B2 z5 @2 \% t
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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