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

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

在9月8日那天我特意编写的,给大家分享的,
# w- ~1 x8 [' z% X8 M2 g8 j" k- K一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
, v+ ~& e1 ^1 p2 F只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)& q% n3 E8 [2 c
参数解释:
! r7 U3 T/ m/ R0 nistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流6 B& m% b! n/ Y3 Q
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定' B7 l- A, P- \
返回值:
) N% i5 C+ ?, c7 B返回非0表示计算成功,0表示计算失败有错误
# |% c% i3 h7 @7 J
5 }! ~( n, A$ m" l  d  E
+ f, h5 o' Q7 K' N
- d  r% C! @' k8 C) g程序代码: ! K; _/ i6 ^, h; j  g" a; a
- n$ a8 r. Z1 L( `' O  Q* B
namespace fy_Exp{+ Y5 Q: b/ b: h( r1 r* T3 p$ Q
namespace {template <class _T>
& J. H# c% y; g6 W7 M$ zinline _T GetExpValue(_T t[], char& csym){
# ~; ?! n/ `7 P    char c=csym; csym=0;6 ^1 Z" C0 ~) g1 `, ?
    switch(c){
: N- a* I# y8 z& Z- }" X    case '+':return t[0] += t[1];; @! k+ s2 R+ d" J8 U1 c7 }$ b
    case '-':return t[0] -= t[1];' }. q" I2 j0 R7 U5 S
    case '*':return t[0] *= t[1];" {' i( z6 c9 y( q8 V
    default: return t[0] /= t[1];//case '/':& G' p# x  u- ]) n9 m
    }4 N& A; i3 n4 S5 Y" ^: n
}}
0 x. y8 d5 ^( otemplate <class _T, class _Tstream>; K; S; M* V: L
/* _Tstream: inputstream, _T: get return value
9 g1 P! o6 _2 T) T- z/ x( ?, {* Return nonzero if get value successfully */2 {+ b9 J2 u3 H
int GetExpValue(_Tstream& istrin, _T& nReturn){5 S5 _: }  G6 D! x% w0 {. [$ @- R
    _T t[3] = {0}; //雨中飞燕之作0 b+ N& Q0 @, |
    char csym[3] = "++";
% S$ Q% _0 j8 E9 |  j0 Y# R' ]    int nLevel = 1, nERR = 0;
' C. y; ^8 Y6 I3 Y# B3 t    if(!(istrin>>t[1]))istrin.clear();* A2 w6 q: h; F) ?5 J
    for(;;){
2 W1 a4 y, Y0 G5 p) a- @+ t        if(istrin>>csym[2]){. e2 ?1 Z( U6 t, w, S3 b3 d) @0 O* w
            switch(csym[2]){. `" @- a' Q" S4 B5 e3 `
            case '(':
3 z  R9 Y# K, C' b                if(!csym[1]){nLevel=0x100; nERR=1;}else
9 ^# o' Q; D/ Y- C                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
, \$ A; T, x4 w6 `                else{nLevel=0x100; nERR=1;}
3 A/ a; }+ }$ i. V/ {0 l                break;  \1 y# C4 v5 b0 @  d' z" R9 D
            case ')':
2 Q: F+ P( p. R# G$ d  G                {nLevel = 0x100;}break;8 y7 S# S: X2 ^  v/ f0 G. i
            case '+':case '-':case '*':case '/':. P  o) c' B7 |
                {csym[nLevel++] = csym[2];}break;2 r( u7 x& s& X4 n+ h' i3 ]; u
            case ' ':case '\r':case '\n':case '\t':continue;
* P5 ^5 G  m* h& n+ _            default:
6 J: t( a; i* d( ?                {nLevel=0x100; nERR=1;}
7 ~8 F" F4 T# c            }* `( W4 t- S# h9 i' V* ~  s( K
            if(nLevel==0x100)break;7 p0 y) y6 K  ?+ y5 c$ ^. ]
            if(nLevel&0x10 || istrin>>t[2]){
1 [' {+ P# k( L; L4 p* d                nLevel &= 0xF;
; H" f' ?3 b0 U+ g& k                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
( c9 ~$ z  p/ ~, z. S                if(csym[1]=='*'||csym[1]=='/'){6 \" I. J8 y  N2 D3 q7 B% x. e
                    GetExpValue(t+1, csym[1]);; m/ B8 c7 b; k% ~) Q* r! F4 G! ^9 i5 t7 B
                }. h7 Z, v  e5 g$ |8 J1 a
                else{
% A8 U+ s% S7 {                    GetExpValue(t, csym[0]);
2 r- q0 C* s( k4 D* ^7 m/ a  m) a. L                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
4 `# M2 L# |" y, m3 |                }
# D$ ^4 O# V5 O( d) J- j4 g  o                nLevel = 1;  Z( O/ x& e& @' }/ v! ~
            }
8 W5 \4 F' C: a. I7 _            else istrin.clear();' [5 q7 e2 S- |0 ?% V" _
        }5 C% p, A& H& q
        else{nERR = -1; break;}0 n% e. b* b! s* O, @0 J
    }! H0 U- x8 l$ Q; Q9 F
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
  ?' P. P5 \7 M( l- Z: W# y    else nReturn=GetExpValue(t, csym[0]);
/ x8 f+ w+ y; O1 O' ]    return nERR==-1?1:0;
( o1 t' x* u+ u: Z% _}}8 z0 T0 W+ E, G. M2 g

& y3 X' K6 @  `
; {) m- W/ M* |0 g7 r/ c1 D7 k, m, l" m" i5 A
函数模板使用示例:! m3 \* ^+ }, E6 y9 E
在以上那段代码的后面加上以下代码:
% C5 f) P: K. _; P9 l/ e9 c4 U, |1 z' j$ ~: }8 j6 V3 |

& W: ~6 ]3 z. d, c8 [
+ d: _' A9 L; f7 p  z0 [* I* Y程序代码: 2 g) e( U7 K$ P2 l  W
; l$ O! `7 }: p, c& V
#include<strstream>
9 i" M: J3 i* F. N# j7 V#include<iostream>
8 W+ Z- s4 A$ b1 A#include<string>% {) S: n$ d0 h/ A0 I' n/ Y7 n. y% K$ t
using namespace std;
% k9 G8 b% V" N" ]int main(void)
( V, t8 {' F, b5 I7 X6 p: }! P{
3 M. Q1 _8 e  Q" _! V# P1 l    string s1;
, z* T! X5 m+ }9 i+ o7 U; M, ?    while(cin>>s1)# }* y, N/ N, B8 c! S9 E% C% [6 u* s
    {! `/ r) }, w) d* p1 A
        istrstream isin(s1.data());
! Y) O1 w8 j. E. \, q        double d;
2 K6 @& M( Y6 B$ j6 m0 i        if(fy_Exp::GetExpValue(isin, d))
" M& n1 m# v# y8 w: j9 b        {3 v0 {7 E0 _4 G! I6 d
            cout<<d<<endl;8 k; X) ~0 Y( y/ q) C7 B
        }
6 C0 X; O/ I- t, i8 L        else
+ y% j4 l; E/ @6 `        {% D0 X, K: `" }
            cout<<"ERROR"<<endl;$ {- r- J. I% ^. G: T! G4 W
        }5 h  v. `) _' S# O/ \6 \
    }. U4 U# N" k# s9 V8 S
    return 0;
# ~) q/ M- q" v0 g# Q}1 P+ E- j1 t  x' |

% v: D4 i9 T( e: O' n, x! M& ^1 H1 Z
4 a; O& p# o3 T然后编译执行就可以了(*^_^*)3 X2 B- \. u2 J7 N& b5 y) @
其它:TC++上一定编译错误,不保证在VC6上也能通过编译6 r9 n# ~. {# \+ y
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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