返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,$ Y8 Z% A: t" y/ q5 y/ u
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
( |! @2 {3 Q% _$ L6 F只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
7 L& s8 Z2 i" p4 ?* \: K参数解释:
, {4 b3 p  |' B) B9 a$ \2 _istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流" u+ {. R6 v: n+ P, G  d
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
: h9 {* u& ^4 J; D  a! \) Y; }3 e返回值:4 u, u0 z( |7 Y( O( d
返回非0表示计算成功,0表示计算失败有错误8 ^- B( P' f4 X( `

  G" H9 X5 |1 Y. e, B5 X
: I) d2 M: Y( _) B7 M7 q
# v6 w; U/ H* F5 [; E/ M程序代码: : ~% x# T& B/ f: c6 c6 `0 x
, f( t" E% \( T+ i
namespace fy_Exp{  M# i( j  x! C$ L7 M
namespace {template <class _T>
: q% b1 f9 Y0 [, q% s2 `inline _T GetExpValue(_T t[], char& csym){& |0 }" }% b' K% E
    char c=csym; csym=0;
# z3 V' I" M  [5 q% f% F+ E    switch(c){
+ H/ I5 {2 b5 y: _: U    case '+':return t[0] += t[1];
# o4 h+ z2 }- ^    case '-':return t[0] -= t[1];' I$ v4 |, X" Y+ Y
    case '*':return t[0] *= t[1];; ]0 }" U; `( f+ a+ r
    default: return t[0] /= t[1];//case '/':# K* g% ^' I; x. T- m, Z- {! b8 X
    }
( f. j9 t! k# a" t9 P& Z1 D}}% v$ x# A  I% d) C
template <class _T, class _Tstream>$ e+ `$ \/ Q* K& {0 [9 q8 S$ e
/* _Tstream: inputstream, _T: get return value2 t6 Q6 A) x7 _, f% r4 P
* Return nonzero if get value successfully */
2 h1 F. V9 k% q3 Wint GetExpValue(_Tstream& istrin, _T& nReturn){
( j1 A6 V* I. {* T  M0 d    _T t[3] = {0}; //雨中飞燕之作3 ^5 X1 k' O2 L- c" D0 ?0 R- {
    char csym[3] = "++";
" K2 t1 ?( B5 H+ l2 l$ z+ J0 P    int nLevel = 1, nERR = 0;( F: E2 z4 ^2 p6 _5 ]/ u4 t! M& _
    if(!(istrin>>t[1]))istrin.clear();  R2 _& Z: I+ k; |1 g  ?
    for(;;){$ p5 J; t' u7 ?4 b+ [7 J
        if(istrin>>csym[2]){# }+ m% H( b0 u) c6 n% }1 T- U
            switch(csym[2]){
5 u9 k# C1 J3 W7 H8 N; U7 w            case '(':8 Y: _: g9 t! j" U  `4 w7 m
                if(!csym[1]){nLevel=0x100; nERR=1;}else5 n6 b2 Y( r. k" W# O# @( t
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
0 r8 r/ R9 y7 w6 y                else{nLevel=0x100; nERR=1;}
9 q& T* \$ @7 M" J! ]( ^5 H/ [& k                break;$ }+ }. T, V0 v
            case ')':, T0 C5 R+ V# s' R* \1 T# p) r
                {nLevel = 0x100;}break;
* t/ f* V0 M8 j# S2 T            case '+':case '-':case '*':case '/':
+ [9 g9 v( B5 E0 p+ u: Q8 n' [; B- d                {csym[nLevel++] = csym[2];}break;
! P' N; F& L3 U' D7 V# A7 W            case ' ':case '\r':case '\n':case '\t':continue;
1 B' E, H0 d1 T# R* G' ?: n            default:% I, B% b: A0 Q" b
                {nLevel=0x100; nERR=1;}
" }. X# p! _( R' T& O            }
. n, o$ V& |. O! W, S0 i6 O) D            if(nLevel==0x100)break;
2 h, Z: M2 v8 b1 C9 d. t            if(nLevel&0x10 || istrin>>t[2]){
" J( K1 [$ z8 y! ^                nLevel &= 0xF;* I5 i) Y, b' I! H: P/ C
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
$ T) ~! t2 g6 _& w7 Q                if(csym[1]=='*'||csym[1]=='/'){) N  W4 ?& X$ P. K' [$ G3 r( Q9 o
                    GetExpValue(t+1, csym[1]);  ~; n. a$ |6 f: b8 x% n9 a
                }
/ O2 `6 t2 w0 q" J, b( F                else{
7 j4 P' F1 H; Z8 k6 X) E* T* `                    GetExpValue(t, csym[0]);
5 s$ p  I: r+ \0 g3 @                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;+ V! L+ J* ]5 h: W5 [# l) v
                }( I- p) b* Q7 m+ H- u5 u) z0 R" B
                nLevel = 1;
$ q& M/ B& d6 Y2 f9 D' l) o& _! b2 j            }
4 g- F  Y, F3 `            else istrin.clear();
+ B9 |+ [8 E: ?% W! ?! ^- d        }
' H) ?) {/ u( }  o        else{nERR = -1; break;}$ v" d9 M7 G3 Z" ~5 i
    }# F- t# ^  M2 x' `# p3 i4 ^5 X! l# r
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
# B+ T3 s+ Q7 r6 P7 ~: ~    else nReturn=GetExpValue(t, csym[0]);
. B& A; a& B) |/ d# |, @# W    return nERR==-1?1:0;9 @; H) a3 b0 ^& u' ^) \
}}
* w+ O, M6 t$ |1 B( X2 z4 z4 P& O4 k% q# {( Z  C$ j& b8 H' ]5 |

3 \1 V1 K; C$ @  u, _: v
! J0 t+ h9 t; B& j* \  ?) A函数模板使用示例:, h. k- {( f2 x8 l/ i0 W; S& ?
在以上那段代码的后面加上以下代码:
2 A  Y: ~% @. S1 ~, o
$ k- L% b# N& ?4 C7 U1 r " I7 R' ~& Q: ^. L' z5 K' P
' c9 o0 H3 v/ ?. t  y) O9 ^
程序代码:
% v" q" C$ q; h
7 X# W$ @# i/ Z; {9 d) w# ]" K: D#include<strstream>. A7 B% I8 Z% }* c( r, m
#include<iostream>
5 W  y) `& J$ I  F  y2 V, w#include<string>
# I, L* L# I; p# \, a2 s- K: musing namespace std;
# R2 x+ g! N$ I0 dint main(void)8 _- X8 N' y6 c2 B# q7 m2 e9 M
{, L$ ?# i; y$ r& b0 H1 T  z+ F- A# j
    string s1;
) F/ @, m" }0 S    while(cin>>s1)
5 a) S: o/ `7 Y6 ~6 x% j    {4 Q0 ?0 [0 @8 b: d3 P# V
        istrstream isin(s1.data());" B7 V7 A  l3 M6 V+ w
        double d;
' B6 j. a8 T# d6 B& H        if(fy_Exp::GetExpValue(isin, d))
) k+ U% P# C3 M# i        {
# H% H- H* ^3 W            cout<<d<<endl;
4 }; e% p/ z3 }' q        }2 p5 S: J2 k' h6 ?/ r: K# d
        else
+ R: x, b, C+ ^! i8 s  k        {3 ~* \7 X5 u# x- [1 S
            cout<<"ERROR"<<endl;
( m! B% b5 z& I        }
6 i" x4 R* r) n+ p$ y' X    }
) M5 I& B2 f2 m    return 0;
: m3 H6 h- d- J0 D3 ^}! z( g8 Y5 q6 h! M9 t; O9 E

6 G1 H* ?+ a  }* U" `0 [. S& m" s' \8 e* B! e" W2 I
然后编译执行就可以了(*^_^*)9 E2 i0 `4 m& c
其它:TC++上一定编译错误,不保证在VC6上也能通过编译! f4 Z  U( x3 v8 }  `, \2 A* \
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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