返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
: K3 z( k0 s" E1 `- e一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
' K& H3 d" D! ]+ x, u) p只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
- H* j! l2 l8 y4 \参数解释:
0 j8 {% a" G! e8 {  ^& J' ?istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流/ I( Z& I) H) u# o) G
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定- W" n& q$ J$ P$ r) h+ a
返回值:
# v$ a# {' A) L/ B3 k6 F3 C返回非0表示计算成功,0表示计算失败有错误
1 K% k/ t4 i9 @% W/ Z6 ?0 i" O, K6 l. i, X

+ X) f- n) j+ f( X* b1 W( u" O& I5 }/ G1 ^
程序代码:
3 |: g4 g# H9 r8 B
! S' x5 g. u3 Gnamespace fy_Exp{
0 G5 {: q2 n- i; k+ ]$ \namespace {template <class _T>
5 b; d* Y3 N) Q4 d3 I3 G' ~inline _T GetExpValue(_T t[], char& csym){
; V8 |/ F/ L5 ^" ], |- e; p    char c=csym; csym=0;+ ^- W2 B$ t( G+ \1 P. ~
    switch(c){' s2 D6 W" W, y5 q
    case '+':return t[0] += t[1];. q; W; k- T( }( a4 M
    case '-':return t[0] -= t[1];9 V# }  \& X0 D! L1 z; t3 F
    case '*':return t[0] *= t[1];, p1 y* @" b; \3 x" r
    default: return t[0] /= t[1];//case '/':( v' o# T2 h0 f7 u3 ?) k' \% E) v
    }
7 }; O' k; N) a1 X}}
8 n9 \7 w! R$ }0 \8 ftemplate <class _T, class _Tstream>/ w( a. F7 r/ R7 h% r0 ^" ?
/* _Tstream: inputstream, _T: get return value
4 U: }$ h" F  C6 T- H/ w6 X7 f* Return nonzero if get value successfully */
0 M% b; o4 F5 P7 k$ |7 o: L! I+ t- r5 ~int GetExpValue(_Tstream& istrin, _T& nReturn){- e7 ]: F+ \6 h" q( S2 ?. I
    _T t[3] = {0}; //雨中飞燕之作" A5 q! p* D. X/ ?2 q* s
    char csym[3] = "++";
3 c0 K3 o9 I8 F  `8 p    int nLevel = 1, nERR = 0;
. H3 u9 }/ |9 [- L- {. X! x: t    if(!(istrin>>t[1]))istrin.clear();
5 r" E! d" {. N9 o( ?    for(;;){4 L( w' s: `: d* }+ d8 ^! f/ x
        if(istrin>>csym[2]){! ]0 ?, ~4 ]1 U  x7 s& P# \  i
            switch(csym[2]){
: j9 M' B* J+ U, e            case '(':+ j/ D+ U0 v0 X! I
                if(!csym[1]){nLevel=0x100; nERR=1;}else! S' Q0 c1 D) a
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
& ^" X( ~& R" d# b; C5 ^1 {                else{nLevel=0x100; nERR=1;}
' n3 Y" T$ O, x$ J6 g3 l                break;5 d5 M( E2 W; W) s
            case ')':
& X# t/ S5 O7 M) Z                {nLevel = 0x100;}break;
/ X* _3 [1 g4 S% J( A8 d            case '+':case '-':case '*':case '/':
/ S# L# z6 T) f5 U                {csym[nLevel++] = csym[2];}break;5 Y( \; [3 J9 @) i/ M4 {
            case ' ':case '\r':case '\n':case '\t':continue;6 H$ z. ^. e! S8 o
            default:
9 ]7 N' a; `. H/ k! `/ `! V/ [                {nLevel=0x100; nERR=1;}5 H, Q( b/ h0 T% u+ G+ h
            }
' P9 e7 v( a( U5 z            if(nLevel==0x100)break;
3 k. N9 [$ t/ z            if(nLevel&0x10 || istrin>>t[2]){7 V; J3 P# T# P0 M- R* [1 d
                nLevel &= 0xF;- ]# j5 F2 f  X7 C, n
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
$ K) r) @6 A1 c" x" B* F8 x                if(csym[1]=='*'||csym[1]=='/'){% g, i1 G5 z2 X! C& D
                    GetExpValue(t+1, csym[1]);5 M1 z' D' j9 y' q7 J6 U  T$ w; N
                }* H' L" K5 f, _6 M
                else{' ?% A. I) l( k9 i2 f
                    GetExpValue(t, csym[0]);
% o4 d6 L( M7 v$ [; `; Z. d2 G                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
1 K) u8 O6 J% |# q. z9 k$ _                }
3 u% a1 F, ]9 x1 ]0 R3 J& t                nLevel = 1;2 s* w+ d3 s" z% B
            }
! E3 F/ H' q9 }# {+ |# {  A            else istrin.clear();
" X' u% G! b$ J/ f* R1 k- B        }
. A; C* j+ q+ Z3 u6 j        else{nERR = -1; break;}6 S1 w8 {  u- z4 s5 i& d3 X8 Z$ h
    }  O+ y$ J- X2 J
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
% w/ V9 G6 z1 m1 s- s: l1 |    else nReturn=GetExpValue(t, csym[0]);2 F. A6 e; {8 G$ Q$ v$ C% ]7 \
    return nERR==-1?1:0;- R6 N" d) G" |1 \' s# P
}}
/ V7 W" L' i2 Y, j; E1 _9 F# ]" s
6 R2 k- F' L" c. G5 q+ z, T& B
( C2 {: Y, d8 _
函数模板使用示例:5 g9 Z  \6 D6 X1 p8 m" ]
在以上那段代码的后面加上以下代码:
" O. \7 {1 @1 X. k
5 I. R4 Y% y* ~. W- M 8 E, e/ L$ K& l, m3 \1 O

7 |, a7 _" v6 {程序代码:
+ O2 ?" X9 Q+ z, x$ s3 N, @
' U) Z% o0 s! E( |$ c1 P#include<strstream>3 s( ~  B# ~; ~8 `6 J2 b% j, h. l
#include<iostream>
" L( d  d, a$ G2 \. x#include<string>4 L* `" k, D- R
using namespace std;) J' E% a1 N' R0 \9 b2 g
int main(void)
# ^$ l9 X  O; T{
0 v+ q1 m8 A8 }6 @    string s1;! s5 I# ]' L  s& C/ x2 J$ f
    while(cin>>s1): I+ b- }$ t+ H9 T& Y4 ~; g
    {
6 B) I2 l, a; h0 r4 K        istrstream isin(s1.data());9 U9 j6 `% [  w, k
        double d;
# u' m: q, H$ G4 E3 t        if(fy_Exp::GetExpValue(isin, d))- |  L) O# m0 q( w, `
        {" A' W) k4 y* A& t
            cout<<d<<endl;" q5 x' I! m, W% _( |
        }
$ s; V/ h% I3 m8 C        else5 c( [8 @( W+ V& e
        {# l5 Z9 J3 a9 j* j7 }+ I
            cout<<"ERROR"<<endl;
% b7 Y3 L% c# U        }1 @  U, I; \3 B  D$ U. B% b8 y: ^
    }+ y5 d8 [0 {; ?" y) P) a
    return 0;# Y7 E* [+ I$ q$ f3 t
}2 }, P9 Y6 b8 L" `2 g
6 ]' V1 m& r$ y4 S5 P9 V% V* T1 i% G
, D/ ?3 S$ |& G9 i! o% z; z
然后编译执行就可以了(*^_^*)
! s0 {% q' {, z其它:TC++上一定编译错误,不保证在VC6上也能通过编译
, c1 ]/ a9 }; a( c      建议使用VC7或VC更高版本,或者使用GNU C++编译

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