返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,0 U) k  t  {, ~, g
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
% l" k+ f# H9 _& q, H只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
7 R+ p1 ^" l& y* \参数解释:
# [1 ?9 P9 @7 _istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
+ |8 t: X& K- K3 }nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定' G" u% H4 [; a) k9 l! |
返回值:
  S+ G1 g" \/ B7 [) f. I5 O# ~返回非0表示计算成功,0表示计算失败有错误
' [+ i: a' n" E, D( `( w5 C# b9 F1 I+ C, e/ A
5 v( c2 K3 X9 T4 F
/ J8 g7 V5 Q5 ^4 q0 [4 l0 z
程序代码: + ?9 x$ O% U2 d

: n7 ~6 h& w2 p, B8 ]0 Q3 znamespace fy_Exp{
+ [: Z' E1 \; V8 pnamespace {template <class _T>9 u5 f& L; ^+ O8 p
inline _T GetExpValue(_T t[], char& csym){6 K. \' G. E% w; e6 P
    char c=csym; csym=0;
3 ^# M, I$ t& D. e3 o4 ?& P* T    switch(c){
- m7 X( W$ l0 p/ J+ N    case '+':return t[0] += t[1];
% t3 _& P- P1 X3 j" Z. M    case '-':return t[0] -= t[1];& z1 Q3 ]7 R: J9 b, v- Q
    case '*':return t[0] *= t[1];
3 E$ [+ t, C8 \; r    default: return t[0] /= t[1];//case '/':8 ?: v. N! O( h( O% V
    }, ^1 x0 `  C! ]8 h6 a$ Z2 e  u
}}
2 U9 f( }2 _2 L% f1 Xtemplate <class _T, class _Tstream>
4 x) Q6 D9 q( V4 Q% w/* _Tstream: inputstream, _T: get return value
6 u3 a/ s3 j  b* ]6 q) n* Return nonzero if get value successfully */2 Y/ j# b( d& H; `- B
int GetExpValue(_Tstream& istrin, _T& nReturn){
1 A7 ]0 n- x6 U: m* y    _T t[3] = {0}; //雨中飞燕之作8 v9 [; S$ N+ [3 C
    char csym[3] = "++";
" i& ^. e& v- {9 T6 H; n$ T+ C* d7 v    int nLevel = 1, nERR = 0;& ~! H, v8 R" ~1 b4 Y1 A- R5 Z
    if(!(istrin>>t[1]))istrin.clear();8 P5 y% q2 ?* x+ n2 V8 I
    for(;;){& ~# M! [+ _! ~0 B' M
        if(istrin>>csym[2]){
7 q4 y3 s! J& f& w            switch(csym[2]){
$ F4 m& `0 q/ a+ ^! x2 z* R            case '(':* a. x: S! ?' p5 L, w! q
                if(!csym[1]){nLevel=0x100; nERR=1;}else3 ]  t3 L7 B5 w& B& T0 e, E, T
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;4 q: p$ ]. ~' K. N0 w$ `
                else{nLevel=0x100; nERR=1;}
) r9 f' [6 g, y                break;
% m" B, ?2 |$ L& i            case ')':7 E4 L3 Z" k4 ]( C& a
                {nLevel = 0x100;}break;, g3 }, L' J# O; w( A# P1 n2 Q6 K
            case '+':case '-':case '*':case '/':
+ a/ \: b9 m* R- k! H( T                {csym[nLevel++] = csym[2];}break;  D5 S: @: O. [
            case ' ':case '\r':case '\n':case '\t':continue;. w$ |, H2 W2 L3 \
            default:9 W( F& S1 u% z+ S
                {nLevel=0x100; nERR=1;}
" o! E4 M* a6 l8 x0 }            }
7 o4 u  Q+ w# C2 _0 p            if(nLevel==0x100)break;
; ?+ T& z+ e* W1 [            if(nLevel&0x10 || istrin>>t[2]){
! S1 k+ U) V; C0 S+ E" w3 J% e) _                nLevel &= 0xF;1 f) u- P* M7 x4 ?" ^( ^8 w
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}& {1 f6 |% \" A0 t+ P" W7 U& E
                if(csym[1]=='*'||csym[1]=='/'){1 K& ?: l6 F( _7 ~
                    GetExpValue(t+1, csym[1]);3 s9 \. A& L" p2 f5 Z- o
                }. h# T) i& [$ [8 R" ^. N6 t9 f
                else{0 e$ H5 H9 Y% N5 \
                    GetExpValue(t, csym[0]);, f. W& `1 Q& ?$ e, b9 T$ M
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
4 [" o1 N) {# V+ E& }/ b                }. \2 u' I  x/ g& B8 ?4 G
                nLevel = 1;
# J3 L' O9 M( F            }6 z, t+ y( ]6 i: A; d9 ~
            else istrin.clear();
& K( p# F7 s1 A; R$ s        }
7 d+ h' u* A; ]% H) W        else{nERR = -1; break;}$ {8 E+ S6 X: Z
    }% X5 y: _( k5 M# F# z2 c$ L/ c
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);8 G0 d/ ^( h$ J  J' s1 J; ?+ O6 y
    else nReturn=GetExpValue(t, csym[0]);; {, _, V& j3 B+ r* f0 K' N
    return nERR==-1?1:0;
% v- y/ o3 Y+ T3 I6 g- |}}
# C- f) m6 @  y7 D9 t3 f
: b) ]$ u1 K! x! N, {3 b* ]8 S5 t7 L4 {) ~. m: s) C% t8 ^7 k

4 R4 e, t& e3 h$ l! C3 `函数模板使用示例:1 f( f$ _# E5 ?0 k# b+ c
在以上那段代码的后面加上以下代码:
# D  i( N; b' Z: m) W2 ]' [9 \
% {$ t6 _; }8 v" h! O
! s: P# P- m, |$ x8 D8 L( G. D' v- l- l5 I; Q$ u! h  z
程序代码:
* g- ~& u6 [8 e( f% J( u: {# E5 f) ?) x
; L/ H4 h+ g1 ?' R9 I! x#include<strstream>& Z% O6 z. F( P& G
#include<iostream>9 i( i+ ]& A0 g
#include<string>* c4 Q# d7 v: W& Q
using namespace std;
- l7 \. b0 b3 X0 Zint main(void)$ Z, U9 U& f; k9 K3 C
{
3 M/ Z  u, F! B: Y) ?    string s1;
. F: f) C1 Q2 q! c* G3 k/ H    while(cin>>s1)0 ^  Y9 F4 m% \% G! V5 W, q3 O" a
    {
7 N0 I# c- [  R5 |" x3 s        istrstream isin(s1.data());
7 o+ |8 s3 G' L- u  r: O        double d;
4 v" X0 R: q' r        if(fy_Exp::GetExpValue(isin, d))- c, c2 g+ a- Q0 J$ ]' `
        {
% B' i/ W# b3 s! n# H5 T            cout<<d<<endl;. k! Y  M! k$ c# ^( Q6 l
        }- w0 E0 ]; A# o1 j: s" o
        else/ m' ^+ h- f5 F3 l/ t( E% K7 n
        {
* X, Q% |+ K8 \5 m/ f8 w! a- Q            cout<<"ERROR"<<endl;# H0 F1 |& Z) d+ g, K! {# u
        }
5 o+ m3 l6 ^# L# |8 h& l  S    }
- A3 r, Q& u1 l1 I( i    return 0;  u* e8 H7 O: L. U. W: k* H+ \0 o
}
$ l7 O6 y1 O6 c5 `; [! Q, g# B/ K! t% W) v4 ~
) [( `; E/ ~2 }  Y, R# Y  O3 B
然后编译执行就可以了(*^_^*)
( _( O& F& ]5 z4 ~+ S其它:TC++上一定编译错误,不保证在VC6上也能通过编译: l) U! B' `% ?7 }) a6 i  Q
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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