返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,% K, p6 v# m9 H  y: `
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
! p: @# f7 [/ G' a4 Q只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
! Q- v9 }3 l2 R) m0 @参数解释:
+ N3 Y* u* }# Q9 B: fistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
1 h0 f& C# \- M4 R5 TnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" i$ {4 T3 r- f9 d) _$ r
返回值:1 b6 G0 i& D* E: K" w/ O/ D1 K- E7 L
返回非0表示计算成功,0表示计算失败有错误
3 f6 L% H0 l5 O# L( ?! i- g) b4 F7 t7 w+ }) d
) ]; |1 J+ b$ Z2 w
* E+ `9 U& y  g7 S
程序代码:
. L; ]  I* R! Q$ S1 v" S
% R. B1 L  S" A7 j+ Qnamespace fy_Exp{% H, a+ b" }0 q
namespace {template <class _T>
3 W9 ?: u2 j8 b: h6 m4 d+ Y7 Xinline _T GetExpValue(_T t[], char& csym){4 a) I$ h6 K/ F0 y- n5 k1 k
    char c=csym; csym=0;
2 {- A& ~1 n0 V    switch(c){0 `( S. k  [' z% z$ q& Y9 u
    case '+':return t[0] += t[1];$ H6 w3 ?" o, x; P: @. p2 l
    case '-':return t[0] -= t[1];" X: U# ]' i* U$ l! b. n4 f2 x
    case '*':return t[0] *= t[1];  S, D: e; M  h! c
    default: return t[0] /= t[1];//case '/':
  _. i4 _. d  ^; L& r% w3 ^& t    }* y0 H& V: b1 b
}}- Q5 w" q7 Z* A/ E- ^# c  \2 f+ E+ F
template <class _T, class _Tstream>; e' ]8 n+ w6 _* w  Y" J: D
/* _Tstream: inputstream, _T: get return value
: N: P! g7 _4 @1 ]* k8 e* Return nonzero if get value successfully */
0 Y& ^* w9 A+ M; F7 f: _0 h# i3 uint GetExpValue(_Tstream& istrin, _T& nReturn){) p/ t/ p* e1 |1 E3 F' h! H0 {
    _T t[3] = {0}; //雨中飞燕之作5 h( F$ |; [2 o+ w
    char csym[3] = "++";
/ `& i9 S9 ~9 J( X    int nLevel = 1, nERR = 0;+ C* R# Z, K) _
    if(!(istrin>>t[1]))istrin.clear();, F+ L& J2 k) k5 ~: j
    for(;;){
, t2 ]5 f$ b; g- s+ N        if(istrin>>csym[2]){
2 j* d, H: _9 n" `& s6 r( d            switch(csym[2]){+ E$ d. ~# G4 B
            case '(':
4 K/ j% j, S( ^2 Y. |: L                if(!csym[1]){nLevel=0x100; nERR=1;}else6 i, D. h- Q( |( g8 d: p7 w% U- |
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
, j' [+ \7 R% c. h. A# V! b                else{nLevel=0x100; nERR=1;}
* p9 D1 d: ]$ Z) p  O# m                break;" w/ K. {6 I% N# ]
            case ')':
( F# F# Y; W! W- U! P3 w                {nLevel = 0x100;}break;
% k0 |0 p" S2 L  }/ R* \            case '+':case '-':case '*':case '/':
8 v4 f+ J( p4 y5 m, f                {csym[nLevel++] = csym[2];}break;
( K3 P9 ]0 z8 R$ H. E$ N: W            case ' ':case '\r':case '\n':case '\t':continue;
7 r2 \+ P) G4 s) y' V            default:
# D" I! u2 r; w" c, i                {nLevel=0x100; nERR=1;}
+ l, I8 x' f1 C" \. M            }
# r  J' {% Z5 x  r4 D            if(nLevel==0x100)break;
/ x# F- ?& e  q  O! }            if(nLevel&0x10 || istrin>>t[2]){7 s' h! ?, k2 B9 ~5 j7 n2 |
                nLevel &= 0xF;
$ E2 O9 ]1 K* L                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}7 {9 F9 E4 I( I: k# h) K
                if(csym[1]=='*'||csym[1]=='/'){  f  Q. A* G* E4 q9 X: O
                    GetExpValue(t+1, csym[1]);
2 f- s* V8 G1 o                }
# {* r0 Z2 p1 V, y' W/ c5 X                else{% q4 u1 b/ D; E. b! Q& d+ ?
                    GetExpValue(t, csym[0]);0 C. I) z" @. \6 `) L5 |4 H9 P& ]
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
+ X) T+ ]" F' ^7 d+ z' m" G7 }                }- k" G1 H; z; J# ~
                nLevel = 1;: p+ c  z/ a1 {& o. E
            }$ O, r& e- p: k! d# E' ~, I
            else istrin.clear();
9 H  S$ i1 Y* o( L; T3 U2 d        }
& A4 t$ ^1 J" B' N1 V. s! y2 x* ^        else{nERR = -1; break;}* R' y+ M, H& _/ n
    }
- r* ?% z$ B% j( E    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);) l$ c9 z+ }! Q' p
    else nReturn=GetExpValue(t, csym[0]);
; }3 z4 a1 L& N8 g0 o1 C8 T    return nERR==-1?1:0;. n  Z# r: E, R% h
}}! {. P0 D; g2 p1 x
' d7 t; G# v7 Q3 d6 {) M

' x# O& g+ \; l; u! }3 p+ V
, _4 k9 m; B+ b3 B* U0 z/ ^函数模板使用示例:
/ K! d  @/ _& W* F$ K7 n1 {# n" j在以上那段代码的后面加上以下代码:
! N+ l5 b8 g% z9 U
3 B: \. S: N0 k# z
( ?4 w" ^# S! }. {
9 \4 D- b5 ^4 G程序代码: , N5 j' s' I2 y) w1 F0 a4 e/ b0 C
; e  d( z6 n8 b- f
#include<strstream>) G1 t3 }( F" T
#include<iostream>
* m5 d+ k& V; g" n; k4 l#include<string>
, Y6 K6 R+ {  T& K4 d( }4 Z; @using namespace std;
( M9 B5 u8 x9 Y5 G! N+ X4 kint main(void)
6 [* c+ b9 b( S; y{
, h. @7 v6 C, I/ l9 B    string s1;
: \* X- T' K! I1 y  a, V    while(cin>>s1)
2 m3 p" o6 H2 q8 W' X1 R/ j. ]" A    {
( ?8 e5 N5 N+ k9 A) V7 ?        istrstream isin(s1.data());
! s$ _7 K7 O- H9 n/ ~        double d;
* @: f/ y  ]& ~* J, `        if(fy_Exp::GetExpValue(isin, d)). G+ E2 [$ m1 L; O" J6 ?! G
        {
; [- D2 l" v) i, t3 U* j, |+ V            cout<<d<<endl;5 C4 ~& A3 f4 a2 s) s5 V2 p9 v
        }' i8 V, }8 w) |3 E
        else; L! C7 j1 n- L
        {9 y( W* ?& i3 A: e* h& |
            cout<<"ERROR"<<endl;/ _5 }+ f% v* L$ p/ ~" R
        }
$ F% a! [1 i" h, A    }
" q+ d: b2 ]% e, f' j1 l2 i    return 0;! J% T- o) H$ @1 p2 Z  S
}( f# h! t( @1 d. X+ N8 u0 p
( M( \" a) \1 `$ v3 U0 z: G! v8 q
1 D9 k& w: d9 K7 ]+ C7 \# M+ B& }
然后编译执行就可以了(*^_^*): `& W7 U+ W6 ?2 Z5 L0 N5 _- N
其它:TC++上一定编译错误,不保证在VC6上也能通过编译7 w4 I! J( ^/ |- E+ z
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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