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

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

在9月8日那天我特意编写的,给大家分享的,
; e  W3 p8 W, x! M3 E6 X一个很方便的函数模板,可以并且只可以计算含括号的四则表达式+ [7 s% `. W# j4 v# n
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn), s6 L$ W$ N# P
参数解释:
9 f& e" I6 Y$ O* A" j! @4 Aistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
: S* Y+ q% [( O4 unReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
0 e, A! P* Y6 b) G/ [( o2 L返回值:
- Z) e- q/ g% a6 U+ {返回非0表示计算成功,0表示计算失败有错误5 }7 F/ m, W: c" h7 h% [1 i9 c% V
* E% {8 f! l2 d' @6 F

2 m7 y/ C5 h- M& l: j* D& l1 i2 o- j1 U; D2 z' T
程序代码: ; D# k- \' p/ y; [+ t$ {
. V# A8 k# a) e  u$ f1 q2 ?& U
namespace fy_Exp{
( ]& u5 m9 E) R. w1 ?namespace {template <class _T>* D, d3 R/ [$ E0 d6 }0 R& T3 V
inline _T GetExpValue(_T t[], char& csym){- O: l2 S- Y4 V
    char c=csym; csym=0;
6 n% T& a1 \! H6 K9 [8 X4 t    switch(c){- N" |4 Q- y3 `5 `
    case '+':return t[0] += t[1];
0 i% j% I. E7 m( ?! }    case '-':return t[0] -= t[1];
  h7 p7 g, ^; p7 q    case '*':return t[0] *= t[1];
& G3 x4 ~4 y9 l, [* B    default: return t[0] /= t[1];//case '/':
' }5 a% e  k4 ~& d3 b3 A0 t/ P    }- g) C) g2 q3 y0 |
}}, ~7 L. Z; o  }. i( |+ B  H
template <class _T, class _Tstream>
* s/ k) z( f8 ^- e% B# U/* _Tstream: inputstream, _T: get return value8 n( J1 }6 z/ S
* Return nonzero if get value successfully */. u+ ^8 Q- y4 k. \8 Q
int GetExpValue(_Tstream& istrin, _T& nReturn){5 V5 w' ~' y. g5 d3 Z
    _T t[3] = {0}; //雨中飞燕之作
) i) _1 b6 [! t9 ^* V/ y' w    char csym[3] = "++";
: x5 G% Z+ o; ~4 O$ ~( b0 r    int nLevel = 1, nERR = 0;  Y* y* U& d" l" _$ X" c+ h! x
    if(!(istrin>>t[1]))istrin.clear();
" T% W; X* K3 u3 e( u$ O! f9 V    for(;;){
8 |  n, c! c4 q7 n        if(istrin>>csym[2]){- Z5 z" Q% d  R, D! j) b- X; k
            switch(csym[2]){* \& _0 F4 x& t- R
            case '(':
$ `( l- ^" r- Y' C: P                if(!csym[1]){nLevel=0x100; nERR=1;}else, u  u& k* r6 Z: p
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
% A: t: U! d  s+ e# F                else{nLevel=0x100; nERR=1;}
. j; O! d* q( \0 M6 n                break;
2 a  e  Z* A  }2 V            case ')':* I) }# Y/ o. I1 W# Z$ _! z& O
                {nLevel = 0x100;}break;/ _8 D9 d5 R5 Y
            case '+':case '-':case '*':case '/':
6 S) A6 @% Y/ L) n$ F                {csym[nLevel++] = csym[2];}break;+ H9 g, W1 U( W8 a" X0 w
            case ' ':case '\r':case '\n':case '\t':continue;
9 _+ E) E9 q9 j2 o            default:+ S* G# q. l* K$ B& W
                {nLevel=0x100; nERR=1;}
: E* c- M$ Z& M# h            }
3 r0 @5 j8 H- M( M2 @1 J1 v            if(nLevel==0x100)break;" _8 T% E4 X& V
            if(nLevel&0x10 || istrin>>t[2]){6 @* |3 u' q& {% N
                nLevel &= 0xF;9 f9 l  o0 {0 `) B5 R
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 \7 F- K3 {7 y/ Z& R+ ]8 X                if(csym[1]=='*'||csym[1]=='/'){6 A3 @( N6 T7 d* o6 ~$ Q
                    GetExpValue(t+1, csym[1]);
& |) B+ N& n* v6 h! }. D( W                }
1 {+ h3 C  r, S                else{- I5 Y2 ]6 ^# J; N- r" R  y; ]' T
                    GetExpValue(t, csym[0]);9 q6 w" i/ S1 P
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
7 ]1 M8 j, v8 w% j) E                }; \% Z; s  G. B0 `4 Y
                nLevel = 1;$ g/ M5 O1 s( @" d
            }/ q, B, d' V* K2 c! K
            else istrin.clear();
$ t% Z! a' f  E! z        }4 R  [; U9 O( R
        else{nERR = -1; break;}
$ ]' e8 q! p6 e  d0 |7 p    }" R; s: _4 M  p9 A! f' @
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
, o0 O( U1 i" G    else nReturn=GetExpValue(t, csym[0]);
$ b/ M9 l2 Q6 J8 a    return nERR==-1?1:0;4 n9 s2 g. A1 w  k
}}
4 D2 P& F% \% U8 [1 X) w0 H# z0 i  q7 u: f4 p6 u1 Y2 h! ]
1 u0 Z+ w( O$ h# [
2 Z, I: J- Y) h
函数模板使用示例:! V$ o6 {- L! r  S; j: u, y
在以上那段代码的后面加上以下代码:; J+ @7 O7 R' V, G

- y0 W9 }$ q9 A/ u5 E! x* c7 E
5 l5 R  Y6 ^) p* Z* c1 d
8 X' T, t; j, Z' m程序代码:
6 t. C3 m" m0 O  A, |0 C3 H+ d. C# `3 X' g
#include<strstream># t1 _7 x6 g! u9 x! e8 v
#include<iostream>1 A5 s7 I/ i1 ^- J6 ?
#include<string>
* y: I7 U8 X. T2 {using namespace std;5 Z! z! P7 F$ L% n- [' M
int main(void)
2 D/ A1 N7 h: R{
* E; V0 f5 ?' g4 G    string s1;$ X+ q; p9 ~: u$ g
    while(cin>>s1)
+ _7 y( _" x8 b$ c2 a4 ~  P    {* X5 u" e2 W; S" e+ ]( S# u
        istrstream isin(s1.data());0 I( C& G6 m8 h" p$ |8 }) u. I
        double d;, ^# {% L7 M5 M/ |: `3 C. k% ]2 K
        if(fy_Exp::GetExpValue(isin, d))
; G. o( c$ _8 ~2 L2 X& @& `0 F        {
( [+ e% t' w1 b% z+ ^            cout<<d<<endl;
3 o5 \4 j; f- a. S! \1 F/ |- c, C! j: a        }
. F# D6 F1 ?6 G* x        else% m8 m+ u# s- H9 R9 K8 O! o
        {! i. U3 I8 d( f6 G( c3 ~
            cout<<"ERROR"<<endl;
" B' v& X( z* l7 d        }
5 ~. K4 ?+ |! r5 t  @    }
& Z4 ?  ^5 P9 p' F8 n; W$ P8 y0 |/ \    return 0;
2 ]/ c: a+ B% N7 x. o" J: }1 [: o! L}
% g) I/ W! x* }, ~0 n9 B6 K. m- j9 H1 D

: n  j' N  M2 p! w) P然后编译执行就可以了(*^_^*)1 `1 O9 y" ?% Y4 T- O
其它:TC++上一定编译错误,不保证在VC6上也能通过编译/ z/ ]  b& S/ b& S; F
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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