返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,5 n, v! L$ \. A1 R' B
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式! y9 E5 {/ P( O9 d* ?) E* G, [  |# S
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)1 C& z2 q, L+ U  Z& k8 f
参数解释:( `# `' Q% B  b. V% H/ ^
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
! B1 q2 j5 T' h( ZnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定/ X! y" a. B# W- w8 s2 F+ ?" V- R' m
返回值:
) F$ i4 J0 L7 {, `返回非0表示计算成功,0表示计算失败有错误- h6 i  |7 F; r7 n9 L: _  f

! C3 M: W4 Y5 c7 t5 M
" ]( J; T& Y( t7 @
! }0 b! k5 U+ S9 q8 a! O% I程序代码:
/ \1 X# [. Q* j+ R; y6 |. z! D. {7 Q" Z8 C' \7 j' B
namespace fy_Exp{0 S* q" C8 u9 X; D
namespace {template <class _T>
( F9 ^+ M/ ]6 x( _( c# h2 d7 tinline _T GetExpValue(_T t[], char& csym){
* f8 t: n) H" w! a    char c=csym; csym=0;
3 u" b( K3 d" a+ T+ n* K    switch(c){
. H; z( E" ?) V$ G6 M; M: ]    case '+':return t[0] += t[1];
* }" i, C8 h  @& V2 W    case '-':return t[0] -= t[1];
' t0 t; s, m# {0 A6 \" w" {    case '*':return t[0] *= t[1];* R" q  }% Z8 b$ o9 f2 V
    default: return t[0] /= t[1];//case '/':. k) k3 y) _3 d# w# p
    }6 |, N/ V* D2 n( Q8 k/ s
}}# I; E0 R- e0 M; F" e
template <class _T, class _Tstream>2 Q+ c1 K. c. `' [! S, w2 r0 W
/* _Tstream: inputstream, _T: get return value* ^) l1 T( ]. v7 e, d* W; i6 I
* Return nonzero if get value successfully */
0 w7 b. W! \1 w* aint GetExpValue(_Tstream& istrin, _T& nReturn){) L& q' u3 C6 L/ B: `2 _$ a' e- U
    _T t[3] = {0}; //雨中飞燕之作5 `2 i% L4 x7 b( L/ O  D
    char csym[3] = "++";
7 Z$ I# F& f& l* h& ?  o; y    int nLevel = 1, nERR = 0;
( F/ t0 a1 B1 a    if(!(istrin>>t[1]))istrin.clear();
: ?& `4 }0 }& ^& q% m' ~( x6 r    for(;;){
) A  T! o+ s# f        if(istrin>>csym[2]){
5 q  E; z* Y/ M( I2 E            switch(csym[2]){
: P- Q) n3 c3 a            case '(':# i4 h/ c% {  V
                if(!csym[1]){nLevel=0x100; nERR=1;}else  u" [8 M/ N& F" S" R
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;6 k+ M# F! E% t! X) x9 N, I# P' K
                else{nLevel=0x100; nERR=1;}8 a8 z( B  y4 X4 k  S
                break;+ d7 F( x8 @4 m# p# y% a( W% J
            case ')':
' Q) B8 c/ u& b                {nLevel = 0x100;}break;
# H9 A: M+ S! d# ~% {1 W' \* b6 r) D            case '+':case '-':case '*':case '/':% k4 B& ]5 a9 B) c! s! Y
                {csym[nLevel++] = csym[2];}break;, ^2 |: ^4 }; m. a4 e9 \( `3 r
            case ' ':case '\r':case '\n':case '\t':continue;
! H2 o1 [1 ~4 Q  ?$ b! V( t7 k            default:
9 c( e! A/ V, Q8 W" Q3 J2 `                {nLevel=0x100; nERR=1;}- R* N6 w- V' J& A$ @+ b, a1 K
            }1 t. T6 G: m% n2 @2 Q
            if(nLevel==0x100)break;
; [3 r6 u' Y4 ?+ Q# x            if(nLevel&0x10 || istrin>>t[2]){
% b2 P8 S& {1 P8 ~3 F1 ], D                nLevel &= 0xF;
6 C2 s+ g5 ^8 b$ z" c. w                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. t( |2 Z' T9 ~) h/ a: M& s4 g                if(csym[1]=='*'||csym[1]=='/'){7 o- L' A' |# c8 y7 L) {0 K2 V! P
                    GetExpValue(t+1, csym[1]);
* x$ W8 \0 R- T' v                }8 T) [' a* L/ Q, K" u
                else{; S% l$ f' F0 c' C
                    GetExpValue(t, csym[0]);
# {6 u4 Q! {4 |1 R$ K  ]8 F) R, `: o                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;: p4 a0 j( V% v3 B
                }
8 {' O, C) p; c+ c                nLevel = 1;
) k, Z8 ?$ M, x            }
6 h: B9 r: V' p: U; \; q  s. a% t            else istrin.clear();
6 I7 i" s. c+ e$ `% W" F        }
: y" J+ `& U  ^2 }& M5 ]        else{nERR = -1; break;}
" U0 ?. h0 ]+ f( m+ F    }, a: o8 b; c, g4 I& c2 M
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);* J: T4 L. Z& e/ |/ y
    else nReturn=GetExpValue(t, csym[0]);
0 d( a- y$ a( K9 v8 i    return nERR==-1?1:0;1 C+ {" v6 F4 c  S1 d6 R
}}  s* W9 s3 x  A- r/ i  d

! U+ m! `/ m0 y4 E2 a+ N) ~8 x- W% \6 E. u7 R1 E

, a" I9 Q+ b4 C4 c函数模板使用示例:" J) T% b4 M5 u3 t0 C; O
在以上那段代码的后面加上以下代码:/ I. k/ ^6 R9 p! k7 M% Y
' B3 S& P" ~  {, E
$ Q# ^' |0 O2 o1 P' K+ ?: d

1 G1 c0 Q. X, ?# l- @5 ~程序代码:
$ C8 f  n; I# G. E6 \  s5 ?) R. @% r& h, D( S
#include<strstream>- f1 `  M$ C4 }
#include<iostream>6 g6 h' r2 B& V/ t7 M( g+ q- P
#include<string>
, ]3 n2 `7 c. l' ^" R/ vusing namespace std;: e+ y" ~1 N; J0 z1 A
int main(void)
9 d6 Z5 e. Z: A- H! {. _{$ o! o* ~# |4 T, Z) X2 S+ ~/ |( x
    string s1;
7 j4 p- S7 |- `  u. b5 o5 s    while(cin>>s1)0 D& g' {: w3 ]2 U7 o6 P. ?
    {2 n4 J) X! f! _, Z1 q
        istrstream isin(s1.data());
- C2 u/ b# x4 O  T        double d;
: d9 W2 R! s. e% C6 q        if(fy_Exp::GetExpValue(isin, d))9 G# i# Z+ ~( u+ c
        {3 |0 S2 I# s; x- g# ]2 J
            cout<<d<<endl;! f( m7 E1 z- L( e( l( I2 A1 D
        }: t6 D* |' k8 O6 M9 ^( }; R' }
        else
5 p; M* a$ j' s& q% x        {
1 R, R8 _( G+ G  s3 b, I' ?  H& y            cout<<"ERROR"<<endl;
1 y  ^& R2 T1 G! z# S        }4 @1 O$ x8 v& g! t4 F
    }
  L8 c7 E& f3 r+ w    return 0;
9 F( z1 W. d& f9 _+ n% t" S}+ a8 k5 _4 L) a
/ B1 m4 W; X( c  S) P; n0 w7 n
  }% H0 Q2 [. C+ @' `0 [2 p
然后编译执行就可以了(*^_^*)
6 m# W4 \' P% S5 _) _  U6 @其它:TC++上一定编译错误,不保证在VC6上也能通过编译$ |" O+ d6 N# u! I2 T' H; |9 [
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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