获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,+ s+ I' o: r& c
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式/ o9 v$ Z# m4 M: B, W! B( q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
8 K1 S3 U& J! N: n9 m3 E* Q参数解释:  d# N) U8 t2 g4 {
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
6 x& E" z3 E& S* |/ onReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
! m+ y) m5 v3 g+ M返回值:) T& o! F6 ~+ }
返回非0表示计算成功,0表示计算失败有错误
' G# N: c* H3 T- ^+ }0 I; V
; j- H, u$ \* z0 \9 f+ @. @
0 z1 ~) |2 B; w
& O- f8 X3 [5 _) w% _- f# Y程序代码: ' [4 n( w' H3 ?4 Y8 V
" u, \9 x) P) m2 ?# F) Q0 z( _. {4 d
namespace fy_Exp{
9 D5 [8 E: j! g- I' i  v) Tnamespace {template <class _T>2 j) W$ a" h+ i3 j# Q% {
inline _T GetExpValue(_T t[], char& csym){
6 s4 f) E3 n+ J+ V5 q& |    char c=csym; csym=0;
3 D. q0 n4 k' c3 H( g* A    switch(c){8 ?. B9 O8 I" z' d: D
    case '+':return t[0] += t[1];
" o4 l# h& U! A& T    case '-':return t[0] -= t[1];- n8 {# j. [8 |6 T% e
    case '*':return t[0] *= t[1];
% S  g" z) m' D( k# N9 s+ }    default: return t[0] /= t[1];//case '/':  e( q( n6 J  p* ?' [
    }
9 X  k, G- J0 B7 H8 N, i}}5 |% R3 y2 u& Z' _$ @' R& |3 m
template <class _T, class _Tstream>
6 S" O1 p+ v- X' l/* _Tstream: inputstream, _T: get return value
% u8 v# F# q" a) u* ?2 [: z6 h* Return nonzero if get value successfully */6 K; l7 E" o4 i3 t
int GetExpValue(_Tstream& istrin, _T& nReturn){
  j3 X! P$ Y* J6 g' }. Y- u3 I8 p    _T t[3] = {0}; //雨中飞燕之作
0 U  N5 N  B0 w$ o    char csym[3] = "++";
$ [1 n2 J3 [+ s4 y! c$ M. k  |. b    int nLevel = 1, nERR = 0;
% t/ {- d7 a. B# L6 c$ [$ P9 U+ e% j    if(!(istrin>>t[1]))istrin.clear();
& A5 I. R* P6 Y: \: q/ j    for(;;){; D: ^2 N- g6 _
        if(istrin>>csym[2]){
- S" T( m+ L2 v( ~& j  v( Z            switch(csym[2]){* S6 B0 W3 _# l# \7 }
            case '(':
  ]  Y" _4 g2 f6 q" Q# Y                if(!csym[1]){nLevel=0x100; nERR=1;}else
6 O! A$ ^! j8 |0 {! l                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
) j3 ^  u% O1 y9 L7 b                else{nLevel=0x100; nERR=1;}9 N( d) f5 r7 ~$ s" G
                break;
" k9 y+ r( m4 O. H3 J/ x            case ')':) G: z* M8 X1 I
                {nLevel = 0x100;}break;  e6 O: h$ b" w
            case '+':case '-':case '*':case '/':
- B% ~6 ]; j% T- \                {csym[nLevel++] = csym[2];}break;
; x) J: w1 I  y/ q) q            case ' ':case '\r':case '\n':case '\t':continue;
# Q* I% n2 d: p# j4 X            default:
# h" o. r5 k( @2 M, x                {nLevel=0x100; nERR=1;}* e% U5 k  l& V) f8 q0 u) r
            }
, X" ^( Q( Z$ W- R7 F            if(nLevel==0x100)break;+ a+ b  M7 _2 q3 {
            if(nLevel&0x10 || istrin>>t[2]){6 A1 C" T" H4 r( J+ G) }% r% U
                nLevel &= 0xF;
) O! G" {$ d5 E6 n7 [                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}: M5 `- T( z+ r- K3 ?8 \4 j
                if(csym[1]=='*'||csym[1]=='/'){
5 }4 Z, W0 `6 F8 z4 V+ U                    GetExpValue(t+1, csym[1]);
. v: y) B+ v* Z6 J, T4 I                }- N" P, E' P6 K/ i7 g
                else{9 O! r2 m4 v4 m4 a& e  e
                    GetExpValue(t, csym[0]);
" X, M( I/ k' W                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
% J4 q5 ^  b9 [7 k  J; f, _: G                }
) D, H( f) V6 V6 x6 I3 A: o                nLevel = 1;
1 Z: U9 C% t1 p5 B% ?; T            }
4 P" `0 Q7 x/ y" a6 x            else istrin.clear();
. A! Y. Y0 n2 {        }8 U$ C2 h9 j' u' D' X
        else{nERR = -1; break;}$ G! _& n3 ^5 P& l1 ^  h
    }
0 k- F; E4 }7 z    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
) ~3 `  Z+ S, `* l( x/ @    else nReturn=GetExpValue(t, csym[0]);8 q- V6 }5 w. E- e
    return nERR==-1?1:0;
! D# m  A/ k2 q! ]$ o. K" D) ^}}6 D1 F$ P0 ^: `0 ]% b7 B
1 \/ v6 h$ q8 D3 _( {
8 `* K; c6 L% ]  Q; f$ y: w

# b* V% w) P) A) y( I% o* W函数模板使用示例:
6 y2 b* T7 u/ r- g2 K在以上那段代码的后面加上以下代码:+ a. ~3 p1 c  T: h/ _0 O
, v3 d, L8 V+ x- v. @

( t% z  U3 m$ P" @0 `1 L$ _' c! h: t3 S
程序代码: 1 S! q$ d* _" T$ I7 }8 l
6 b$ G) f$ K! B0 `& b2 y
#include<strstream>
* w2 j$ ^5 Q6 Z: C' f$ _$ S" S$ A  V#include<iostream>
# P: F* _5 W/ x1 K* ]  I! A2 n' F#include<string>5 Z; _2 L" x- v  Z
using namespace std;
, [* ?" D: l5 ^9 [. i4 `- gint main(void)/ N0 O- ~/ O9 H; [" P$ }
{4 \) R- {  a* o: r, J. c7 f) k
    string s1;, l4 o- B8 m: h
    while(cin>>s1)) ]" h: R0 _0 D  y. x
    {+ I0 I% b4 Z8 F( S/ V
        istrstream isin(s1.data());- }7 Y( e  J! k0 h) O
        double d;5 Z$ q6 T7 ^& ~! f
        if(fy_Exp::GetExpValue(isin, d))
0 H& z7 S2 E7 K# l& H0 A        {
6 C1 E1 I8 R( n/ ~% }( d: @            cout<<d<<endl;6 [/ O; z5 X: B% c4 h' ]
        }
9 g. k& I: ^  \8 b        else
, W6 ]: }" ]4 O3 [. C        {7 l( M! y+ \$ r, N4 w% \
            cout<<"ERROR"<<endl;
7 G1 N4 k0 d& G! e4 c& l        }
8 L$ N. r9 R# C( S2 e% v# |* V    }
) I  Q1 U; `2 e! K( a    return 0;
2 [% e& I2 u- `3 G' I}/ m7 F, m1 g5 `3 i( j4 R

! p& I7 [: T$ ?3 ]' @
" d4 q; C/ `' B: {1 L; Q9 d然后编译执行就可以了(*^_^*)8 T+ _2 }5 k- K3 Z8 C" j+ ~
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
# l- T# K0 y  ?2 ~7 `. Q$ W      建议使用VC7或VC更高版本,或者使用GNU C++编译

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