返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
# \' C3 r) b8 Z: x) V& c6 I一个很方便的函数模板,可以并且只可以计算含括号的四则表达式, A6 Y. Y# ~9 e
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn), E7 R6 }! f  }* S& v! {3 R0 [/ m
参数解释:' J# H" J: P' s/ A6 S7 p  i
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% ]7 s; f: Q8 B
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
9 ?. z7 a$ ?! ^7 I! M: K3 V返回值:. W6 @1 g" J) X$ K7 W
返回非0表示计算成功,0表示计算失败有错误1 `  l; R+ i4 X) [/ I

5 Q# u9 [9 ?* h 1 t) E) V0 f. N0 {* [5 C* [
7 K' i, N- y/ c+ m5 I! F
程序代码:
5 \' @  v) r6 i) J5 T, y5 {2 V
4 ?! i7 [  c9 n' [) F# _namespace fy_Exp{* N- u1 ~5 v& h! X% E6 l/ d8 X
namespace {template <class _T>
5 C# C/ A2 }3 d0 L: K8 Sinline _T GetExpValue(_T t[], char& csym){4 ]- f1 f: O' d8 L* S% o
    char c=csym; csym=0;
: I0 f, b/ ~$ i: I% ]' d    switch(c){! ^7 f! _1 {# O' ~& v: o4 A
    case '+':return t[0] += t[1];
" W  ?; W' e4 v9 F* L    case '-':return t[0] -= t[1];
/ v  f; j- B7 n    case '*':return t[0] *= t[1];* w9 P* l3 q" W
    default: return t[0] /= t[1];//case '/':2 e/ `1 U" B5 A
    }% x* Q% d- a/ {2 P4 w
}}* U" ?% }1 q2 S
template <class _T, class _Tstream>6 R# U3 l7 U' U" C5 \
/* _Tstream: inputstream, _T: get return value; I& q% r7 u" f% R+ V0 w7 L
* Return nonzero if get value successfully */* A! ]6 ^1 E' r! P+ O0 M  K
int GetExpValue(_Tstream& istrin, _T& nReturn){
. k! o1 B" J( E    _T t[3] = {0}; //雨中飞燕之作' L5 K$ Z5 M8 e: q4 M5 g$ O
    char csym[3] = "++";* r& ?6 z& @: h! X
    int nLevel = 1, nERR = 0;& T1 p: q; O& P4 ?! g, A
    if(!(istrin>>t[1]))istrin.clear();- @- A* ~: w0 h- H4 E8 b
    for(;;){* ?4 f% B2 Q% Q: c
        if(istrin>>csym[2]){
. Z; Q3 M( I3 m( I2 K; g            switch(csym[2]){
4 \5 x& S3 j7 J* }! t            case '(':) h" q) Z; }' f" d7 r
                if(!csym[1]){nLevel=0x100; nERR=1;}else
" o; E. v) X' G' b                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
9 {' c8 P7 J& D/ b: b* e                else{nLevel=0x100; nERR=1;}
8 O/ h, f9 p4 W+ [' E* g% T                break;
0 ]4 Y( U$ F! s" k            case ')':" s0 H$ u& R, m" y; O, x! }
                {nLevel = 0x100;}break;5 j+ ^# q( H& P. x. O2 o
            case '+':case '-':case '*':case '/':% \% {6 n; a; A* e0 A* w3 ]: e
                {csym[nLevel++] = csym[2];}break;
9 x, C0 Q% J$ v, K1 y. D0 I            case ' ':case '\r':case '\n':case '\t':continue;% M8 h% b; D& T4 l2 w
            default:
+ ~0 S7 i0 F8 l! H$ F0 j                {nLevel=0x100; nERR=1;}
1 z# J  F* p9 Z. L* _( Q# K. U            }
+ @9 x0 K% ~! i3 T            if(nLevel==0x100)break;
$ r' Q0 [* ?- ^4 l+ Z- j5 z1 S% f3 n4 Z            if(nLevel&0x10 || istrin>>t[2]){: @. T) T, y: y% d
                nLevel &= 0xF;
; `# ^7 N, ~* J9 U  F                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
2 `9 l0 N  j9 P2 K" x3 _                if(csym[1]=='*'||csym[1]=='/'){
/ d9 [+ Q) A1 Y2 b0 N% A0 H                    GetExpValue(t+1, csym[1]);- _5 }3 \" }. `
                }4 V7 W* F* f: D9 h
                else{7 H" ]: _+ D' _- u* \- ]6 X
                    GetExpValue(t, csym[0]);
- ^# H- R  m% K2 d- H5 w. l                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
7 ^9 s1 u) f1 v# m: ^                }
6 H" Z  L, q. L% E3 ~                nLevel = 1;% ?7 P& Q; t, p& z$ Q7 G% z
            }
7 G0 N- D  U6 ^- O            else istrin.clear();
+ x$ h' ?% [0 ~# B! z/ ~        }
9 p: W$ {# @; N- P$ l" z4 ]        else{nERR = -1; break;}
& \3 J1 w7 V( c! U3 O' z0 f; ~* X    }) t3 B# M& P3 p
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 f6 B7 x- |9 {1 `9 r1 b* l    else nReturn=GetExpValue(t, csym[0]);& E1 m. w6 J% S( _" x
    return nERR==-1?1:0;  Z6 q% E) t' D' [
}}3 q% r4 J+ `* b1 _$ G

- c! I! g! B" W. U8 t5 s" A
% W$ ]9 W* z/ r; R
* k+ j: e; D4 e9 s1 {) a函数模板使用示例:! w; E" |+ m" t1 Z: D
在以上那段代码的后面加上以下代码:
0 }+ z, t, w7 o6 L, p' y0 ^) S( n9 G# `5 J! {3 j
( h* g: l. |- ^7 p. q! O/ V- Y
8 T2 y, u1 w! L( L
程序代码: 2 Z3 g4 u" d5 m7 e& u3 C

% `/ S% Y6 B" w3 Q" x5 R4 Q#include<strstream>
; Y) ~8 l) o( d  D! Y1 f#include<iostream>* a. T7 c* c1 J) ~8 k/ ~
#include<string>
1 z* u/ h7 n. D* [. uusing namespace std;
( J5 @% a! l3 {# }int main(void). ~# {2 N6 c' i1 K4 m
{" [9 f! ^, Z5 t5 f& T0 X0 `# E
    string s1;8 U7 t, ^+ C0 C1 [& `/ e; z3 f, c4 O
    while(cin>>s1)
9 ~3 m% `1 R0 V6 ?6 S+ ~5 p2 r1 q    {
1 W7 o5 `! u( h5 I& l: c. b1 Y; n. W        istrstream isin(s1.data());; _+ S1 |$ H4 _5 a6 E. i0 X
        double d;0 |! S0 L2 H. f8 A; M. X
        if(fy_Exp::GetExpValue(isin, d))
( ~. S3 W; y0 N* c: D2 D; u* c        {
( V5 e: c2 W) m, ?            cout<<d<<endl;6 ?/ ?' z) E: p4 O' v2 P! {
        }. V1 [7 X# O9 U: z- g
        else
# z7 S; ]0 {3 _5 r# f  C        {: n1 `1 g: j% O$ h6 K+ ^7 A
            cout<<"ERROR"<<endl;
1 W! |# F4 I# M6 i: P        }
( w: z8 w' w: f: L# M* _6 \    }2 G" r1 ~0 d; g5 F0 u8 p
    return 0;1 A, ?; W- R2 R: J) K
}
5 Q; R" J3 V  X, @9 S0 g0 V( L. }; F+ B
9 s; _& X' h* h
然后编译执行就可以了(*^_^*)
: b# V# t0 w7 T5 c# c其它:TC++上一定编译错误,不保证在VC6上也能通过编译
' U3 n* V- I) N2 d! s6 D8 Q      建议使用VC7或VC更高版本,或者使用GNU C++编译

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