返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
) R" ~, ]  |/ D% N, _! X$ R- k* q$ z一个很方便的函数模板,可以并且只可以计算含括号的四则表达式( t8 d' {3 M; u/ O4 Q: p7 T
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)- a  y8 t2 i$ U1 ~
参数解释:7 H1 Z1 ], C+ u' A
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
2 J  \& I- |: f3 T; |: P7 E$ ~/ nnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定+ C( k3 k( l5 p6 q) z, @
返回值:; K0 O; W1 F9 z7 F
返回非0表示计算成功,0表示计算失败有错误
( s0 C5 S+ X3 x7 C1 ?% `5 e# m- \# l, p! V

- R# g6 z! U4 s2 L' r" w" Q1 q3 D% w0 I# n8 A
程序代码:
' k4 P& y# u! y! i7 R. h- T7 ?3 ]1 O! Y
namespace fy_Exp{
. Q  C3 k( |/ C, w5 R6 Q6 Y4 Anamespace {template <class _T>3 y: n2 p5 b9 M- [8 `# e5 f2 n
inline _T GetExpValue(_T t[], char& csym){
4 Y% H, T9 w) ^% ^: W& U8 G% ~* L    char c=csym; csym=0;
1 h7 U! J8 m/ p( ?, p    switch(c){8 H5 k" @) `' m+ ~( L
    case '+':return t[0] += t[1];$ W: l0 w. @3 W
    case '-':return t[0] -= t[1];
" R2 y% }! s2 i# Y! S    case '*':return t[0] *= t[1];9 I* L& E4 k  X6 A: S! w3 Y% J5 X
    default: return t[0] /= t[1];//case '/':
* x" ^, ]' K, |4 x" v    }! U% l) m" w0 Y1 G
}}
; \9 Y, L; d0 [2 L( o7 b5 I% ptemplate <class _T, class _Tstream>
. A) E; G% d9 Z0 x- h. t/ X, a/* _Tstream: inputstream, _T: get return value
7 X: z6 \7 ~& u3 O+ W" y; v* Return nonzero if get value successfully */2 P5 r: L( ]- I9 l& f
int GetExpValue(_Tstream& istrin, _T& nReturn){6 [- N$ O  q4 s
    _T t[3] = {0}; //雨中飞燕之作
9 h9 i: G  O3 V1 |7 q* C7 k% X& [7 V    char csym[3] = "++";2 k& a/ p  y+ X% m! }9 O" K2 b8 ?
    int nLevel = 1, nERR = 0;/ J6 n2 v! b7 r  F: j' X
    if(!(istrin>>t[1]))istrin.clear();7 k8 N$ Y7 g6 w* y3 j
    for(;;){! Y# k1 {0 K0 Q
        if(istrin>>csym[2]){
% K( ?8 X" ?& L6 H$ _            switch(csym[2]){  S6 b9 t- A# O3 N
            case '(':5 k+ g( r" V6 N5 e$ p5 Q
                if(!csym[1]){nLevel=0x100; nERR=1;}else
! x; y4 x3 O! d" i4 R                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;1 h3 H, Z$ P" l$ @: ]7 @$ ]5 l
                else{nLevel=0x100; nERR=1;}" }' I# o2 j0 Z
                break;
1 G8 e, `6 q% D0 B" n. |) e            case ')':
/ R6 `* Y/ x: E. ~1 B% N                {nLevel = 0x100;}break;
; g! f: F2 f' p( p            case '+':case '-':case '*':case '/':6 s: {0 `" f& f- r- }8 `; _
                {csym[nLevel++] = csym[2];}break;  y+ g. n. Z  q7 e7 O: A
            case ' ':case '\r':case '\n':case '\t':continue;5 B* V3 ~" x- K+ x4 E
            default:
: k) m; T1 v4 s+ P                {nLevel=0x100; nERR=1;}
7 Q! w4 h8 L* T& s6 ~: D: v            }
- I* y- `4 Q. [! _1 X4 v4 t            if(nLevel==0x100)break;
; z! `2 p1 v/ ?! t9 ]& M5 ]) I            if(nLevel&0x10 || istrin>>t[2]){
* I2 S; ?1 s5 W7 K                nLevel &= 0xF;  j5 R) `" u! V  h/ K( B3 c1 G0 L
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
' d5 Q: R8 h4 J- `5 [! H                if(csym[1]=='*'||csym[1]=='/'){, g8 v( C- Z% q( E3 i2 @
                    GetExpValue(t+1, csym[1]);
( o0 u( P/ C1 D6 A) H- H: p                }! \. a0 q5 N4 Z0 O* p
                else{- S$ r- X8 P4 f( P. z4 I
                    GetExpValue(t, csym[0]);5 v$ w! B8 Y) t9 v; |( t% A' s
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;" I5 ]" K6 X! N0 Y  \: Z
                }
# m3 J1 h: O+ F  V                nLevel = 1;$ p, W8 p* o& r* F! i* Z
            }
" A6 q" `$ k# J4 z! F$ f: w            else istrin.clear();! S  T6 b$ l: M2 i; z
        }6 ?" E8 w; Q4 T7 V
        else{nERR = -1; break;}/ c8 r& U, d" C1 K/ M
    }# [; N) O. z% ?9 D9 J
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);: Q3 G6 U' h  v3 i/ y7 _2 K" K
    else nReturn=GetExpValue(t, csym[0]);
: E) t- U. @. `" a" k, p% R/ t    return nERR==-1?1:0;
+ ?% Z4 c  n6 Z( ?$ t8 W}}3 ?6 f4 x+ h1 C1 E
; {8 |3 w1 V* F) T

9 L! q! @. Y1 M* O* `* O$ ?' x/ s# f" C; h8 d3 O1 j1 e
函数模板使用示例:2 h! @* X5 G: P; b3 M( W0 |
在以上那段代码的后面加上以下代码:
0 g% p) p) s/ B0 I8 U# z1 p! X) [6 a- c  K9 N

' Q( t, l, h, x. ^' u3 n9 f
6 Z  N0 @; x8 o; _% f" u程序代码: 7 @6 N5 d" S0 U) f
4 E! K$ a' Z% L6 d! S+ y
#include<strstream>
6 l: |6 F" |$ q#include<iostream>
0 E7 E1 j7 J% B8 r#include<string>
" k3 G6 _# T& q  d( Musing namespace std;
" a  r5 G, W: s& Z7 w, e) \int main(void)8 y+ ]" c2 `$ g$ d$ Q
{* M6 r: |3 o9 D4 C- j( u: _! k% n
    string s1;
% b8 K- q3 W; D    while(cin>>s1)' b# ]( S8 X  ?# \
    {
0 n4 l9 C% d* c1 N$ h. a, d6 b$ T7 l        istrstream isin(s1.data());
) y  Q( [$ k: }5 ^        double d;4 U  A  Q7 j. n+ k: P  s
        if(fy_Exp::GetExpValue(isin, d))/ S0 L; U6 C" g' W
        {4 f" ], b( g8 g; i1 ^/ m. b! v
            cout<<d<<endl;
8 {# i3 V: s4 T/ b( x! }! r) A        }
+ [& Q/ v/ D$ Z1 J* u7 Q5 ]" r; K        else
' N! D# F( U, Y6 }, B  C$ |- m  F        {* e1 A# i1 _% N' b/ d6 T
            cout<<"ERROR"<<endl;
) ]5 C# f# p0 z( F4 x        }4 g1 J' n7 b, u( L9 C! n0 l( A9 J
    }+ ]9 m9 ?7 z0 k5 [3 R& A
    return 0;+ E6 J& Q4 y& U6 t
}, T/ N0 H+ F6 v# N
% s0 ?1 |0 p: B' r5 K  Q. B3 R

% r, c7 i% m# }' a* ~$ ]& j然后编译执行就可以了(*^_^*)
7 ?2 W* w+ U: c# Q! y其它:TC++上一定编译错误,不保证在VC6上也能通过编译" r) C- q, I0 `6 d: \8 H
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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