返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,- h% Q  q; Q% @1 ~) ]( W
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
! s: h" {: L# o# S  \  H只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
+ R9 x+ [" T9 }+ d6 e4 @参数解释:
$ O. Q3 F1 f$ [4 ristrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
: L/ w( B, X6 h6 W7 v1 O4 R2 C& rnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" t& P, n$ s2 }0 W& }4 }  {# M" F
返回值:! O% p0 P6 o$ R8 M; O
返回非0表示计算成功,0表示计算失败有错误9 S4 I5 w0 y/ D  b+ G/ w5 D4 N  O* ?
# p7 Q5 ], ]+ J
9 J, N9 j6 G8 [7 f" A/ ]; v

1 t6 i9 {7 T: J程序代码:
, t" i1 [4 p0 d1 i* u  Q) s
( g8 R6 @& Y2 C2 rnamespace fy_Exp{
4 ^, D3 d( f8 O, N% Mnamespace {template <class _T>
0 V- Z; c, f7 M9 E6 O, O: ginline _T GetExpValue(_T t[], char& csym){; ]  ^3 X; ~9 i) H- u# {
    char c=csym; csym=0;
( r0 Y; P0 h( w# r3 N    switch(c){0 q) r5 I% [4 a6 H" y% I$ R
    case '+':return t[0] += t[1];" @! V  h! C) n
    case '-':return t[0] -= t[1];7 ?( G- f# t# U4 P8 _3 S
    case '*':return t[0] *= t[1];7 E1 n" A  b* Y8 a5 i
    default: return t[0] /= t[1];//case '/':& g6 U1 @, h* b# b% i# L
    }# v; {1 ^1 R- G# d: e% q7 T
}}
9 ]9 M8 h" C: z* R, J. I2 wtemplate <class _T, class _Tstream>* V% B5 l) ^5 E: E8 }7 e
/* _Tstream: inputstream, _T: get return value
; P7 o" @6 G) B: R, e* Return nonzero if get value successfully */+ k$ m  I% n4 ?- Z
int GetExpValue(_Tstream& istrin, _T& nReturn){* n1 L& ]& Z/ H* {" h- v9 t( s0 |- H* b
    _T t[3] = {0}; //雨中飞燕之作1 P& ^1 A# A6 G: A
    char csym[3] = "++";7 |- p( ?. L/ e, j& I
    int nLevel = 1, nERR = 0;
: p2 O" F. L: F$ c. Z0 u* _7 ~    if(!(istrin>>t[1]))istrin.clear();3 @# ?& R" Q8 o
    for(;;){, q; N- t+ p2 p0 U) L
        if(istrin>>csym[2]){* Q& X6 }# ^2 o  N" g7 F
            switch(csym[2]){- M- U5 a5 k; {( }6 F; X: t, w( O$ |
            case '(':
, m2 f) {; b0 G# b2 \7 `# j                if(!csym[1]){nLevel=0x100; nERR=1;}else, W8 |  G1 S$ i/ A7 `
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;: h: ?! k3 Z/ f! N  b
                else{nLevel=0x100; nERR=1;}  D% y! U* {  \5 U$ k' B/ m" ?
                break;6 K, q( G5 k( }/ [8 T1 F
            case ')':
( S0 u. W  R1 q2 A                {nLevel = 0x100;}break;3 {* J1 `" F" a" n6 C# V
            case '+':case '-':case '*':case '/':
* m7 y9 [$ W& M                {csym[nLevel++] = csym[2];}break;
. A& L3 X9 a5 T3 ?* J            case ' ':case '\r':case '\n':case '\t':continue;0 H& `" x& o. z
            default:
% o: E' k9 K. f4 H$ g4 W                {nLevel=0x100; nERR=1;}& O: j, l' l0 x
            }
- i- b& |" @. X0 q7 Q1 e8 ?& D            if(nLevel==0x100)break;! D1 _( H/ I) V  L" r$ G
            if(nLevel&0x10 || istrin>>t[2]){
/ y& }4 M7 h. i" ^3 Q7 c( m                nLevel &= 0xF;5 O* G# t% d2 k( Z$ Z' N( m
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
3 g& c  l- j' C/ r. y. C. R7 R; s                if(csym[1]=='*'||csym[1]=='/'){
; s  u( V+ Q+ G" t4 U' S3 [1 Z) B7 m                    GetExpValue(t+1, csym[1]);
" c6 V8 ]. ^* I  @                }7 G7 X- R; C% @
                else{  K5 r4 {& ?7 J, Z
                    GetExpValue(t, csym[0]);
% u2 L: j; ]+ e# D- v; K, P7 e* @                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;: I7 B% \3 ?/ _. H. Q! _. ?
                }# q& `3 _7 N( F5 A
                nLevel = 1;1 W$ u$ k* v. w2 ^
            }
" R" |6 v. Y$ h- X/ v2 _            else istrin.clear();
6 k$ w& t% v% X        }
4 j2 w+ K3 {9 N8 a6 Z, t/ m3 w  F        else{nERR = -1; break;}
$ M, r2 A% b+ ?* p. B    }5 p* M% H9 X8 p
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 V2 c  I6 e% E- \( f    else nReturn=GetExpValue(t, csym[0]);
1 g  s( _  ~  g; d, {3 ~$ I3 q' T    return nERR==-1?1:0;
/ A4 m  _) o2 G& l# l8 H& `}}+ N2 }' X# X' Q- k

" k5 `, z+ l3 d: M. i! C0 h, R) f

8 h; n2 l! h% V4 C, o! h函数模板使用示例:3 {+ g5 v* m. ~) W; S5 e- g
在以上那段代码的后面加上以下代码:
. h4 F, i* s' W* L& |
: `5 f5 `2 @) ~- I) @: ^+ n: N # r0 Z( o" r; \/ k

4 |. y6 ]- [* m1 {- V4 e8 w程序代码:
& l. v  d/ ]& L/ n1 n9 i8 ^/ ?3 ~( g5 D7 o: _& d; G/ z
#include<strstream>
# A8 |8 o$ W* ~& p#include<iostream>
% I, F* _; b1 V) `#include<string>
- C5 B, f7 A+ |: b, qusing namespace std;3 t4 J% @4 U5 p( `- b2 @5 |
int main(void)
- I  N* \) h- ?* [& c{
0 j" a! W+ r! h1 H# W4 Y6 J    string s1;
" i' J2 D0 h2 G' p) W    while(cin>>s1); @. S4 l% v* ]% x9 u! y
    {5 y. f2 I2 |+ v9 F! ]* A+ ?: f
        istrstream isin(s1.data());* H/ v+ O' h; F5 n. P5 e. }
        double d;: F: }* ^' S! R: p5 s8 O* ]% y8 z
        if(fy_Exp::GetExpValue(isin, d))4 m$ i0 m7 F4 R) q4 e# ]
        {
8 E& {) Q, y1 K4 K5 |7 Y! L4 y            cout<<d<<endl;
  m; |/ W) H+ \        }& k. F/ I' Q& I( a  V9 Z
        else
( n6 d2 @, {) l        {
; I8 w) g# ~. ]+ D* q5 M: r' ?7 H" i            cout<<"ERROR"<<endl;
; B. n# Y+ U# ^        }* D6 n* R& U- K
    }9 B( P, h; a* ?  e, X- m" S3 K- f
    return 0;. B/ ?' R+ a1 D9 u  q9 b  v4 D
}
' i0 N5 [7 Y% U) C3 l
( l7 P9 J8 W% s- U' K# Q0 @
* \  _* @( Y$ ]& |; y' l9 p  z然后编译执行就可以了(*^_^*)
7 j9 g2 t5 x, \* j( `其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 U( V8 s9 C7 l+ D: ?      建议使用VC7或VC更高版本,或者使用GNU C++编译

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