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

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

在9月8日那天我特意编写的,给大家分享的,- [  O! L: R$ z4 ]- h' Y/ G
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' z3 U  _8 E& r4 A* `
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
' y" c# A8 v3 W参数解释:
4 G! k+ s! \5 O6 y3 V0 iistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
* Y; Y) r/ L: [1 m, Q2 HnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
. H, D1 g- C5 v返回值:
4 }2 l/ P: Q' G返回非0表示计算成功,0表示计算失败有错误
) I: h4 x4 N! Y& d, @+ p: l1 \
& `  {. M, m- G$ l) R# {

5 q' @+ T/ I/ C) k- P7 H2 E0 }5 R程序代码: 4 R4 }( `! n6 e- }& G3 V3 y

% T% O1 E1 z0 b1 i8 ?, K: Jnamespace fy_Exp{
' z( {5 x  q2 |! h5 \. J0 W9 S" wnamespace {template <class _T>
" {3 @" @/ D- Q+ J/ b8 Dinline _T GetExpValue(_T t[], char& csym){
, d- A* o+ ^: S    char c=csym; csym=0;$ i. a' d7 P2 Z. j$ L  ]) |9 p
    switch(c){
1 v3 j5 A) d$ g* K    case '+':return t[0] += t[1];/ H+ f( R' K# f6 y
    case '-':return t[0] -= t[1];
1 D- U. Y9 q7 {    case '*':return t[0] *= t[1];
! l1 Z5 H( i/ F( X  m    default: return t[0] /= t[1];//case '/':1 g% h. n+ r" B, J5 k
    }
6 ~' o" x' a5 x% u# A& Q3 y4 \}}
! K+ _! e5 ~4 L( n6 Z. Itemplate <class _T, class _Tstream>
- z2 _' ?! V9 p1 r/* _Tstream: inputstream, _T: get return value4 E  C# [( J. H; |% D
* Return nonzero if get value successfully */" L0 S0 p7 @; w: o0 ~, x: B
int GetExpValue(_Tstream& istrin, _T& nReturn){( E' L# z5 {! s( y" a( E
    _T t[3] = {0}; //雨中飞燕之作8 A8 v! N( {" U' W8 R+ p
    char csym[3] = "++";
6 w2 M' L& x$ |6 c    int nLevel = 1, nERR = 0;
2 }* G$ l3 Q+ F" A3 D    if(!(istrin>>t[1]))istrin.clear();
# K1 T- O4 j& z    for(;;){
* C- V  F8 }& C. G- T        if(istrin>>csym[2]){% ?- h- o" o7 @( i
            switch(csym[2]){1 M! Q' ?' s: @
            case '(':
1 A/ d% y( R. s4 a: F                if(!csym[1]){nLevel=0x100; nERR=1;}else
8 S8 s3 B% ~- C; _: q- R! T                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;) S( [& `( m9 k! }" M+ A
                else{nLevel=0x100; nERR=1;}
! m! ~0 D$ Y' i2 X% e0 V" V7 U                break;
4 }; @  L+ S0 t, t            case ')':2 o- Y4 {4 C/ I! z
                {nLevel = 0x100;}break;( [: d; v4 G$ s) Q6 r; g4 k5 \
            case '+':case '-':case '*':case '/':
, q. ?1 a/ M8 Y: ~% {                {csym[nLevel++] = csym[2];}break;- i' n- H- _9 a$ M
            case ' ':case '\r':case '\n':case '\t':continue;
% R/ U6 F5 Z. y+ a3 ^3 p) V            default:  {) y( Z, B7 Y( E* M4 B
                {nLevel=0x100; nERR=1;}
. D9 t+ {1 a! q- ?' D) E+ U4 b            }
( n  j0 z" o; v( s2 `) q+ \            if(nLevel==0x100)break;
+ p# A" n; d, Z" W            if(nLevel&0x10 || istrin>>t[2]){* k; Q6 \4 I# X6 u
                nLevel &= 0xF;5 m) u; @% `& v: A
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
; [' q1 z1 `! c/ f) D                if(csym[1]=='*'||csym[1]=='/'){
1 C6 o+ B0 D' p5 N  `                    GetExpValue(t+1, csym[1]);$ I! O) ~3 K& K, h
                }! w$ ?2 O; D: e% A9 X, ~
                else{
& o' a: J0 Q+ a: G1 _                    GetExpValue(t, csym[0]);6 m% X$ o1 Z6 O0 z
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 L2 \8 L' n( U* V4 `( r
                }: i7 {1 q* p- U$ R" k& f3 ~
                nLevel = 1;; k: O* H- Q' I; x8 `7 _3 A$ A
            }) O; R. Q. N) e2 Z) T
            else istrin.clear();2 \# v# ]! a2 x. D) D6 Q4 H# L
        }
' i. F' e6 f' ~5 r        else{nERR = -1; break;}  Z7 x2 ^# L" M% }
    }
' a: h  E6 b4 k    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);3 [% ]% p6 [# M% H/ r+ T& y
    else nReturn=GetExpValue(t, csym[0]);) Y4 o2 J- G. X5 S7 h6 A- J, v/ o
    return nERR==-1?1:0;
" [6 ~0 \2 {+ u5 ~}}
! Q4 M+ M4 C% |% c
' K, `( w1 ]' _: W) f3 m+ a2 V/ s5 I8 w9 c0 L9 O# F5 |

! c' d5 U0 [7 b. a" t) g, Z5 \函数模板使用示例:
; ]% Q& @# B0 B0 Y3 @! }' Z在以上那段代码的后面加上以下代码:. ]+ s$ g8 `0 |8 N
* a7 U4 W9 `5 {/ l

6 L+ r% O* B8 y/ r4 G. H- d/ ~* L7 r, g! Q. S; U9 Y
程序代码: % N2 K7 ^' J4 B6 a
8 j: e4 A, d) U' E
#include<strstream>+ D- V, ^, H  K! C! Q  j
#include<iostream>
$ {9 ?; J9 \, D) }2 k9 H#include<string>
, R+ P0 X8 r4 V4 F9 l: A: e1 ]using namespace std;
+ [: ~. `) {' f- y9 }$ Zint main(void)
3 E/ d2 f+ v' u+ B, g& n1 N$ F- ^{) Y+ E, K* M, e+ y2 e3 f
    string s1;
0 X3 ^( e9 \, \. d+ L2 H2 [2 t. e    while(cin>>s1)8 @) ^/ ?' I8 d
    {
* J* V; K5 O1 r- w1 A2 c        istrstream isin(s1.data());
; z( T, U/ s5 v; S        double d;
6 e% T8 d5 K$ ?. v        if(fy_Exp::GetExpValue(isin, d))
% ~7 ]* X, r6 W5 \; H" i6 {# W        {
. z/ V$ d+ ^! K7 @6 x5 S8 c            cout<<d<<endl;1 ]5 T" `% b. d
        }
# w: X! C0 B# b; G3 F1 e        else% M3 k% m$ z3 P$ n
        {
/ z3 g/ L  L, B4 m            cout<<"ERROR"<<endl;
% O7 v& j. c0 Z        }
9 B4 I6 ?: r' Z9 ^    }7 W- H, Z( i/ `% c5 w
    return 0;
1 I1 t! B% r$ n4 r, D}
* R- p7 K3 R$ J9 ?6 a! @% v8 E
7 ^  C2 a; g. B& A/ }, n
: G3 f7 r; \, O( W4 ]然后编译执行就可以了(*^_^*)
5 k( f# L3 t4 K/ ]其它:TC++上一定编译错误,不保证在VC6上也能通过编译& \9 g. ^+ X& ?
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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