返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
& M) c0 M, e1 h& y; u8 Z0 _一个很方便的函数模板,可以并且只可以计算含括号的四则表达式$ P/ I: x9 k/ F" {6 R3 j
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( X$ ]" h* w$ {8 Y- \  }4 h6 d
参数解释:+ A8 H3 N$ S% L5 s) U5 z
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流8 h7 j- c9 H& w9 u6 K# \6 l+ P8 S
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定6 X$ y$ x; z  r3 {; |; A
返回值:
  O3 C& ]) g1 u返回非0表示计算成功,0表示计算失败有错误
1 ?2 j  _$ W4 F3 L9 |/ q( `* s3 [) ~/ g/ O1 K9 H

( h) m4 ]6 t; f" I" U8 M6 G1 v* O7 E7 `) a
程序代码: 1 `' }3 ^3 b) [
, t! Z" A$ k% V7 m; h) v* R+ `( Z& C
namespace fy_Exp{5 e* x3 `9 q6 r+ A! E
namespace {template <class _T>$ R; z6 D3 H3 \7 L
inline _T GetExpValue(_T t[], char& csym){( m4 h, v8 K* I8 v# ^; E) Q$ d
    char c=csym; csym=0;# q: z* [' g' J- q
    switch(c){5 G8 X" G0 ~; M) r/ Y; u
    case '+':return t[0] += t[1];$ [* F  h; A1 f6 }3 q0 j
    case '-':return t[0] -= t[1];
$ C* K  `8 e) ?# T    case '*':return t[0] *= t[1];! E$ u; K. G2 i; h; f8 Q
    default: return t[0] /= t[1];//case '/':4 U" f4 z7 C% ]
    }
' b/ R/ n$ B" f7 [( g}}- l0 R: W' A4 V& y$ Q4 g
template <class _T, class _Tstream>& z: |" j( s/ R# }. s. p" D" Z$ `* K
/* _Tstream: inputstream, _T: get return value
! f$ L. U5 G# t& T# F( b6 |* Return nonzero if get value successfully */
! `. V/ y4 s( _5 V, s! sint GetExpValue(_Tstream& istrin, _T& nReturn){
4 K9 \% g7 Y+ L- h0 y    _T t[3] = {0}; //雨中飞燕之作) i; n% T2 h  x5 U
    char csym[3] = "++";; L2 ?# {6 T: b' ~' |
    int nLevel = 1, nERR = 0;
: j) t' z; i. _; v2 G    if(!(istrin>>t[1]))istrin.clear();2 y) O1 o4 D  y/ e7 w) v6 @) N2 @
    for(;;){+ F6 e) T, y9 F" C$ I3 B
        if(istrin>>csym[2]){
0 H. h7 T7 N: X9 m/ s  N, c            switch(csym[2]){
% i" ~. _$ f: w$ Q+ |5 ]            case '(':1 t: U0 @8 s) _1 w4 n* p9 s5 ^
                if(!csym[1]){nLevel=0x100; nERR=1;}else
( F5 _+ _* w( Y! i; X+ w                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
3 H. `/ M* m5 R; ^! H9 M                else{nLevel=0x100; nERR=1;}% N4 `! r# t6 R4 M. V" m; Q) c
                break;# w, E6 D* l; b5 y* ]& G3 ~* H
            case ')':
. S0 m( j7 @0 c2 t+ I) z6 v% K( r  d                {nLevel = 0x100;}break;
" S& \" p+ _# i; i            case '+':case '-':case '*':case '/':' f$ I' t2 r+ l: `2 t/ L* p
                {csym[nLevel++] = csym[2];}break;
3 `$ o* `+ [( L            case ' ':case '\r':case '\n':case '\t':continue;
& L& W& M$ [1 |2 x" u            default:2 w% Y4 f5 V% Q5 K% {2 x
                {nLevel=0x100; nERR=1;}
0 E. S. M; L! U7 J# F2 i  w  R            }
+ l/ O! }4 |# h8 y            if(nLevel==0x100)break;
$ ]" `$ S4 d% ^% D            if(nLevel&0x10 || istrin>>t[2]){) H9 v8 `+ {1 H% }9 i1 c+ f  P
                nLevel &= 0xF;
9 m4 q8 [% I" ^6 l. `                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
9 Z2 h+ b& ]; Z2 x% {                if(csym[1]=='*'||csym[1]=='/'){
: R8 n3 v0 w* y                    GetExpValue(t+1, csym[1]);
& d' z& b* ?) k) m                }
2 G  Z+ L: Q! C4 A& O9 F0 {6 m                else{- _1 W0 i1 F5 H8 e# ^
                    GetExpValue(t, csym[0]);+ F* _% p* o+ U3 ^8 w& ], L
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
2 A+ j9 Z8 e: p4 ^- k) |* r                }; ^+ W, _  K. ~7 g, s* E
                nLevel = 1;5 E* f( J* n0 S- G# {
            }9 }/ L& K# f. h
            else istrin.clear();
9 C  z) K8 q8 u1 L0 ~: ~        }! l$ {" c$ Q9 F$ U0 ^
        else{nERR = -1; break;}
# Y% {5 p5 e$ d+ ~9 v! \3 N6 ]/ S    }- K% r7 ?- |' J; \' X
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);; F& k# J: x: x" E
    else nReturn=GetExpValue(t, csym[0]);2 V9 ?# k( b, f) h, J3 u- @
    return nERR==-1?1:0;
. K6 @4 n3 D7 q# r: T, [}}/ n8 Q' U- s# ~2 ?
0 d+ w/ ~7 _. [; ^0 q% }

, K* y; n$ V( P5 N- F* E0 Z
; f* p+ Z4 c) X3 x7 [3 |- B函数模板使用示例:
4 w+ O9 X- H' V- @在以上那段代码的后面加上以下代码:+ h! s9 f. n0 m+ W
/ z2 m+ C/ c7 j6 r$ P
. g0 x9 e' X% q2 H' u

/ ~7 J& D. Z# ]: u程序代码: 8 J4 R' r3 g- m/ [! D# i  y$ U

* O+ u/ |  I" b$ [8 m% s; ~#include<strstream>3 ?1 L% q% q# R$ G& w
#include<iostream>
0 d# F# x+ H) @+ l+ t# F#include<string>+ Z& @* c' b- b5 I) G& m7 G
using namespace std;5 L8 U1 A) ]4 M1 a* t$ r
int main(void)
" X/ p  M" p: i/ u$ P, z7 b{
2 u2 m- W' e' m    string s1;3 Z, y! N) X4 f- s
    while(cin>>s1)
4 `1 p' M6 u- L, @/ J6 R    {
5 z, x2 Q$ D) z# z' [9 @        istrstream isin(s1.data());1 H/ W! Y7 @0 Q
        double d;5 w7 Q' k3 b9 j5 p
        if(fy_Exp::GetExpValue(isin, d))
) n6 d# }- J% W, S        {  y  Y+ h, w8 U& ~# W, d  d
            cout<<d<<endl;, ?' S- O/ e; s: T& L* L
        }$ x( H3 v! V- c9 O% ~! h
        else' J; z9 ^( u6 _2 i7 M
        {
- U% o1 X  z7 P! q" \" F* U" K            cout<<"ERROR"<<endl;
: Y8 U: E9 f$ n        }
+ a' e. J: Q7 N/ V: U$ I& G8 X    }
3 ]2 Q& C& r: Z. k. i8 B' E2 D    return 0;8 `& [8 x3 l# t- g  {1 {$ K
}9 k  E8 m& ]3 h

$ ?  T, b! o8 p5 N: A6 W- }& I% ^$ e' w" g4 L+ s. T' _2 b
然后编译执行就可以了(*^_^*)
1 C! O' y# t! e2 W6 Y2 D其它:TC++上一定编译错误,不保证在VC6上也能通过编译
+ W! m7 `9 I# L1 k* ]      建议使用VC7或VC更高版本,或者使用GNU C++编译

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