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

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

在9月8日那天我特意编写的,给大家分享的,
7 Y2 z$ E( q: z0 B3 \+ \3 ~+ s& Q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式* l/ E0 J6 Y8 Z! X
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
1 f; B* Y% V, `- M% c9 ~6 R; u参数解释:3 j2 `; u# u4 X3 F( h
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
7 z  P7 H' T; w& H. d" p# U: f% znReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定* B& `4 }, E2 f' r8 f
返回值:
. r* ]% ^, ?! a; s, y, ?返回非0表示计算成功,0表示计算失败有错误. M# C& u4 B3 p! e# V- w# c' H0 _
6 X8 G1 k1 {! S) O( Y, A& F
% Z7 U) a" b: d0 a/ h0 T8 Y

- y) L, F+ z1 j+ _8 N! s程序代码: 5 D* f+ t- S6 ~$ C
! {. f) F  @' {& ?
namespace fy_Exp{
" V$ W1 {& d% y( P% A. s. i3 ^3 z) H- Jnamespace {template <class _T>1 T# g, M4 I! N0 w
inline _T GetExpValue(_T t[], char& csym){
. G& m2 |; R) j0 c1 l- Q    char c=csym; csym=0;
' ?4 F. d5 p* n* L0 y    switch(c){
8 V2 O$ v: H4 t/ N  \: \8 O! m    case '+':return t[0] += t[1];
2 b7 n7 A! U/ C! c' i9 S3 r    case '-':return t[0] -= t[1];
* r' @8 j: o( v4 z6 c0 G. p, C    case '*':return t[0] *= t[1];
' {! I$ K3 m& W8 M. a  `9 |    default: return t[0] /= t[1];//case '/':
9 S$ ~& s% L' W5 b2 g& ]    }% [# N9 V/ f6 k
}}- D5 G1 t& t4 [( @% \
template <class _T, class _Tstream>; `4 L+ A% g* z! c" F
/* _Tstream: inputstream, _T: get return value
8 c/ ^/ |4 q2 I* Return nonzero if get value successfully */
2 z: l( D1 v2 x4 f1 Pint GetExpValue(_Tstream& istrin, _T& nReturn){- l( e9 k3 L" i5 M: e
    _T t[3] = {0}; //雨中飞燕之作8 [; N/ v! e8 }: c& k! d5 c( j
    char csym[3] = "++";+ N  P) x9 E7 \0 i% w  D' E
    int nLevel = 1, nERR = 0;6 Z/ C6 @0 I/ s4 P
    if(!(istrin>>t[1]))istrin.clear();9 g! y# ~: Z7 z% i
    for(;;){
6 u3 c: ^* X7 C3 W+ Y        if(istrin>>csym[2]){
1 X7 f, n, \' X. z1 D            switch(csym[2]){
* T- q- R) @- L& q6 }            case '(':$ Y+ j: Q: W/ O5 f
                if(!csym[1]){nLevel=0x100; nERR=1;}else& W* M2 Z6 n6 Y  O" G1 X
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;# A% Q, Z1 ?) M  Y; c
                else{nLevel=0x100; nERR=1;}: S. B  K; d1 O- f% a
                break;0 s! L2 f$ h# ]
            case ')':# E2 _7 e6 M; }$ V
                {nLevel = 0x100;}break;% S  _, g/ }& ^+ s7 i% h9 O
            case '+':case '-':case '*':case '/':
0 L7 p, ]) d; `! m2 Z  g                {csym[nLevel++] = csym[2];}break;
( M. R: E$ s+ o  n            case ' ':case '\r':case '\n':case '\t':continue;
1 W( s1 k5 x+ {; l' e2 H: f7 T            default:1 G7 ]; l( z) O7 M. i! L9 D# o# g
                {nLevel=0x100; nERR=1;}  S3 p' m: P" m8 ~1 S2 G1 C# W
            }
4 J- {* Y4 @6 R+ h5 U& x            if(nLevel==0x100)break;
1 r! ^* i4 f  J            if(nLevel&0x10 || istrin>>t[2]){
3 U2 x; T; R* l; U" U, W1 O6 S                nLevel &= 0xF;& @4 l& x$ M# \5 S0 G
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
# |% ]3 I; A+ X2 ~                if(csym[1]=='*'||csym[1]=='/'){
' v1 N1 B/ U# x2 \                    GetExpValue(t+1, csym[1]);! \' ]; h5 w1 b- I
                }! ]. k. p  }+ X4 g# E
                else{9 Z9 E3 F1 C% w- ?
                    GetExpValue(t, csym[0]);, N2 H# u  d. Y1 d4 n! u3 h7 P" ^
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
' @2 t# g1 S6 j( U% j                }; B+ r0 V7 T3 v9 G/ o! [5 y
                nLevel = 1;
  S7 K0 q% U  J  `0 A            }
2 G; s. y3 }; \6 f            else istrin.clear();' H$ v' z( _3 u: ?2 }1 x/ y2 B
        }- L, }/ U# w% T4 Y% S4 F  ^6 |
        else{nERR = -1; break;}
& g* d* `5 C. Q& w$ g# j! ^    }1 I2 Y2 g- q2 h8 q! d' a
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
6 |$ R' M- D5 v* J( O2 _$ h9 h    else nReturn=GetExpValue(t, csym[0]);. J( |' J& ^2 {/ D! p9 S
    return nERR==-1?1:0;
, }! }& B$ t" T: g}}8 X) G) ~* u* {2 Q- F5 v
; @' b; `, I6 \, q
/ D2 n* x: h: r2 `3 @# [

+ K4 q# ~0 r; d. Q函数模板使用示例:; f. D* ~/ ?  P# A; I8 _0 L4 O
在以上那段代码的后面加上以下代码:
8 r; C) x6 M7 J. i4 P- O  v( Q4 {; p" j3 F# {6 s6 |, ^& l) A% G  T# J
# S8 D, M( y" x
; d) X& ^; z. j# D7 p: b% E5 z
程序代码: " C" f! w7 c) [, V5 u

9 T2 x1 i( G9 v#include<strstream>
, Z! k' f- a) X5 L& U* p#include<iostream>
. Z1 S/ k, T8 M. h8 S2 ]; H#include<string>
( B" F. _- x; dusing namespace std;
# w5 B# N; n8 tint main(void)
$ L) U7 O8 s: X( d* g{1 G# U! F3 ]7 ?0 V3 z( u
    string s1;
( ^3 H- F- [& i1 H; o& |; Z    while(cin>>s1)9 ?' _5 F7 S: ~4 M7 `% m+ C
    {2 P" T$ J; M4 }3 D% k  n
        istrstream isin(s1.data());" V! T) a% A, q3 w
        double d;2 b$ G6 Q* g9 |$ B- J
        if(fy_Exp::GetExpValue(isin, d))
, |0 b" x+ Z% L, k) S6 I1 p' K; n        {% \) Z; Q  [4 {) t
            cout<<d<<endl;/ u# q  C4 ^! J. w
        }! G, _2 c9 Z' T/ J- w3 J4 E7 b5 M5 v/ {
        else
4 }6 U4 O! ^& Q3 M9 z) R        {' n4 d& c0 M1 |0 A
            cout<<"ERROR"<<endl;
' Z/ L/ |2 a- O1 e2 w$ b8 g7 A; ^        }
2 K. r- S; `* j: U* y    }2 w, B" G5 \8 {* i0 t$ X! W: X
    return 0;* f4 ^2 Y+ b' z5 I& s7 B8 C1 C
}9 t( l8 b. T' I" l4 @7 ]; M* l
5 F. D2 k! U4 R- {* a
3 z3 a" ?5 Z" m9 x' E/ u
然后编译执行就可以了(*^_^*)
  }9 d7 X. D$ {# A其它:TC++上一定编译错误,不保证在VC6上也能通过编译
5 F5 t0 M( \( \8 M; T      建议使用VC7或VC更高版本,或者使用GNU C++编译

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