返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,1 K7 l% v+ B; l4 a" ?; `* I+ T% M
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
% Q# R, N$ w8 ~只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
% N/ p7 f- B6 G. p7 x5 {参数解释:; h+ M4 Z( ~. m& ]# J1 Y
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
) K4 f% s# ]* }! h5 _/ ynReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定- N- \- m: X6 |# O1 ^' R5 A
返回值:! p; m4 X, K* [4 f% F
返回非0表示计算成功,0表示计算失败有错误
6 a% @+ {  b. ]- ?, y
# V7 N1 W; x# X0 }( U- M0 D* B + f$ E/ ~8 D6 x3 b1 p. F$ I

! o% n  h2 r' V0 M程序代码:
2 H4 h% q0 A% n$ j( x# e& p$ B0 F! X6 Q
9 o; S2 P  p( x) Qnamespace fy_Exp{( O+ ^+ M: O) ^3 G; ^3 w
namespace {template <class _T>
8 r* x! J; b& \) `. v3 p& l$ |inline _T GetExpValue(_T t[], char& csym){
% d; ~: q6 j* V+ k4 l! p; ^7 C    char c=csym; csym=0;: x" F, z3 \4 [
    switch(c){& K$ t1 t$ J( v! [! [% d
    case '+':return t[0] += t[1];
; t* M, j( K8 e. g2 R# w; D    case '-':return t[0] -= t[1];
" V% [: p3 O) r7 u    case '*':return t[0] *= t[1];
3 u' A5 J8 P$ ?  s* }    default: return t[0] /= t[1];//case '/':+ _+ l; i- t" Q9 l3 \  K! [# _$ E
    }# |* V4 \) M$ J; w3 v  U4 j
}}
% P8 e: l( Q" d0 Ztemplate <class _T, class _Tstream>
3 k8 k% m3 ^) q& x/* _Tstream: inputstream, _T: get return value% _3 D) O; P  _# B' X% d
* Return nonzero if get value successfully */& t% p. J$ s) D* \5 q/ Y% q0 J
int GetExpValue(_Tstream& istrin, _T& nReturn){3 a/ O- [8 A  }' V
    _T t[3] = {0}; //雨中飞燕之作
3 M9 [" ]4 n- G/ [& e    char csym[3] = "++";. i7 e5 `( r0 R1 B  Z3 [
    int nLevel = 1, nERR = 0;
* y# [( P' ^# X  q# g. ?    if(!(istrin>>t[1]))istrin.clear();
4 h9 {* A5 {' f) E: j: F/ D$ i    for(;;){1 [* m& `0 H# x, ?4 A9 r
        if(istrin>>csym[2]){1 S/ Q& z0 f& G: m3 Q: a9 v
            switch(csym[2]){( X9 e3 P, d$ z; Z1 Z( C
            case '(':, X7 Z! n; z9 t( a4 j9 l. O
                if(!csym[1]){nLevel=0x100; nERR=1;}else
* x8 v5 {, ^1 M3 [% q5 b9 p. @                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;. i0 l4 x" e9 x; W5 |& ~
                else{nLevel=0x100; nERR=1;}
3 y' w/ o5 G( S0 V0 b                break;
  e+ R+ j- F1 }/ r" n! K            case ')':
9 f: E3 I/ {2 @                {nLevel = 0x100;}break;+ d: z2 |/ |" P9 U3 g* z
            case '+':case '-':case '*':case '/':, R) T2 o# J' m( p. O. k
                {csym[nLevel++] = csym[2];}break;
5 }7 T  Y. @: m9 w/ N7 ~/ U            case ' ':case '\r':case '\n':case '\t':continue;# ?9 j, }, [/ y8 n. e
            default:( \& a5 c" X: Q
                {nLevel=0x100; nERR=1;}  r8 e. e" o: s' }
            }
4 ^6 T- a! C& ^. T* }            if(nLevel==0x100)break;) M/ H/ }2 p  X/ R. D' w
            if(nLevel&0x10 || istrin>>t[2]){
2 E' G; ]& Q- U, y0 ~                nLevel &= 0xF;
" K& h( f) ?5 J. `+ o! |                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
9 V* t0 ?; L/ G7 y! u0 {                if(csym[1]=='*'||csym[1]=='/'){
* e! {, r9 P2 U2 G" s2 M) d) s/ ?9 {                    GetExpValue(t+1, csym[1]);; J' ~% R. G6 C/ l- y8 ^, ~* w5 A1 p
                }
( `" o/ I4 a& i1 j. \6 Z6 F                else{
; }5 l8 x) n! a8 t8 b' ?                    GetExpValue(t, csym[0]);8 X# u' A( M" r6 j9 F3 K$ _  e9 E' U
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;) X; M1 Y+ |  D5 V4 Z& L5 o
                }+ l. l) [% u2 b# F
                nLevel = 1;
. R& d2 \) ^0 z" F5 }4 p            }2 ~! K' g6 }5 k! `4 ~
            else istrin.clear();  D* H6 x9 _/ l3 N! V3 x9 J# `
        }
) V. R( q1 ~7 |) M        else{nERR = -1; break;}# ?6 L' W3 `& c$ a" z& m
    }# D! a; ^! [4 s2 z9 X- ~
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
: p3 _0 q( V  C, E- C4 k: g' B* G: }    else nReturn=GetExpValue(t, csym[0]);
) {) D* ?, J) R8 I: B7 J1 P' w    return nERR==-1?1:0;
+ `" @7 a' w8 k9 e+ G# y+ o}}" ]8 Y( e# P/ d0 `. W
$ w2 |5 e. n& G& Q& c
# b! g3 U! D( X- O% _7 F

% k. H, m7 E8 [函数模板使用示例:2 L- p* u4 Y$ T; K/ p
在以上那段代码的后面加上以下代码:
  G( {* ~# N; V" X0 |" Z8 T5 C4 m, e7 R% b
+ h* ^) n$ |6 F  c# C1 z0 }* g3 c

$ p% g; h" E: e$ y% @程序代码: 8 ^" s* d- p' ^
! P" J5 l- Z- C9 z$ ]. f
#include<strstream>1 K9 F/ p6 g0 c$ q
#include<iostream>3 A9 m5 j% V, i
#include<string>
# O0 m8 [- ]* D3 Z0 V3 [& Eusing namespace std;
+ i' b9 c6 _- V( iint main(void)
. \# [& h% Z; s{
% ^0 P" v- g/ J& |- O& j8 k4 f    string s1;
, F/ u& c  B7 g& g* n- o5 D8 Y    while(cin>>s1)  W( R' Q5 q. S3 F& T( A
    {1 i. z2 b( ]! W( e4 h4 T* a6 g" R( ]
        istrstream isin(s1.data());  i( i+ e% d+ ^0 b8 B( G" F4 n5 n" l
        double d;
  ^' C* P) P' F3 p- ?. P        if(fy_Exp::GetExpValue(isin, d))
$ ~9 P5 Q- q: D, }4 W* |3 a; O4 ~        {
1 X. [9 u, A0 L6 J' M            cout<<d<<endl;
6 o* A, E. H. m7 g( }        }& j  b5 D: @4 P  J  P3 J$ s% B
        else) X% G( a1 ^$ J
        {2 }+ d0 W# L/ g+ _6 ]7 U. U0 Z
            cout<<"ERROR"<<endl;
2 s$ ~" ?5 L3 t, S! a$ C8 n) A        }3 }) l; j6 S9 [# y
    }
4 Q, q5 X( d6 K3 K$ n    return 0;
  N) Z( q9 k! Y2 [; m& T}
1 A' H/ A3 [9 ~5 X- `3 ?
& T+ o9 T1 J* H% `' r. e  A
# x/ }1 B9 E1 s4 x6 q3 |" _然后编译执行就可以了(*^_^*)
9 n- F( x5 s. }4 \: o* Y其它:TC++上一定编译错误,不保证在VC6上也能通过编译
) c- q2 h6 Z8 @# y. Y+ [      建议使用VC7或VC更高版本,或者使用GNU C++编译

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