返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
. R+ J2 \: j7 t6 y7 X7 M/ M. I一个很方便的函数模板,可以并且只可以计算含括号的四则表达式! U6 O8 s. ~, n! L" `
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
- q5 Y' Z. Y! f1 j参数解释:
+ c! K4 H  V8 n, z5 R( S6 A9 C6 p* Eistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流, B! M8 Z6 y; {3 ^( ]( u0 K
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
0 h) S9 |3 |" m- O* G' Q, p返回值:+ ~4 A- J; S% u1 E1 d4 `  r8 F, ]
返回非0表示计算成功,0表示计算失败有错误
& b$ Y2 `; c. ?6 U3 u( t% U
+ W/ Z: E. H6 P: t- Y
% ?8 D, E4 P2 N
# i$ L. j0 F: Y7 c) R程序代码:
- H! Y4 e! @/ E3 d! _# ?0 l  I" W* Z
namespace fy_Exp{  t3 H. I+ e4 J9 D
namespace {template <class _T>
2 ?( a8 k: c8 M2 ]) uinline _T GetExpValue(_T t[], char& csym){; _% n! R" y$ @8 [0 O2 ^, G
    char c=csym; csym=0;
5 u) e0 x  w9 {! ?    switch(c){
' Y; Y6 M$ Q3 O4 v    case '+':return t[0] += t[1];, ~+ D$ C) d' @, [( T8 S6 T3 [& h
    case '-':return t[0] -= t[1];) o( n( V. r% I: X5 g2 h
    case '*':return t[0] *= t[1];
" x5 c5 c( O& @2 z. n6 y6 ^    default: return t[0] /= t[1];//case '/':; j: U8 E% X: D7 o
    }3 @# Z# l- C2 {& s+ X' t5 v
}}. k& R3 m7 q3 Y* ?! \
template <class _T, class _Tstream>
# E, T2 r. o! C/* _Tstream: inputstream, _T: get return value$ I4 N; j% i  c9 K
* Return nonzero if get value successfully */
% t$ |: Y; m( I- jint GetExpValue(_Tstream& istrin, _T& nReturn){
7 ?) j8 c4 k. E! E6 U$ e    _T t[3] = {0}; //雨中飞燕之作
- `- D& w  L# Q# q8 _# }7 t9 l* B    char csym[3] = "++";' t- F& z- X2 [
    int nLevel = 1, nERR = 0;
$ ?7 [3 S! P4 l    if(!(istrin>>t[1]))istrin.clear();
7 L, K! L9 e$ r! p, f8 U$ x    for(;;){3 h' f1 J+ _- i
        if(istrin>>csym[2]){
5 d+ ^9 J4 S8 h* a* m            switch(csym[2]){0 Q* S* }" j% w) @
            case '(':
6 e- X, Y4 k4 A  e- y' W& R                if(!csym[1]){nLevel=0x100; nERR=1;}else
' D  h8 q$ T$ k% F% [5 z9 S& ?                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
9 [* z$ d, J7 X7 k3 C9 `8 w# E                else{nLevel=0x100; nERR=1;}
; q6 t/ {( j$ l" _                break;
8 z( B$ Y4 x4 @/ ?            case ')':+ m+ k% S) `, ]# V: p
                {nLevel = 0x100;}break;
, ~: Q+ X4 I/ v& y, D            case '+':case '-':case '*':case '/':
! x: Y# A) j, S# F. x# C; ]                {csym[nLevel++] = csym[2];}break;, H/ O& h2 A: c- x
            case ' ':case '\r':case '\n':case '\t':continue;# J+ K2 g3 k# [4 N' c8 o5 ~( _* A9 y
            default:
! T9 |2 k) A/ t$ b- i  X8 ]                {nLevel=0x100; nERR=1;}
% h- G% s0 B# H7 G* Y            }- U; }9 s- l4 y& s4 u8 s
            if(nLevel==0x100)break;
6 b- p, r) O3 j  A            if(nLevel&0x10 || istrin>>t[2]){
  I1 B! ^9 t2 T& O/ ?6 g                nLevel &= 0xF;
& z  X6 G/ Z8 }                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
4 }5 G6 h4 d6 C, |3 v4 [: K                if(csym[1]=='*'||csym[1]=='/'){. F+ s3 s: b8 {$ G
                    GetExpValue(t+1, csym[1]);8 n8 C& P( D9 x
                }  b) @- r( u$ a2 M5 e3 Q+ Q" R. _/ p
                else{) R% f* P: C3 e2 R/ q
                    GetExpValue(t, csym[0]);
* `8 }/ D# ]/ A- F                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;; ?! Z9 f9 K. X. a) v
                }1 i  V! D  X) L( e
                nLevel = 1;6 k# J- f) o# C7 y$ o7 Z4 p) H' P
            }
% n+ r4 S6 J, C( Y            else istrin.clear();$ @8 v# D) L+ U* Z; `! N. V3 l
        }+ ~0 [5 y0 O; L3 S5 D
        else{nERR = -1; break;}
. s0 p6 O0 Z; E    }
7 w; `+ W) B. i9 r0 k    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);* c" L/ X( e7 R0 H, s! M
    else nReturn=GetExpValue(t, csym[0]);8 s1 w" j( ^- i9 D6 }
    return nERR==-1?1:0;
6 o) w3 [9 i' i$ X+ l}}
$ O" ^  _; o, |$ r" I
9 f! N- ]0 y7 M! [2 W/ P+ I! u  }" Z& L; c4 i& R

  r, H; S% s* k" X: r, l函数模板使用示例:
$ j/ Z$ `, p; c$ F在以上那段代码的后面加上以下代码:
; d0 w  M# u: [* ~  W8 [
* z. ]& Z9 C$ S0 ^$ Y
5 W: t5 E" z8 ~
# A. K% g2 \. k! ?. y8 y! m程序代码: " m2 R, y3 ?0 g% n

0 n+ i5 E/ \! O5 z/ M#include<strstream># I6 O" {, u' G6 R" W6 l
#include<iostream>* u: I8 }$ r4 ~
#include<string>
1 O# x7 s& B- W/ I9 ^+ m( Ausing namespace std;
+ W; k2 o! Y1 ]8 V6 f- Hint main(void)
. ~1 m# [1 I. p6 g{
. j6 X# _4 R' ^    string s1;
* J  A- ^! }5 \/ h  @    while(cin>>s1)
9 Q& V. \3 t& K+ j& u: y) {7 w  v    {% m9 K. E9 n- Y5 u1 d; s8 f" i2 J
        istrstream isin(s1.data());
9 k' l# J6 d. Q& A7 u4 q        double d;
9 U$ q1 c; z6 l& I) r* T7 L/ e        if(fy_Exp::GetExpValue(isin, d))5 o* }' h1 a1 h$ e0 v3 h2 m4 N7 d
        {
9 R. F- Z+ R/ T            cout<<d<<endl;
# Y( ~, }) ^$ |' |; N! O" g8 X        }
' _7 N" _4 c" L+ o! `9 C        else8 i* e# x9 w) d/ _5 S/ ^  A
        {" P1 H# c! X9 E7 c# h
            cout<<"ERROR"<<endl;
0 t! [$ Q- n) U+ \        }4 d3 Y0 R+ o. z/ a& ]' C
    }
$ k6 o- c1 {9 G- {$ \; {2 M. f! i8 J7 Q    return 0;
+ C( Y" l$ [: Q( [) I}: g4 Q7 ]3 m$ q7 Z

; D+ P7 N$ X( f" @( C9 Z4 G- _) j
- ^) L) d$ g- R9 k+ d2 Y然后编译执行就可以了(*^_^*), K! ^7 h( ^2 i) ?9 j% _
其它:TC++上一定编译错误,不保证在VC6上也能通过编译$ l/ R5 F! h5 V, j4 E
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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