Board logo

标题: 一个计算四则表达式的模板 [打印本页]

作者: zw2004    时间: 2008-1-21 20:17     标题: 一个计算四则表达式的模板

在9月8日那天我特意编写的,给大家分享的,4 Z1 z$ o. ]4 \2 n
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
2 }8 a4 |; W. `只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn); c& M' j; \& _) B! M. c
参数解释:
! [; M0 H- T3 g* o: l" a8 n$ ~istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
1 h) F' m! f; znReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定3 |7 H0 v5 \1 Y/ ~4 @$ `: h: P* d& U
返回值:$ R4 m: m1 s1 X; ~& x
返回非0表示计算成功,0表示计算失败有错误7 F9 [, v2 A, l: u
0 g8 L$ y) X- G9 o3 \

5 ?  r9 j, D  G) z$ Z* ^' y+ ~( u! p# q6 ^, s/ B
程序代码: ; ^- q2 s% p6 {& M$ I/ f- i, q

1 j7 @; G$ d! Z( s& U8 m  hnamespace fy_Exp{8 f( {- ?% u5 `& i
namespace {template <class _T>6 T# n0 m, a/ ]: s9 E
inline _T GetExpValue(_T t[], char& csym){
/ b( F  t* X- \# B1 B. L" B5 Z    char c=csym; csym=0;; ]5 i$ X9 z: W1 _+ _% T0 s+ ?$ G
    switch(c){1 `( a2 c6 y& [1 u8 \
    case '+':return t[0] += t[1];
5 v1 B$ ?5 n  J    case '-':return t[0] -= t[1];
5 i5 C+ J5 j/ X    case '*':return t[0] *= t[1];- z% L) c! P% S9 c! r4 h! n
    default: return t[0] /= t[1];//case '/':& @$ f4 \& L1 I/ D) F. m7 Z
    }0 @! ]5 }0 g4 ^' k$ _) i2 T: C  ^
}}2 u0 K% u# L. S
template <class _T, class _Tstream>
3 u5 P  l- o" }/ D( ]/ j- |/* _Tstream: inputstream, _T: get return value
6 c2 _6 n9 X7 ~, r* G5 A* Return nonzero if get value successfully */
2 u2 W2 l* [  X8 }2 lint GetExpValue(_Tstream& istrin, _T& nReturn){
/ M3 o/ y$ o: K    _T t[3] = {0}; //雨中飞燕之作3 ^9 Z( e) `8 E2 T3 |6 t" z
    char csym[3] = "++";
6 e1 I2 M' j1 X; r* j  E    int nLevel = 1, nERR = 0;
2 x+ v! D1 i& h7 D# n7 i    if(!(istrin>>t[1]))istrin.clear();
$ s1 O6 F5 m" c+ b1 q4 k  ]+ x    for(;;){
4 s3 A+ H2 o) w8 F/ r+ K        if(istrin>>csym[2]){( b* ^6 u+ A# ^; `
            switch(csym[2]){
* ]4 ~" J3 r+ _3 G0 H6 H            case '(':
& w6 R3 S3 O* v" s                if(!csym[1]){nLevel=0x100; nERR=1;}else: P( V2 v8 I. x) [. R& q
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;+ I0 I* L/ s( f0 I8 @0 R- I0 ^
                else{nLevel=0x100; nERR=1;}! m% K* e4 ~1 f
                break;) i  N8 T$ Z' M/ f& t& `1 I0 ~% g
            case ')':
$ V# E5 Q6 A! T, E0 L" u                {nLevel = 0x100;}break;( i9 y; v& i  Y9 }* V& O! l
            case '+':case '-':case '*':case '/':6 Q% h' w4 b6 e) P( R
                {csym[nLevel++] = csym[2];}break;; {7 b0 F5 r& k& c0 y3 l0 s
            case ' ':case '\r':case '\n':case '\t':continue;3 O2 H. v  F& J& W
            default:4 `, D* L- |# [' x& A
                {nLevel=0x100; nERR=1;}8 A2 ^6 E! S, ~3 u+ g. h& }2 U
            }
0 N" ]) s% i3 B* V# l4 [            if(nLevel==0x100)break;3 h6 e; Y7 x9 Y& W$ u& J6 M* P* G
            if(nLevel&0x10 || istrin>>t[2]){4 J2 F% \4 x. {
                nLevel &= 0xF;
% s4 B" A/ s2 W0 p, U$ w' @7 B                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}% [# z) S# x* R/ ?1 V4 B
                if(csym[1]=='*'||csym[1]=='/'){: O; t$ x3 }1 J/ M( K
                    GetExpValue(t+1, csym[1]);
& S$ s8 E# L$ b: y                }
9 C, Z1 J& `2 u; b6 ~0 B                else{
$ b! C2 {3 r1 V7 B                    GetExpValue(t, csym[0]);
; E  E# s* F8 U2 ]                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
# E) I$ X5 @) ~/ W/ k! V                }
  V3 W+ \- B$ X( p9 |/ F                nLevel = 1;) L* q' f1 s" a$ Y. c
            }
8 g# E6 m: ~& i6 y$ D6 l* I# l            else istrin.clear();4 v. Q: R% o, u3 C" B1 c
        }7 k, D& [  ]- [( }4 w' [
        else{nERR = -1; break;}
, e/ N8 d9 a/ ^3 H; c9 ~% Q! T* y    }
* r  E0 |0 d- J    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
/ _7 A9 K/ V9 m# x  K' A8 l# Q8 P& O    else nReturn=GetExpValue(t, csym[0]);
0 _7 _: V/ ~" s    return nERR==-1?1:0;
( r+ p# K4 e0 x5 G" m}}
1 z# ]) r2 G, |" l) v
& X2 D5 k/ f  A4 w! l* B) c- j, r  X. _& R& p7 O5 q
5 v# i/ f( x1 W9 l7 U
函数模板使用示例:" B) Q: Z: I) B/ }
在以上那段代码的后面加上以下代码:
6 g6 P" _: p0 {+ N) j9 C: |; N) X) T2 W) E/ r' j$ ~1 Y+ e% _. {
' g: [7 X; _1 c. X- A0 K

. Z" V1 j5 j! u+ f! `程序代码:
% A! K% h, C& v8 [- a/ W* T" k- l8 K; L/ W+ X8 w
#include<strstream>
# l) H) t1 N0 \6 ~- p6 @#include<iostream>
  B2 |- s4 \" {! g# c9 m1 d#include<string>! J, h% N( k9 z" N( g) \- ~
using namespace std;
- h  m! w& G4 Q5 K( F4 P, \5 nint main(void)
& W' ^; o3 m5 \4 n- ?* C8 k' W8 p3 m, R{
- |3 F3 ^% z  p! P0 A" K$ `  i8 U2 [    string s1;
1 W; J- w* g  d/ ]    while(cin>>s1)1 \5 d! m! a" N$ n8 U" B
    {( a2 L. u$ U2 ^
        istrstream isin(s1.data());0 c2 i; f7 g. F) B: i8 I7 }
        double d;  G' f1 J/ k( Z
        if(fy_Exp::GetExpValue(isin, d))/ a( D9 N% n- y- a+ s0 `
        {
3 V' M! W0 P* O. l0 \% o, U; o            cout<<d<<endl;
, O- f& H) @! |: R' p! B        }
* _# R5 V2 ?. a& ]9 c8 C3 O        else: B+ _! r8 \' V2 `& H6 S0 q
        {
  b! F$ q4 o6 z+ r: V% n            cout<<"ERROR"<<endl;
( c4 k# P6 v' l: G9 ?$ i0 f, _        }
3 f# q9 Y+ Q+ L* Q# Q& d    }4 ^8 U- P/ X8 c3 }: T! [2 N; D
    return 0;$ `7 L. e4 O2 P% _  Z6 X# W! p
}
, |9 U  |+ B( n( W/ |0 q; s$ W4 m% p5 `! d# J

8 h* l9 V' K! @2 h% e& i% U然后编译执行就可以了(*^_^*): l4 X7 K' u) D8 l$ m
其它:TC++上一定编译错误,不保证在VC6上也能通过编译% L- D6 d' |3 ~, n
      建议使用VC7或VC更高版本,或者使用GNU C++编译




欢迎光临 捌玖网络工作室 (http://89w.org/) Powered by Discuz! 7.2