返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,6 t( o" @, X& l3 p% A; I, M
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式3 s0 h5 A0 r, k8 R* M1 N
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)1 U; K3 C  ]* h% y9 p2 {* h
参数解释:
1 t: |2 I5 V; M% _# K. Bistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
; d7 d- t7 F3 m( i: LnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
* F9 b" I! M- W. h返回值:
' q8 t6 r( \0 w1 \4 E返回非0表示计算成功,0表示计算失败有错误+ |. F7 c/ F* C! j) K) a, \+ K! e
4 C3 |9 y, M+ e! P. ?/ g/ b

( K. e' ~1 I. m( d* e9 p) W7 a6 q- f3 S9 J; r+ k
程序代码:
( t2 X9 p+ f2 n# S; W5 M) K; ~3 ?" Z" c0 D3 D( @
namespace fy_Exp{
6 z' Z+ I' g& `+ h6 Jnamespace {template <class _T>/ {; ?7 g7 A4 `/ D& h
inline _T GetExpValue(_T t[], char& csym){
; J( Z3 [: P8 R- p. `7 f' h    char c=csym; csym=0;( r8 u# v4 w8 g, \
    switch(c){
& D* c/ V0 p3 T    case '+':return t[0] += t[1];
2 `# J% z) z7 Z* z4 W) {1 g    case '-':return t[0] -= t[1];$ ^0 A3 x8 E) P; E
    case '*':return t[0] *= t[1];
% A6 L: q! p6 c/ H    default: return t[0] /= t[1];//case '/':
3 c7 f+ j- A3 z2 b    }6 `! d+ [4 P# a0 D7 x7 H1 ]. s
}}) m# l4 ^6 H% F5 h
template <class _T, class _Tstream>' k2 [, r% N9 l6 }- n! a
/* _Tstream: inputstream, _T: get return value
8 L3 _" N8 }% O4 o4 M* Return nonzero if get value successfully */
# Y" E2 q1 {, d+ v" q; @& ?, Uint GetExpValue(_Tstream& istrin, _T& nReturn){, E4 `7 z) z  c, C/ ]  p
    _T t[3] = {0}; //雨中飞燕之作
1 z: o, N$ V3 s* s% c    char csym[3] = "++";
! P" n5 w* E! W) R$ q3 ~    int nLevel = 1, nERR = 0;
. a/ R. c+ j! B9 ^8 z( N# b/ R    if(!(istrin>>t[1]))istrin.clear();
, O. h/ r, p' H2 n1 \% I    for(;;){0 n( G1 b, x  \3 n6 X$ g) D
        if(istrin>>csym[2]){3 L: B& N1 q  M* U: F; L' v+ q
            switch(csym[2]){
  C, Y5 D3 }1 ~9 F; L' W            case '(':
' w/ h3 F3 N6 k* }8 m                if(!csym[1]){nLevel=0x100; nERR=1;}else0 \  ~0 t  W7 k" \  }
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
; N% M/ J( c  Q: Q+ Q* {) F  b7 A                else{nLevel=0x100; nERR=1;}/ Y' Y$ J, s  z* T
                break;
) j7 C0 D7 U' t            case ')':; g2 _  n/ `9 c8 n; H
                {nLevel = 0x100;}break;, s/ x7 O7 C# O* \& i9 m, R! l
            case '+':case '-':case '*':case '/':
0 W2 Q3 X2 [0 o8 Y5 P# o                {csym[nLevel++] = csym[2];}break;+ D. Z* ^7 _0 r
            case ' ':case '\r':case '\n':case '\t':continue;
' }+ r! O# ~4 {) b5 l9 S            default:& |: k! j) ]! E, N7 \9 r" \% y
                {nLevel=0x100; nERR=1;}% Q* N% x4 A( W# i3 v
            }
6 a' Z# y( U1 p  _7 z: I            if(nLevel==0x100)break;
, o& ^1 I: n) O1 [            if(nLevel&0x10 || istrin>>t[2]){
" T! e+ {; O* @8 H( X                nLevel &= 0xF;6 H7 C5 C0 J+ D8 d
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}& t, v+ b) _) W% s& E% `$ @* @1 M
                if(csym[1]=='*'||csym[1]=='/'){
$ y' `; P/ B+ V+ N& y( D% J                    GetExpValue(t+1, csym[1]);
7 a$ t& [" J, K% D8 T2 W* Y                }
* l$ h' A5 [; ^! q; ]' p                else{
0 L9 w; v8 ?- d) c/ W                    GetExpValue(t, csym[0]);0 w& s) o3 B; a) `
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
* `  D- E7 t0 S7 q                }
7 E2 \7 d2 l9 d1 A7 a) y8 z                nLevel = 1;
" D' `: A9 r0 `% |9 G4 j6 ?            }
6 ^7 J$ ]& k$ A2 G7 U: N% O# L( `            else istrin.clear();0 c% ?# I5 B8 Z2 v4 W- g5 R0 D
        }
+ Y% [9 f6 U& W6 I7 M        else{nERR = -1; break;}- A4 j8 A, \- f( W
    }
8 D  h4 v) o2 K& {3 y5 J    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
8 U# c* M/ \% M7 ^  h# S0 k7 ?    else nReturn=GetExpValue(t, csym[0]);
% V4 g9 }8 Y! g( y+ y( w. y    return nERR==-1?1:0;5 P4 `' [) a! `. Q: ~5 C8 L
}}
( m+ S0 Z( j  D+ i, C) M
# w& @3 x* v0 j
1 C7 f4 c' O) }3 C8 a7 i
$ ~! Y' U/ U/ ~5 \: c函数模板使用示例:
7 j, E: X3 R7 E在以上那段代码的后面加上以下代码:
' B0 s2 V0 ^( i0 B: ^8 b
5 ?7 r9 ?5 }( I( W8 r8 e
* n- Y9 {& b. O: b" B$ B9 l& z( [* A; `! p0 X1 x7 a5 H' p0 u
程序代码:
+ c# A* j( k- f2 j9 J# c
( K4 A0 G/ |5 _6 h3 ?) [$ T2 |" V#include<strstream>
" J: X, ~8 X7 p9 h" u, `#include<iostream>, X% s" B- g+ r0 w( j+ Q
#include<string>
9 S( [8 K7 d2 C. b! E+ tusing namespace std;, d+ A! y3 S% }
int main(void)5 X$ z7 q' |3 [. i8 \' t7 g' s* ~! O
{- l! I5 e7 i. G2 B# {5 h5 C4 b( g& K
    string s1;
+ a0 }7 Y1 C# G) C: G) x    while(cin>>s1)" h; g7 X% `, Y( F0 o
    {9 R3 @3 B- z7 @( W0 \
        istrstream isin(s1.data());
8 m5 D; E3 l9 g        double d;7 `: H$ }0 [& B$ B
        if(fy_Exp::GetExpValue(isin, d))4 c0 N  ?3 ~# [" y& w, L8 C2 w
        {
* q3 N* B4 }' b$ S            cout<<d<<endl;6 m4 Z/ a5 W' s9 ]8 p: H7 F& n
        }
1 t- ^" r7 s* b; Y4 ~        else
2 R0 \" I+ K0 G  |! h0 R8 k/ d6 n        {* G7 }4 {5 V7 y, i/ x
            cout<<"ERROR"<<endl;
$ T' ?- v9 D) s: X        }
6 U3 k6 D/ p( c1 R- E2 c    }+ a# l# G3 d, f' i# Z
    return 0;
( C) ^) @+ v! p. |  z' x1 `" A}  J8 g$ I# g4 w

* u) A& z- L  [1 Y0 k: R7 `% i& W' b) a# M: u
然后编译执行就可以了(*^_^*); K* x! I; W  @
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
4 \' t! z  \/ _: j8 |      建议使用VC7或VC更高版本,或者使用GNU C++编译

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