返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
* ?* v# _0 Y% [* @( r2 v一个很方便的函数模板,可以并且只可以计算含括号的四则表达式; e$ c8 i# r3 W8 a' F( p
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)7 u: b7 y) U5 a  x
参数解释:! q* g. S" f! r4 F: t
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
; T4 Q, S% P" MnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定7 h9 M  f- D8 [4 S+ W0 @0 u
返回值:
5 C3 @4 t! e- U/ d' Y返回非0表示计算成功,0表示计算失败有错误
) v. ~/ }7 S* N9 Q, L& N
$ z3 b5 Z' \7 R% a9 |% Z: y) D
% q, I5 k" Q1 Y; Q3 B% j
# `  M! z- y; u+ j2 A1 E程序代码: % l* I& S2 R& ^4 y- W6 X4 m

8 Y, T9 u& D6 m& U3 P# G& Lnamespace fy_Exp{# {, K0 Y/ k' W$ k! E6 ^, v. ?
namespace {template <class _T>
/ w+ G+ w1 M* g6 I* ninline _T GetExpValue(_T t[], char& csym){% l6 R% _) j$ x# P
    char c=csym; csym=0;7 M+ P9 Y' }, M1 x2 e! V3 ~: E
    switch(c){
/ {. |  P$ ^5 Q6 g! x& L( i; N7 F" F    case '+':return t[0] += t[1];* w% Z; _/ e/ n$ V
    case '-':return t[0] -= t[1];
, u- C9 z* y: h+ a( V! D+ _    case '*':return t[0] *= t[1];# ?' h: G/ p% N
    default: return t[0] /= t[1];//case '/':
* y# l1 B8 h- D1 j5 c8 ^    }
7 r8 |2 o8 F9 y9 |, Z}}* U6 `7 M; J( B( f  y( U# h
template <class _T, class _Tstream>3 z' n  A2 s5 y/ z9 h# J6 m
/* _Tstream: inputstream, _T: get return value
( U  h: `  b5 Z8 X1 A4 _9 e" I6 N) C* Return nonzero if get value successfully */
% I/ P; Y7 W# u; o7 g% T* I2 vint GetExpValue(_Tstream& istrin, _T& nReturn){
) L6 x# e! g, A    _T t[3] = {0}; //雨中飞燕之作
2 g/ I) Q8 d' g    char csym[3] = "++";/ {+ _  W, i: ]) N  o4 k9 k8 t
    int nLevel = 1, nERR = 0;8 I! b# p, ~: F5 @
    if(!(istrin>>t[1]))istrin.clear();  u4 p: l( @9 G9 h, Z
    for(;;){1 |1 q, [" J% m# Q6 A
        if(istrin>>csym[2]){
9 J1 W, {5 H# W5 v) E) ?% Q            switch(csym[2]){/ G7 G8 F% z& u; P
            case '(':
1 |8 o& }% z) _                if(!csym[1]){nLevel=0x100; nERR=1;}else- g& k3 }' m. H' }$ H+ |% y# J
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;6 ~1 |2 i! Y1 g0 d
                else{nLevel=0x100; nERR=1;}
: @0 \4 s; a& N, }+ r  K                break;& S4 A, h9 f+ p: E! A
            case ')':
/ n' A# B; n5 X# i4 @- j- m! T2 d                {nLevel = 0x100;}break;
  a' @+ `* ]$ r: r! P+ H5 c+ U            case '+':case '-':case '*':case '/':( y1 x, r2 X: c
                {csym[nLevel++] = csym[2];}break;3 f6 Q4 t* B! p1 d* q" d
            case ' ':case '\r':case '\n':case '\t':continue;
2 D. V3 |( v2 X4 b/ R: Q            default:
9 {( K9 r2 ^4 b! ~                {nLevel=0x100; nERR=1;}
- Y+ F. I' s4 W& ^            }
4 {! O! x3 [# a% X' m; B            if(nLevel==0x100)break;' d: w) e1 X- }- `$ h% U6 `3 h
            if(nLevel&0x10 || istrin>>t[2]){
& K' D( ?6 M3 o2 T8 E/ W                nLevel &= 0xF;1 R+ m: U$ Z2 P, x
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 m+ t' w  ?* i7 t, x8 Z
                if(csym[1]=='*'||csym[1]=='/'){- ~3 O/ m6 S+ t
                    GetExpValue(t+1, csym[1]);
" I* K" {2 k: e& o# T                }& S# F- |$ y; |. n* g5 k
                else{% A: Z& M) F+ {! @0 o
                    GetExpValue(t, csym[0]);
6 m( }) P  R6 U+ x  \; x                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
: Q9 h9 a/ F: D; D/ O                }
! J' @5 N  @2 T8 K$ E' f                nLevel = 1;
- Y: d/ P; C% A, J1 c1 }            }" R' W, O3 [. t0 q1 |) q4 H
            else istrin.clear();
2 q6 A- M3 H/ W        }
  i$ O6 {: D* s3 ]1 B0 M: q2 Z        else{nERR = -1; break;}+ @! }/ M. `) M$ j8 e: x5 a
    }' ^$ `9 C9 u- h
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
2 b+ ~3 j! H- i5 G* s' i    else nReturn=GetExpValue(t, csym[0]);
" A! f) C7 @' t6 z( W8 \$ H2 V    return nERR==-1?1:0;
2 l# ^. e! p. g# D" f}}
! K4 C. q' l& \$ p& _8 k, A( I  Z/ {9 E0 v4 i; E! V

1 u3 L- P& r' d9 c0 i. N) V3 F
函数模板使用示例:
, n5 q# d) B7 C% P) M! U9 K' r- ~在以上那段代码的后面加上以下代码:# {& V" L0 g8 W. p
+ t- Q0 _* K& R4 W8 v
' j4 _. d, |9 t. }# C

6 \! Y' l+ ?9 ]- J) W: i5 V程序代码:
( _1 C; P0 M4 G0 \! F4 h4 u% e0 g* Y& U% W: @1 |: o
#include<strstream>
" s6 X! ~7 c/ H: B0 G#include<iostream>1 h( W" a1 U8 C
#include<string>
  Q2 D/ m8 s9 f! Uusing namespace std;! j: m2 h( w1 }" c3 v6 M
int main(void)
! c5 E( Z5 H9 x4 _! v9 G{, f! U7 ?$ H' g0 r
    string s1;
! C, a- _( X- Y+ w3 c    while(cin>>s1)/ l. n; m( }3 ~5 Y8 T
    {6 n$ h0 l7 X2 q) T! S! @
        istrstream isin(s1.data());; r! v* f1 c4 ?' H
        double d;
; n% j" [, b; W# d5 e8 o        if(fy_Exp::GetExpValue(isin, d))) \0 F$ N% {% Y+ `# g5 Q' q( w- L
        {
- i( b- k. ?2 l            cout<<d<<endl;
/ X% H2 e& }9 L# p" D0 o0 V, p        }8 {/ {/ n4 A' ~
        else
' Z& R. w, z/ r        {
& ]8 J5 _7 E1 ]8 `0 Y            cout<<"ERROR"<<endl;* v4 i/ g) S/ p- f7 o: G
        }
9 n8 y  _1 s% r! D    }
- J& i0 n" B4 U( a$ y    return 0;# W) E1 f* o0 @8 h+ q7 p& H$ P
}
' ~+ ^1 Z4 y, _8 ~# o' P
) E; p4 B) h! y4 x8 e- h! U7 V0 T1 W' [0 B; t
然后编译执行就可以了(*^_^*)* V& n: V, A0 t* T. s% N
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
8 y8 h' g9 f  r      建议使用VC7或VC更高版本,或者使用GNU C++编译

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