返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,! {. e9 X0 C% x5 R
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式6 @6 a0 @% Q8 c2 B5 t
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)- t* c) O: p" N) J& b
参数解释:9 Q3 t0 x" s4 M  Z  s+ w
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流6 d" }9 Z) c' e
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
8 \( i1 G0 D8 u8 G返回值:/ D! |& N) a" S' d: |
返回非0表示计算成功,0表示计算失败有错误# `' I% a* _6 C6 w7 B

1 V. o6 b' s* `- ?, r2 F, y  K 1 f* G/ Z! r+ j+ w7 Q8 L; M: \

9 h& ]4 Y8 p$ J  ?( r9 z/ c程序代码:
8 U: F* `% l4 X2 Z5 e+ J4 h1 V( h& e! b) |  l) L
namespace fy_Exp{
1 V- m* g) x4 T7 M' F, |namespace {template <class _T>
) J2 j; H1 c2 V2 N. N6 Finline _T GetExpValue(_T t[], char& csym){
( M7 W3 ]# F( F* N    char c=csym; csym=0;6 d- x1 Y, X" w7 H1 ]) @/ v
    switch(c){) a' d/ w5 y  M+ @8 X) X' v
    case '+':return t[0] += t[1];
( Z& ?) T+ i# P/ m; J6 O% I9 L    case '-':return t[0] -= t[1];" s1 A& o' l$ D3 v( \( R# y( m
    case '*':return t[0] *= t[1];9 t& s4 r# o/ O$ x
    default: return t[0] /= t[1];//case '/':3 H9 w- M7 |# K
    }
4 i0 u" c4 q  n}}
7 `+ X! U5 W2 s+ Q! M- ctemplate <class _T, class _Tstream>, Q0 K+ q9 a) I5 m" w
/* _Tstream: inputstream, _T: get return value% A1 x5 F* W" m5 N2 ^
* Return nonzero if get value successfully */
# n$ J: |# l6 }* F" ~9 Hint GetExpValue(_Tstream& istrin, _T& nReturn){
. B0 S" ^+ X; ]+ J& {, ]$ x    _T t[3] = {0}; //雨中飞燕之作
' ~. o8 z; L* s; f8 n" v* G    char csym[3] = "++";
' g  W) v& T& Z3 Y2 Y* r( E    int nLevel = 1, nERR = 0;9 w3 f, U+ I8 n) G
    if(!(istrin>>t[1]))istrin.clear();& T: c# y5 P: s3 K6 Y# X8 n: A
    for(;;){
* _( Y5 }' K+ [0 ~/ H* Z0 r        if(istrin>>csym[2]){& n2 N- C* b) c- {) J* E! M* h. p$ E
            switch(csym[2]){- k# O7 J* Q+ b4 |9 c2 S# r1 R
            case '(':
* A2 w; J* g% G( K' f& [4 R+ I                if(!csym[1]){nLevel=0x100; nERR=1;}else
# U7 K5 ?6 Y% A6 s6 u# i                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- P$ ^* ~- K$ `* R* I1 i# S
                else{nLevel=0x100; nERR=1;}2 |+ C6 O0 ?# X! q
                break;
$ A  T1 ]% S! a; t) g* [5 \            case ')':
7 p! O/ X$ t  ]# S6 Z                {nLevel = 0x100;}break;
. h: G8 P! ~! U$ r6 v5 d( \2 G3 n            case '+':case '-':case '*':case '/':
" I4 n! Y+ F# U5 n' H                {csym[nLevel++] = csym[2];}break;
4 i$ |  A0 f3 w$ G* \" a            case ' ':case '\r':case '\n':case '\t':continue;
3 h" L7 E4 p/ {- K8 O2 |5 G            default:3 h7 Z" t' y1 h2 m
                {nLevel=0x100; nERR=1;}
& Z3 `# e( `5 J5 t            }
  U, m$ b( }& |: F9 V0 a            if(nLevel==0x100)break;
( U3 f* F7 W/ B4 z$ P            if(nLevel&0x10 || istrin>>t[2]){; j% f1 }5 ^1 M; {. F
                nLevel &= 0xF;7 O* b( E# f, D7 q$ D: S
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
4 I9 {+ X/ V2 \                if(csym[1]=='*'||csym[1]=='/'){% D& X% b- a( a; f
                    GetExpValue(t+1, csym[1]);
7 N7 e) s. z( d& v) O% Y$ {                }
( n1 [* [% `5 K- k* c0 z, e                else{
% S. e7 {) R6 h0 e( q. M1 \                    GetExpValue(t, csym[0]);0 S$ C7 l# O4 w& d" O
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;& ~# [8 G+ |$ T
                }# d! Q! D2 p+ e" Q0 k8 A
                nLevel = 1;
' k6 `% o" N6 o0 E+ W: ^2 |- R& E            }8 I1 S  f/ @, y% R$ f
            else istrin.clear();9 i" Q& K1 b) k' B6 j' C- u
        }
( ~% v- F: K$ O        else{nERR = -1; break;}
& N& y0 F- u! f* @/ G" R    }8 J; _/ \4 {2 h) l  ^$ b" e
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 P- Q  h- ]# i' J) T3 U9 Q8 ^7 n  S    else nReturn=GetExpValue(t, csym[0]);7 s* G- r: b4 K' c8 A% y$ o0 u% |1 r
    return nERR==-1?1:0;
% @7 y. d2 b+ g, h! n% W' Q) |4 @}}3 w. a* x% g7 K  `

* \2 X( a, s5 F, `8 L2 M
0 _) u- }9 o9 t; m- g* \
  j( W5 ?" I9 R' \4 U& L9 f1 b$ e函数模板使用示例:1 ]6 e  ~5 R! c9 l1 Z+ A4 `" L! d3 p
在以上那段代码的后面加上以下代码:
" ]; k3 I/ g! r$ b4 d; k! I& i( Y* D4 v- n, V6 n/ G& m
& [$ Q% O$ p( B) `% I1 F
. Z0 V" F& c4 `  S8 w$ }$ r9 H
程序代码:
1 @2 ~7 V# p5 S; j. G
0 c0 [) }" t1 R, W" O2 a* i+ E#include<strstream>3 \  _/ O1 ^/ }3 t1 b9 M8 e" Z
#include<iostream>9 }: @( [2 G! q  S7 a% i! K
#include<string>; n9 e/ L" S9 M8 F
using namespace std;$ P+ X8 w2 _: B! N
int main(void); R- I& B' W0 F2 l! K5 V5 {/ J
{
4 Y# I1 W- s! D% a9 ]6 N& U    string s1;1 `, j- h( n/ |- i* P
    while(cin>>s1)2 g( O0 P4 p: V$ b2 r) L
    {
3 n2 {/ k1 d: M( C6 `9 m1 X' f) Y        istrstream isin(s1.data());  @: H8 s( `' ]( m8 D& _
        double d;
% C" ]# i- j- D1 X7 ?        if(fy_Exp::GetExpValue(isin, d))3 m7 m, T# O- L/ o% W4 O
        {: z" A% m7 B' d6 t& Y( W/ H2 `8 A
            cout<<d<<endl;
1 K8 ^& G4 z9 D8 @8 t        }& f; g2 l' `* f
        else
) ^; z8 A7 F- y, c  v        {
  y! B- Z5 a) e            cout<<"ERROR"<<endl;. z8 t  ?7 ?* A* |$ K7 [
        }
: _3 }/ N+ T2 k" ~+ s' E    }
7 `- Y" L: V9 Y, m! U8 b$ ?    return 0;- q5 S2 [" O  N( g( k/ ~
}0 c9 _; @  z  P/ g' [4 X' W8 e  ]
: y1 o$ n+ ?; \# i7 k& A1 e
/ m: [3 s( H# }- M! N
然后编译执行就可以了(*^_^*)2 f- m' w/ h" z0 k+ F
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
; ]& Y/ ?3 K' n- k/ g( q& \, X      建议使用VC7或VC更高版本,或者使用GNU C++编译

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