返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
; i$ s3 `& s! e+ `1 X8 \一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
! U- |% ~$ k: i5 b' X只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)5 O$ y+ _7 T/ P  k1 c# N
参数解释:
$ T6 j- O: p2 f6 p4 d$ z/ Distrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流0 _. @5 C0 @0 S4 f! w7 T
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
$ T  v( _0 q% R1 n返回值:! M2 x5 C4 A# u5 ~
返回非0表示计算成功,0表示计算失败有错误
6 J4 m% W+ Q) W) D% j# K, E8 L
3 l& W" B" k2 [& m
8 m# D$ g5 h; ~  w+ N. t( x  c! z# ?' `& q
程序代码: " ?# ?) W- B- W0 A& t* Y
, S9 d7 {# a" z: H9 j7 y1 R0 L
namespace fy_Exp{/ d% J; ~+ P$ K; V
namespace {template <class _T>) p' Y( e$ P0 r# N  {' _8 V( U) e
inline _T GetExpValue(_T t[], char& csym){3 K8 q6 y; Z9 W+ z, M
    char c=csym; csym=0;" U* _5 W; Y' h  B$ E
    switch(c){, k2 w) h; k3 v, T" ]3 [
    case '+':return t[0] += t[1];
- U% z3 D% z2 a8 J7 p8 N6 b1 n    case '-':return t[0] -= t[1];
* \- n3 S4 b# Z    case '*':return t[0] *= t[1];
% d; f6 h7 p7 ?" z* |; w    default: return t[0] /= t[1];//case '/':
* x' h0 j. l5 m( O, f    }4 w  x# B4 r2 x; q! n& ^% I6 ?" }
}}
* B; }6 ^% C9 k7 s+ Wtemplate <class _T, class _Tstream>
, E0 T/ j: Y0 c$ x3 Z8 A5 N/* _Tstream: inputstream, _T: get return value% z1 ?5 l1 |* n. _
* Return nonzero if get value successfully */: S# y) a5 _& S7 ?
int GetExpValue(_Tstream& istrin, _T& nReturn){
( U( ]( p0 J0 u1 x( n. H    _T t[3] = {0}; //雨中飞燕之作/ R- R  I# K8 }1 x
    char csym[3] = "++";
4 ?! g6 E- v1 a7 T    int nLevel = 1, nERR = 0;8 `; H) k* i, `. B. W4 G4 t, q
    if(!(istrin>>t[1]))istrin.clear();
( j2 |8 p- S# L2 [' _' r( n& m; a" B  |    for(;;){* {* A& m: N+ Z/ b: P
        if(istrin>>csym[2]){
7 Y6 N# _  ?. O* c- y3 [% G( `            switch(csym[2]){
$ s3 _+ Q# v/ l0 X. _            case '(':
3 q$ G* ]7 q; L' A! s2 E                if(!csym[1]){nLevel=0x100; nERR=1;}else& d$ t- `, u3 p1 D$ Q
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
: }+ h' z4 Z  q* m/ U                else{nLevel=0x100; nERR=1;}& I  t% _: t- N0 x4 u
                break;
& j+ G& e6 p4 y% O% x" v            case ')':) @! {7 ]2 }2 V9 T4 l4 w/ U/ }
                {nLevel = 0x100;}break;
$ m) v& ~# C0 {9 M7 H* l4 d# d            case '+':case '-':case '*':case '/':, o/ n  O0 H0 \
                {csym[nLevel++] = csym[2];}break;
" f7 y9 d) E! q/ D            case ' ':case '\r':case '\n':case '\t':continue;
& W# t. X: G9 A) k8 [* Z            default:% |; d& Q& u+ {! _$ O& O
                {nLevel=0x100; nERR=1;}) x" J  l* i) L7 L2 V' F, D$ ?
            }
1 }" a8 l& D! }            if(nLevel==0x100)break;) g0 L8 z3 g. h2 p
            if(nLevel&0x10 || istrin>>t[2]){% b+ O8 b6 T2 h) e
                nLevel &= 0xF;; O( E$ s4 s" y+ x* D4 U
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}- n) c% E  a8 }% J/ T4 ?
                if(csym[1]=='*'||csym[1]=='/'){
: c$ T3 R3 `9 R                    GetExpValue(t+1, csym[1]);# o9 X7 O. t9 a
                }
6 G3 Y0 E7 j6 ^, R+ s                else{
3 V* S8 p; T8 o" N; j: }8 {                    GetExpValue(t, csym[0]);
1 x# ?, v3 r, S  S8 Y, S, E7 k                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
  \2 ^! v" k- x4 z8 @( [6 o+ Z                }
. R6 i: k6 o2 I3 {# p% Q7 J" [                nLevel = 1;
; v0 P+ V6 ~$ S# @2 s: C            }
9 F  s& n+ r3 \: u            else istrin.clear();
0 m* d; F8 U) L9 Y1 o! D: S        }5 z5 \0 H0 i% |' o" w3 |
        else{nERR = -1; break;}
7 T8 U3 ?2 a, \! z    }$ u" }- o) z% V# a' e1 @
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
' t4 j7 g( f4 H& A: o    else nReturn=GetExpValue(t, csym[0]);
: f& M/ _8 u, W+ f7 `" q# T    return nERR==-1?1:0;- y/ `  z$ R# ~" i2 @7 G
}}
, Q( i, f& ]' Q6 I
' E9 ~' _" |7 ?9 U# F; j+ `& E: e7 P7 z' d( n! f# o& A% N+ K

9 O6 |* H% U% @. F: n* c函数模板使用示例:) T+ p& m( x) j4 _
在以上那段代码的后面加上以下代码:
9 B. I; _/ K% W6 g
/ L! t5 @) k$ @ 3 _; t4 w+ b1 G& {* b# F6 Z

$ s, ^1 d" z+ x5 N, s程序代码: * i% n; o: e4 e1 D$ J1 x) D9 ?
6 z9 C$ K( ]1 e* d8 P
#include<strstream>3 e* h; U% {, u0 O
#include<iostream>
# J9 [6 C- D% z) P# @#include<string>$ A8 ?* b. t, |" v5 z
using namespace std;: ]7 T/ n6 W0 N
int main(void)2 U6 x: [! [- V
{
/ T. K. q2 v# B8 i" S0 t    string s1;
+ l$ y" |# _$ a0 R. `& U    while(cin>>s1)
" j" ]9 B* u9 Z) c    {
. J  J5 t* {' F! `        istrstream isin(s1.data());
. ^/ D" |* G+ U6 A        double d;7 j% p- J) i* {/ U5 T
        if(fy_Exp::GetExpValue(isin, d))
  _  _: K% ^0 E0 z! k5 S3 X        {
! @' ?( m/ C- L            cout<<d<<endl;' q; E( O) _2 ]8 v  Q$ D. o4 P
        }
6 }: w- U0 F/ c/ m4 ~        else: R5 K. n; J3 e, I
        {
" m! u# m( K, c: T  k0 O/ o* H            cout<<"ERROR"<<endl;. ?' t  }4 u" x8 G. T( t. U
        }
( X* x6 x3 \  l' H3 y' w6 a9 P    }( f) b# v, \& N* w, D1 i& T
    return 0;/ I! F7 w$ b: Q# o0 H/ s
}' B; Q5 R9 l/ v5 f  L" ^4 @$ x0 n

* E& J. ?1 v6 D' ]/ ~- J0 B% @5 l% }: a7 z; R4 Z3 [
然后编译执行就可以了(*^_^*)
9 `( \1 O, {$ n其它:TC++上一定编译错误,不保证在VC6上也能通过编译; _& C$ Q9 X. n/ M" [/ D0 l
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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