返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
5 f9 n, |# J; i" ], o一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
8 K$ B: Z4 e( V% p只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
3 w1 p3 `" ?& F  q& H4 Y参数解释:% A+ k6 C2 |! D7 O
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% D  H: n+ U# [( m" A& f
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定: e9 }& r- g  {' g* q. t3 t! k
返回值:
. B- R9 [# c: t1 ^- j, b  B返回非0表示计算成功,0表示计算失败有错误
- M+ A: e, N+ `) a( \6 s3 i9 y5 l4 @# o0 V3 p/ d- C! o/ W# b
0 X% ^- v% L! h, J

4 M% E. s% K( K) c6 ]" N程序代码:
3 \1 J: B) l7 F1 V* W  O+ j1 a8 n8 k- N- z! N5 L! _
namespace fy_Exp{. G1 H- X0 c* a/ o+ P7 H! C# s1 a
namespace {template <class _T>
1 a% h6 o& n7 \  K2 V: v! Ninline _T GetExpValue(_T t[], char& csym){
8 m2 E4 w' u: x* g5 z8 b    char c=csym; csym=0;
2 K: }% E; Y, I0 ~/ t! S! |4 }    switch(c){
: T% v" j* [) z% @    case '+':return t[0] += t[1];
( @  U$ }/ c, N& }1 M3 L$ @    case '-':return t[0] -= t[1];
; P  x# Y) `. D8 H! @0 s) {; c    case '*':return t[0] *= t[1];* r7 {0 r* Z- u7 W5 ]$ h& Q% Z
    default: return t[0] /= t[1];//case '/':
% V3 Z( X! G# ?2 D' j7 X    }. ?/ d% a. O3 A& G) j& M' x. f
}}
7 t$ K; d2 U% d! L. K- n& `2 o' etemplate <class _T, class _Tstream>
! v, p0 u/ s7 P+ r/* _Tstream: inputstream, _T: get return value1 p" ?# O8 v' G. a
* Return nonzero if get value successfully */
% W6 s5 N" z* c; j+ gint GetExpValue(_Tstream& istrin, _T& nReturn){: _3 ~) c) j* k
    _T t[3] = {0}; //雨中飞燕之作
) \& k5 {2 j+ v: `    char csym[3] = "++";$ f9 n0 ~7 v6 I8 k9 |2 m
    int nLevel = 1, nERR = 0;
- ^' }& W* p, s- B, u" {9 K8 h3 W    if(!(istrin>>t[1]))istrin.clear();
6 F* S3 F9 E* s2 T' ^    for(;;){
  B9 a  o9 l/ L* y$ _' @        if(istrin>>csym[2]){% Y, q3 ^$ Q3 U, {
            switch(csym[2]){
, ]) D7 X3 V' S. W$ n" u            case '(':+ u1 c5 b; A4 o6 P
                if(!csym[1]){nLevel=0x100; nERR=1;}else
1 O+ H$ k; Z+ [3 G# S! O( x                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;+ I# ~; x" i7 v' {- ^! w
                else{nLevel=0x100; nERR=1;}# Z* I5 R2 @# n
                break;
9 ]6 l$ @6 W' y! y            case ')':
% E5 Y$ i% F* b. }4 L) P! F! _  ^' W                {nLevel = 0x100;}break;
7 I, j* b: }+ ?8 P. T            case '+':case '-':case '*':case '/':% i+ s& z) ?4 B1 Z. \
                {csym[nLevel++] = csym[2];}break;
) C' G1 N9 N9 a% Y- w8 D: Y            case ' ':case '\r':case '\n':case '\t':continue;: e, a- U2 [: r; f4 b3 v$ S
            default:
( W) p) l# ]- U( V: P5 O7 q                {nLevel=0x100; nERR=1;}
' `* v8 k/ D4 G0 r            }" k3 D" m7 p' l. y& y( W- _+ }; s! g
            if(nLevel==0x100)break;/ f% l$ q* a& x; g. `, t
            if(nLevel&0x10 || istrin>>t[2]){+ X( q8 j: @/ Z6 T) l5 K$ E' e
                nLevel &= 0xF;# c+ Q( O' \+ m5 Y: t2 Y- Q
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
$ [6 a5 q4 D/ `- f/ I; D% h; d                if(csym[1]=='*'||csym[1]=='/'){
( v. f# c7 f5 B5 _                    GetExpValue(t+1, csym[1]);& u* i! q( X; [( K0 y$ [: Q
                }* t1 s: \$ M& q7 g0 l! V
                else{
  y; ^7 I5 G3 x                    GetExpValue(t, csym[0]);
, R5 O& a, l9 }! Y( h8 D* c                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
7 g3 Y  N* r6 h  X8 Z: r8 z$ m0 X                }
& K9 w! c' V7 u- W6 v, `                nLevel = 1;0 m  Z4 p6 ~) R/ V0 j% R
            }
- Y  T& \0 j8 @9 p2 m$ U            else istrin.clear();
! }* X- |. j! V" _. f        }- z" y* ?* Y' R2 B  y+ `( z0 ^6 W
        else{nERR = -1; break;}
7 V8 W8 }) N! @. @- f6 P  y    }
8 }9 e) _1 W5 C) P/ t; m, i    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);1 E* m0 I; `0 h8 B* Q4 }& m( u9 T
    else nReturn=GetExpValue(t, csym[0]);
  Z0 p! T/ W$ U/ U    return nERR==-1?1:0;
4 R, s; o7 W: B* N" _! D6 q6 d}}" P  R2 }) `3 G) F' V

2 L; j' G7 `& U+ x8 V2 c
) Y0 W0 f  i3 J$ G- W/ v, U8 i8 H0 T0 `
函数模板使用示例:; C) D. R- U) a: @, l3 ?( v
在以上那段代码的后面加上以下代码:
9 |4 F, K/ _4 L2 @
2 I% y1 O9 d/ b( s! Y" Y. u
9 q1 ^! a2 W# O0 U+ e& W) u5 @
5 \9 H* q  {+ @* z程序代码:
, G# Z4 p" X, ?% k8 p9 f! a1 X( N
#include<strstream>9 T4 D# ^* n5 y7 e
#include<iostream>) e1 t2 q: q: w9 v7 x( |
#include<string>3 I" R' L5 F, r, N  r% z
using namespace std;
' u$ Q" U, d6 Y; K& z( Gint main(void)# w# x3 T% ~% |# m0 q/ U
{! _, d" b2 |9 K9 {( s( i0 J( L
    string s1;- U3 ?& K5 R- c/ Z; g+ G
    while(cin>>s1)! j3 `% f/ j4 d) t
    {
# U* F+ p2 `, u4 C; u9 h  [        istrstream isin(s1.data());
3 z2 D4 X. [% @) o7 _        double d;/ X/ I9 l7 W6 c- Q
        if(fy_Exp::GetExpValue(isin, d))
; _6 @5 k) _2 V3 P! t        {
, \' Y! i' x2 o9 Q+ q            cout<<d<<endl;8 O- S# |2 P4 l8 Q  w8 v
        }( d' E* `' r+ P$ G. O) |0 A6 E
        else5 Y) n. L% B& Z
        {* J4 g. D7 F, D- e# I: d5 I
            cout<<"ERROR"<<endl;
0 S1 l) T* p* O* M+ s        }- T  R1 G  x2 |- _8 R. \8 v
    }
4 j% j: W% G% {2 X/ k; I    return 0;/ L4 r: y* t) S+ z0 T4 u/ L
}
* q4 D# s/ m+ q5 Q, K  D2 n% {8 b5 ^4 q4 B

. Y9 j" ~% y6 {& j4 N然后编译执行就可以了(*^_^*)
+ I, f+ w$ b7 g1 _( A其它:TC++上一定编译错误,不保证在VC6上也能通过编译" u3 n/ y) q: F; B5 G2 d3 g
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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