返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,- m7 B2 d7 A/ j  w  Z/ ]
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式3 W0 N. [0 {1 s
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
' W( t' b* I7 }. x参数解释:
. O  T6 {, l2 m5 _) q, P' D$ ristrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
( r' z( X) a( \) M! wnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定& q- X* M4 _$ r- X6 P" D2 M
返回值:
* {( M) C& z/ ?返回非0表示计算成功,0表示计算失败有错误% f+ p0 _. g* p) }7 z

# Q8 M/ ?5 a: z/ z# g 1 k7 K2 g4 t3 o+ A: P

% I8 b# h/ a' y* u! m! W& n4 n1 T7 W  p程序代码:
8 C. `0 x0 {6 n( o, K1 m; D1 q) i, b: p3 V- v, b8 z6 O  l# e' A
namespace fy_Exp{4 k* R; `4 {8 o! ]: Q
namespace {template <class _T>
- E8 W) X' W8 L" n$ d1 }* x6 {+ rinline _T GetExpValue(_T t[], char& csym){
" |5 x8 ?$ ]3 u6 p    char c=csym; csym=0;
# [( n  b& u% S4 q( Z" A3 e4 x* `    switch(c){( x0 r; {; |" S4 ?/ e
    case '+':return t[0] += t[1];* Z0 p4 b+ i6 e6 h
    case '-':return t[0] -= t[1];
  f/ f9 U9 L, q# v    case '*':return t[0] *= t[1];
' u$ y5 }4 E3 u  }" `    default: return t[0] /= t[1];//case '/':# |4 W5 D7 y% t8 S, q
    }6 a# v; i) @% l& c& x- z
}}
# m" Y. z% n$ X) z% U7 Z- vtemplate <class _T, class _Tstream>
( ?4 c3 V/ e* a- v' G, Z9 h+ x/* _Tstream: inputstream, _T: get return value1 }% l% f/ c) a  c: B
* Return nonzero if get value successfully */
$ K! V# N: E! ]0 p1 J! C9 Nint GetExpValue(_Tstream& istrin, _T& nReturn){
7 |! {9 w* f/ z5 E) B  ^7 ]- Q0 M! w- `    _T t[3] = {0}; //雨中飞燕之作
. A4 c% u1 c6 e; j8 C+ s& Y    char csym[3] = "++";
) w/ ~0 B" w9 z9 k: I7 S    int nLevel = 1, nERR = 0;" I4 U. g" d& g+ G6 V6 M8 x6 a
    if(!(istrin>>t[1]))istrin.clear();4 g1 q  {& s3 A9 B9 C. \
    for(;;){
0 ~& n$ U: v# s/ {5 d" J  ^' _        if(istrin>>csym[2]){# l$ f. ^; g5 ?0 r' s! O0 j
            switch(csym[2]){4 [+ M8 {1 K, E/ A$ ?
            case '(':
" P7 z' R! o' h, g                if(!csym[1]){nLevel=0x100; nERR=1;}else3 T/ Z% u/ [" O) O! [% j. n1 N
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;' `5 r/ \$ a9 J- b
                else{nLevel=0x100; nERR=1;}5 k8 l/ u: E) y- }
                break;5 ^  I, R& a( K
            case ')':  W% d% D( \; B1 T6 o! ]$ G' f2 g
                {nLevel = 0x100;}break;/ ?% P& f7 A( D) k) @  c6 q! _
            case '+':case '-':case '*':case '/':* V6 j* A9 x6 u/ d- k$ Q
                {csym[nLevel++] = csym[2];}break;, q8 a1 x% j2 w' x
            case ' ':case '\r':case '\n':case '\t':continue;
, q! {6 q. G1 a" U' S7 G6 C8 M            default:
; O* R' Y! O* D! m- p  z                {nLevel=0x100; nERR=1;}& \) l' }; s8 B; g* g
            }
& p# K0 j8 h) E9 s            if(nLevel==0x100)break;+ `( a7 i* ^3 }5 y* B
            if(nLevel&0x10 || istrin>>t[2]){. B) v6 @  V2 g/ W
                nLevel &= 0xF;+ f" E' W+ Q( n$ q
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}# m8 f# |+ J2 o' o+ R* _7 v
                if(csym[1]=='*'||csym[1]=='/'){! Z! Y7 j" i* F9 O
                    GetExpValue(t+1, csym[1]);$ f! X' z. ]8 N+ {' F/ N9 [1 x
                }
. V9 D' O) e% K& h                else{1 |- L9 N: J. }. k. R8 m3 o
                    GetExpValue(t, csym[0]);
' x5 f" \# Y2 ?/ a                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;. b1 ^# R+ h) l* O# A' S
                }6 H% h) V! j: [0 P$ m
                nLevel = 1;
" e  r; y  X* x  a# U' b            }$ H3 I# y/ N8 k( Y- @2 o
            else istrin.clear();) u2 r) B1 y6 A2 k. ]
        }
7 n6 C, W+ }5 u4 ~7 m        else{nERR = -1; break;}
; l1 X4 c  `" z- i5 L6 m    }
" ^4 B9 r' }; D2 _" A8 ~    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
' G, o2 o. c6 H* @9 w. O( E( L    else nReturn=GetExpValue(t, csym[0]);2 M- f0 a' g' W2 X. X, k
    return nERR==-1?1:0;
2 w- a" v7 R0 g$ N0 s+ A}}
1 n, `9 A9 Q, E4 z+ F5 k
5 ]' K: w) [" K2 `& A7 h  L9 t. x! E, `% Y. [

' @8 ?" o) a, `  Z( f函数模板使用示例:
! s( s  J6 H, b8 V. M: ]  U在以上那段代码的后面加上以下代码:
  R" i7 `) a* h% W  F. Q8 E- q
3 b7 f0 l+ L' {! W; j! D. v + q7 q  Z5 _2 Q9 a$ f0 C8 Z" w

1 r8 N) d2 _/ e程序代码:
) ?0 T! J  b4 _* N! F8 c/ _" g, }+ r9 y5 a$ D2 }
#include<strstream>1 B1 f8 T/ ]- k/ |. D
#include<iostream>: ~8 ~8 j8 ^, `) Y* S! i5 g  R
#include<string>
0 o* [( j- e3 W! F& susing namespace std;
/ x% `/ l! U3 k9 tint main(void)  O- x6 Z8 @' l  Y: M# {  s* X1 h+ H
{' y6 w4 u; U( |1 m( X
    string s1;. Y1 }6 i8 C3 K) M$ b2 b
    while(cin>>s1)' b3 T+ e' W+ W1 x6 z: B* w
    {
( }$ a# x1 J% _        istrstream isin(s1.data());, _8 f5 R& j, b* _$ g) E2 X3 q
        double d;
( b' w' B" O4 O  K, d        if(fy_Exp::GetExpValue(isin, d))
3 o* q1 ]! N+ `        {
6 T/ c- J5 X6 g% ^            cout<<d<<endl;$ d# L2 L* H* o5 s
        }
( K# ?7 X& x0 ~1 F" X* n9 P# T        else& p4 f# X+ ]1 i' C
        {; M$ V* k6 }0 ]% M
            cout<<"ERROR"<<endl;
( _! ~5 c$ f( H& _& V4 Z        }
# M0 m* M) v8 R1 `  E    }
7 P9 t% N, M9 M/ g    return 0;5 F/ R' g' |! |8 w  D
}3 x5 S/ ?" x/ ?) T2 d

4 [( o- f' A, s6 J( U, }7 F+ s0 o. n! M; U' ]% Z
然后编译执行就可以了(*^_^*)$ U' Z1 J7 x2 I1 _1 b& A' C
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
- E# f7 A' I- Z: o5 {      建议使用VC7或VC更高版本,或者使用GNU C++编译

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