Board logo

标题: 一个计算四则表达式的模板 [打印本页]

作者: zw2004    时间: 2008-1-21 20:17     标题: 一个计算四则表达式的模板

在9月8日那天我特意编写的,给大家分享的,4 I; n6 _0 A8 s; e7 \* M$ K
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式. U9 ]: V# u! d0 D, [" C5 z: n
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)% C7 m1 @% R6 z: d9 c
参数解释:
7 w- P. E+ B3 E& ]7 _2 aistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流0 k- f' p2 r- F( X
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定4 ?$ C% `; `) ?* J
返回值:  [$ g' ?  G2 @" F; [6 V( z1 \
返回非0表示计算成功,0表示计算失败有错误! n6 G; n3 E+ F
0 J. f0 G' g+ T

9 T$ w* U9 t7 g' M: U$ R8 V: S% N" y5 M4 n! H: W, C! B2 @
程序代码: & c% q$ Z) l! Y% k+ R

( n% E: s6 R+ R0 Z/ m! b% lnamespace fy_Exp{
5 \2 y0 l5 R6 _namespace {template <class _T>( w0 Y% r4 B- z% h* c, ?" z; ?
inline _T GetExpValue(_T t[], char& csym){
6 X0 \/ l; |, ]- A2 w( r" H2 @; a    char c=csym; csym=0;
+ Q0 `5 p# T$ g' d6 k. @5 \    switch(c){0 k* ?. |7 m2 x/ ]8 h) d* U, S
    case '+':return t[0] += t[1];  C9 U0 X: S0 I' ]$ j
    case '-':return t[0] -= t[1];' [- F' Y+ a4 l2 c% y* \
    case '*':return t[0] *= t[1];
# S1 l% J9 `: d! H( X4 J% l    default: return t[0] /= t[1];//case '/':
3 J1 W  w" [2 H( C, {  d3 g4 }- u    }
& Y! l1 C1 i9 _7 C9 }& A0 p}}8 h' ~- ?8 y' o7 @
template <class _T, class _Tstream>
8 ~0 q% ~# [6 Y+ E+ ^; X5 q* b/* _Tstream: inputstream, _T: get return value
1 W6 z6 E! C7 J$ X* Return nonzero if get value successfully */
9 t1 _  J0 }# A! I" r1 C+ r% `" bint GetExpValue(_Tstream& istrin, _T& nReturn){2 f* R2 _3 g: {) Q. ]! v
    _T t[3] = {0}; //雨中飞燕之作7 G' K. ]% D6 ?6 V
    char csym[3] = "++";0 y5 o8 m: w$ X& F: D
    int nLevel = 1, nERR = 0;
& m5 i+ D- {. x- W7 [    if(!(istrin>>t[1]))istrin.clear();
, I( `0 _+ q: K( @) m    for(;;){
( a6 t5 v4 H" k. i2 K$ z( A) M7 w        if(istrin>>csym[2]){
0 o- S/ ]: J$ x2 A8 M7 ]  N7 n. m1 z            switch(csym[2]){& a' n9 {0 K0 r- r& c/ [
            case '(':
! @' v1 n3 s7 t; Q1 j0 y                if(!csym[1]){nLevel=0x100; nERR=1;}else
- I' s* S. u- \& Y' l                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;' X$ v/ t7 c6 h3 h5 \
                else{nLevel=0x100; nERR=1;}5 `  o' H' o- G! S. e- f
                break;
" H9 T, C  j; F3 A/ n+ \8 Y+ Q            case ')':
# ~  p8 }5 L9 q: t# f+ S$ {8 B9 E                {nLevel = 0x100;}break;
7 K  g/ I5 @! y1 |2 Y; j8 R            case '+':case '-':case '*':case '/':2 X5 X: W2 E2 X# Z, S" {+ t
                {csym[nLevel++] = csym[2];}break;( c' S+ z" c+ J& r( V
            case ' ':case '\r':case '\n':case '\t':continue;: y* s; J2 M9 E0 G' X: e' _% q
            default:
: K3 L2 h* j/ u                {nLevel=0x100; nERR=1;}
/ _% e, e. d( X" Q; l            }0 k# D2 \" N- n- ?2 R7 g4 t1 @
            if(nLevel==0x100)break;  [! ~2 }- V7 k, I$ y+ U- A# E
            if(nLevel&0x10 || istrin>>t[2]){, b1 N6 d+ b6 w4 @1 `) q' i
                nLevel &= 0xF;
& h' X/ N. u% P* S4 l  A7 S4 u5 I                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}, d0 E# @: X$ E: p1 O
                if(csym[1]=='*'||csym[1]=='/'){8 {$ [  @& a2 s0 q
                    GetExpValue(t+1, csym[1]);" f; {5 c! x1 H' i
                }
5 F- C8 K5 T4 x* ?8 [5 F9 l                else{7 G0 J0 |& r' O" ?- }4 F# n
                    GetExpValue(t, csym[0]);: h! }5 Y# b5 h% I
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
# L2 z% h5 e' B: x6 h                }
6 w. v' z. G" Y) `- X9 \/ Z                nLevel = 1;
6 H$ m# `( n, x! p! h            }- b* D" \( C% g$ [. V9 ~1 R7 i
            else istrin.clear();
% b2 z, i/ I# o% g+ [+ I        }
/ `, K; N$ P3 f1 [. W        else{nERR = -1; break;}
7 @; q0 a# G3 S+ I7 w, g/ ^- Z3 C    }3 _+ V* I& z& e0 j: R6 O
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
' L  k/ S( W7 d) }5 ?. Y7 V; d    else nReturn=GetExpValue(t, csym[0]);# G* a8 v: N& Q! C
    return nERR==-1?1:0;; _! ?  b% z+ `6 k& Q
}}$ Y. u9 V3 V4 y# E) D3 n3 ?7 l( h

" y  G0 H& r6 d4 \
2 E) z( o9 b4 M6 a$ X
  V( r" J( o; C* j函数模板使用示例:
. t0 g2 u* x0 P) h. g# e" A在以上那段代码的后面加上以下代码:; V" K7 S4 _7 P

. o3 s" m5 {. w1 s5 u
: r% v: h1 }3 l' a% b; V* C* d1 s/ Z
程序代码:
. v& v5 d7 m, s9 _6 U
3 ?3 i' _  U4 j, n, X( [#include<strstream>
) R/ t  \4 l+ d2 S4 x7 U" e& l) P$ V#include<iostream>
3 j1 i2 V/ Y# c, x5 z: q#include<string>$ W9 z4 v# i/ O* H* I' A/ W2 F
using namespace std;
! m5 i- L& J4 P; tint main(void)
" M& h9 K6 K7 N0 q  z0 Y# e9 ]{
* m$ k3 I: N  m! l    string s1;
9 L; T2 Z5 m7 _    while(cin>>s1)+ ~3 y: y5 J( U2 v
    {
" X: a# g, ]4 V6 U" A! `        istrstream isin(s1.data());
) U' O  m2 J6 }' S# G% V' d        double d;$ I; x  b: b) ?- ]8 ~
        if(fy_Exp::GetExpValue(isin, d))
( W2 Z9 a) n- C# H. e1 H! m        {
% B* ~1 m. [, O) t( E5 Z            cout<<d<<endl;$ Y; N9 J; Q7 E
        }1 |0 D; k9 m8 Y2 }' I3 Z/ k! ^$ r
        else
, a7 I5 s7 i' X% V" ~        {
0 c+ g, A9 `+ }            cout<<"ERROR"<<endl;/ C$ t, v* ]7 f% P6 V" M' A5 F
        }2 u4 C, X2 Y- v8 o( Z8 f
    }. `; i5 o" y8 c' O$ E
    return 0;: i3 h) C3 [6 ~. T7 v& f! j: F
}8 \7 `: ~0 `6 x8 ~, F3 A: a4 I
. i8 ]/ Y' M+ P
# p7 P7 c/ s- m$ v
然后编译执行就可以了(*^_^*). {( y! I( w( H: b' }% f4 t: L, L
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
  W3 U/ D2 ?% b" n- |$ R3 D+ `      建议使用VC7或VC更高版本,或者使用GNU C++编译




欢迎光临 捌玖网络工作室 (http://89w.org/) Powered by Discuz! 7.2