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

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

在9月8日那天我特意编写的,给大家分享的,# @7 {! ]0 @5 B5 c* t7 u4 f
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式$ G- x. s, U% ]$ E8 v
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn); [5 [1 c% P" d  {8 v, J4 O
参数解释:, }! `8 J$ b( ~7 @4 F
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流9 i1 U% s' A& X& V. e' E
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定% j8 o  q) J6 Y3 F! m
返回值:
: u# u6 X7 D: u: Q! m返回非0表示计算成功,0表示计算失败有错误' K( Q6 W$ H: X' s; m/ P
9 O; z! K4 s# w, z, N6 h
! F/ i5 T3 f3 n. X: r
6 ^  G3 V3 Z% J0 v9 H7 n! k
程序代码: " N8 _+ v% m5 {2 {4 G+ X* {
/ S! o" U: h) W5 v/ J* {
namespace fy_Exp{) O4 s7 e: S) M, z1 I
namespace {template <class _T>
4 R0 N9 Y9 F/ J# zinline _T GetExpValue(_T t[], char& csym){# G0 X( `& g9 G- ~' c/ e
    char c=csym; csym=0;
* n! M$ D% W0 \/ @4 Q5 s    switch(c){% n5 V7 a6 B! R4 D- m, p7 N
    case '+':return t[0] += t[1];5 x. |0 T+ e' H* L) C% ^
    case '-':return t[0] -= t[1];% H( M3 b) I/ z" K
    case '*':return t[0] *= t[1];
& P% I6 r' ^* f4 q    default: return t[0] /= t[1];//case '/':
9 D. K0 @( U: [6 O# t" m4 _5 n) @    }
4 i! B; t6 }( p. `# t. |) [% s}}
6 e) g( ]- F% O1 Q7 |- ytemplate <class _T, class _Tstream>2 D9 d( ?6 Y5 f& w% @+ U( Z
/* _Tstream: inputstream, _T: get return value
9 H/ W( c0 j  o) [' Q5 |/ Y* Return nonzero if get value successfully */
( u& _) l/ W& ^4 C) l+ `6 fint GetExpValue(_Tstream& istrin, _T& nReturn){
2 C5 `( q% i+ o7 V+ b+ M    _T t[3] = {0}; //雨中飞燕之作
& @6 B2 g' N# p" z6 N) G( Q    char csym[3] = "++";
( j  E' N+ w. v% G2 k    int nLevel = 1, nERR = 0;. v. z+ o: C5 j1 t
    if(!(istrin>>t[1]))istrin.clear();
! ?2 w+ B6 m- b: a/ D    for(;;){1 @+ N7 g+ k$ ~4 G% W+ {$ f) p
        if(istrin>>csym[2]){
# Q/ F/ x  f7 m/ M3 u! v            switch(csym[2]){7 j9 h: g; M8 B" ^& u. Z6 l8 j- m
            case '(':
8 E8 u' K7 p) c2 k. k+ T1 _                if(!csym[1]){nLevel=0x100; nERR=1;}else- C- I. o% i/ I4 x
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
  `! V8 G% `% E) W( |* l                else{nLevel=0x100; nERR=1;}3 j6 t# o* q( e3 }* m: m3 t
                break;
3 M3 P7 N5 l7 _7 n7 ~* r1 }5 D$ D+ Q            case ')':
( c4 u7 G4 f5 M: ^5 Z                {nLevel = 0x100;}break;. c$ B6 D8 n3 R6 h. E% P" C7 S: @
            case '+':case '-':case '*':case '/':
! i2 P, w; w* R7 U0 a2 v- ?                {csym[nLevel++] = csym[2];}break;- ?/ G0 V- |" m
            case ' ':case '\r':case '\n':case '\t':continue;# t. {; S9 H1 |: x7 ]  d" v
            default:
3 ^3 X3 M4 p8 H# @9 {3 Q                {nLevel=0x100; nERR=1;}
. i  _( f0 ]) L" D' @  L            }7 h/ B: [' E% P  z8 h$ B7 O
            if(nLevel==0x100)break;6 c5 n4 K3 j& P1 U
            if(nLevel&0x10 || istrin>>t[2]){
7 u3 t, S6 C8 G! ?* d                nLevel &= 0xF;
" O8 G. w  q: s) X) x! a1 \                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}& x4 U- {" |6 e8 Y7 u
                if(csym[1]=='*'||csym[1]=='/'){
+ E8 e: c. x0 i! W4 V& w                    GetExpValue(t+1, csym[1]);
+ D7 |# w* |4 ~0 f* O& i                }. ?* @6 f% G6 R) P  B1 f
                else{
! A" _1 c" l, I0 T/ m! \- {  O                    GetExpValue(t, csym[0]);2 H1 z& y6 W% C* Y( u
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;% B# w! V) k% {; q6 C0 Q
                }5 ~( o6 E2 I! N, [
                nLevel = 1;
2 m8 w, U* A. g, a5 a/ u/ x            }4 A/ y1 V  a7 K! Z" I2 C9 s: Z
            else istrin.clear();
( I: w. v+ r% m( A        }
' ~% ]) b% C: K8 C* M8 ^( \        else{nERR = -1; break;}* q2 E; ?$ R, S! {9 l! X
    }
. i8 n$ O* O& @( J$ f    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);, ~5 Z. C6 z! p0 }/ v( l& g
    else nReturn=GetExpValue(t, csym[0]);7 f7 b! b3 X1 S& i% M
    return nERR==-1?1:0;' ]5 M7 r* l& q; A
}}
' {9 {+ `* N6 [7 Y; T6 N: M' r9 k7 k
" f1 L9 w( L7 i% V

* C! s$ D* \( G0 w) G函数模板使用示例:
: y; ~( t) f( }% [* C! D  ^* K2 U1 O在以上那段代码的后面加上以下代码:
: E9 r5 L: Y, i2 }7 {% T0 T
5 Y* |, R9 w' l/ J
- i, A9 @5 A4 s8 E# S+ Q% L4 L/ R
4 Z4 f3 o" r6 `6 Y* P程序代码:
" F0 n% e" K' \8 ^8 b) O- [, |8 k( t, a$ E) P" ~4 f
#include<strstream>
2 v5 H: t0 t7 B3 r#include<iostream>
+ Y+ _. f0 E; F5 l9 ^9 `) n#include<string>
* m% k9 a( N. q7 y% \! Uusing namespace std;8 K+ j' h- W. O1 z
int main(void)
8 S3 z- n' J; c  [  n5 `5 I! P{
2 p$ R5 Q, H1 m) e6 a    string s1;
9 @( _  H# k5 ]- H& \, [( O    while(cin>>s1)8 y0 \" }7 h2 Y4 R. O+ h% U: c/ C
    {
* L' u* |) X( `        istrstream isin(s1.data());
* ^; n1 I0 K. I1 b% [; {1 G) h        double d;
3 I% _* a# x4 S        if(fy_Exp::GetExpValue(isin, d))
1 V: v. x" D' F! C        {
% Z4 O1 C; I$ f1 f            cout<<d<<endl;
" }1 i) b8 G7 t+ d6 X9 l        }
4 [6 w: b" R) z+ T8 M6 T$ n6 D8 Y        else/ C8 ~; f1 x# v4 W2 f% W& B  J7 T
        {- q3 D- U4 h) j0 v' s6 K. s
            cout<<"ERROR"<<endl;' p5 `( B. f) k( C
        }+ n4 [! \0 v: n
    }
. t; e& @  g& C7 W; c0 g2 j+ x* \& _    return 0;% I+ w0 b" ?% A. ?2 V
}
# x% q, K- j! k$ ?) E, X' ^- O2 ]9 y* g& s" ^5 |

5 R# G& H% |9 h然后编译执行就可以了(*^_^*). |' N8 {' ^  E; T  Y
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
* e: @0 c& ~" T6 f9 N      建议使用VC7或VC更高版本,或者使用GNU C++编译

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