返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
' M0 N- ?$ O. |' B& R* [( V一个很方便的函数模板,可以并且只可以计算含括号的四则表达式5 h4 X  [* h% C$ H$ D. f+ p* e
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)1 N- L4 ?& `/ `' \
参数解释:
6 p1 |* b5 b- m2 Mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
& y4 ], w  N% t' r0 GnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
: a$ n6 E, D4 M, K. ]5 Q8 a返回值:$ S0 G% d& i, s: R
返回非0表示计算成功,0表示计算失败有错误
. }: T1 i$ D1 h0 z$ l4 y# ^
. [9 e( O+ X5 W4 z. C : {% E- C* D3 n7 F( b: k7 d( H

, `6 e9 I- b2 M+ A* n程序代码:
% ~, s; S  T$ u& d4 ^' A0 j) A
: x; `8 R' W# G) S. p" Z- Fnamespace fy_Exp{% R9 K9 p/ }# P+ Z
namespace {template <class _T>: n5 M- ~  @! S9 i! i2 M* E3 t7 y  ~% {
inline _T GetExpValue(_T t[], char& csym){: D5 q" ?, f; D: r$ c5 r1 N) W) R
    char c=csym; csym=0;
& X, c7 [2 v, p# {    switch(c){' ^3 \5 E2 I; f4 j+ Y
    case '+':return t[0] += t[1];6 G; B# q1 V" |( s
    case '-':return t[0] -= t[1];* @; j& t, Z5 _
    case '*':return t[0] *= t[1];
$ l8 z0 ?3 Q. I$ r, J" D4 _    default: return t[0] /= t[1];//case '/':6 O* [' K, x2 S. e) D9 d; E( ?! \
    }4 I7 C+ [  {* Y0 N$ Q$ h
}}
/ `5 b) E& C' gtemplate <class _T, class _Tstream>
9 `- ]  j* ^. z' B/* _Tstream: inputstream, _T: get return value
* O3 _+ Z1 |; t/ L# d3 r5 n* Return nonzero if get value successfully *// m0 e) w3 j( i4 e4 U( A
int GetExpValue(_Tstream& istrin, _T& nReturn){
! J( L1 R3 b8 P, n) j$ o; S    _T t[3] = {0}; //雨中飞燕之作
4 a& L$ m1 D4 G; S9 W5 U) ^    char csym[3] = "++";3 {0 R/ V/ `3 M* p7 E8 T4 X( }
    int nLevel = 1, nERR = 0;' T# g3 u3 Z* \/ b, y; w2 ^
    if(!(istrin>>t[1]))istrin.clear();2 ?9 r8 h) R  o( I5 T. l+ f
    for(;;){
: M1 l2 S& }7 ~8 f- U        if(istrin>>csym[2]){4 A: S& x' d0 E: ^$ Y8 i* A5 I2 R
            switch(csym[2]){0 a9 j/ n3 p; k5 J
            case '(':) q1 l9 h+ L/ V- }9 w
                if(!csym[1]){nLevel=0x100; nERR=1;}else6 q9 [* c2 c3 D2 \; k6 ?
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ f0 W6 m* ~) _                else{nLevel=0x100; nERR=1;}
" {, d3 S( z- z4 }' a7 l                break;3 U& Y- [$ r( W, L
            case ')':
# z' Y+ Y$ p8 b/ H% x2 b                {nLevel = 0x100;}break;
" q1 {: C9 h% ^            case '+':case '-':case '*':case '/':
+ O" }5 }" w: h- s4 A& V                {csym[nLevel++] = csym[2];}break;
7 {  z$ h+ w; K  O" n            case ' ':case '\r':case '\n':case '\t':continue;8 u7 R# F( R; v8 `
            default:9 U) r& M  x" W* ~' `
                {nLevel=0x100; nERR=1;}
7 y" W' t- D7 Y% D            }( h& b2 H8 V0 a8 E$ _) u5 J
            if(nLevel==0x100)break;* q# n3 s; W& u
            if(nLevel&0x10 || istrin>>t[2]){
0 k+ G; X; q8 z! Z1 t4 ?                nLevel &= 0xF;: L8 X. V# [  R+ v7 |
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
% @( x6 g& I! w                if(csym[1]=='*'||csym[1]=='/'){) U9 c8 \" b8 B5 i1 e( a6 r' J
                    GetExpValue(t+1, csym[1]);; R7 N& J. ~* r, {
                }
- {& H2 R- v+ i; @( u                else{
' y" g" S& v+ M  O, L# K                    GetExpValue(t, csym[0]);
) ]! K* |( h5 z% t7 k  b                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
* ?% k. ]: R- |6 [* s8 j                }2 x+ Y$ X  l' {. G
                nLevel = 1;
0 K/ f* s* l9 D' a$ q            }
# _0 z5 H2 l; y" m: |! o/ h            else istrin.clear();
, ^- n, |( G$ P; f        }4 z  D& O% {! ?
        else{nERR = -1; break;}# {. h$ G7 x( x% A! O5 Q% r- q
    }
2 R% s/ W1 ~+ X% Y" ~" w$ N    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);4 A. K# O& H9 ~& P& W. h4 [8 v4 d
    else nReturn=GetExpValue(t, csym[0]);) W# ^& q# g7 C( j$ {
    return nERR==-1?1:0;& _6 Z0 m* o% W' F8 K5 ?
}}( m# C# o& _) p9 B0 i7 J
$ J! _) k6 |7 [
8 Q& \: l- c( n# S

( n/ Y1 X. e! M) Q% i函数模板使用示例:) b* i8 v: d1 K, a+ @
在以上那段代码的后面加上以下代码:
2 E- [; @7 L4 ^# ?1 g; `1 t' m3 i  T0 k* a
  @' x. N  `8 N6 u
& |  D, r4 h- A! W
程序代码:
1 v0 Q2 C' y& w+ W; f; Z- t7 W7 q5 S. `- J9 m" @
#include<strstream>+ Y3 Q5 i$ h, J% t
#include<iostream>' r# `0 x! a* K, e
#include<string>
+ @$ S* F1 v: vusing namespace std;/ j8 H, a: l* ~- K* L4 B
int main(void)8 t3 x, p5 ?- d& I: r( x
{
; a. e6 o* ]. j( E6 f! h$ N    string s1;
$ {9 F$ v% o' D0 k    while(cin>>s1); V. a4 i* B$ E) @7 r# P" s1 `
    {9 w( X4 ^( B% `+ s, {8 d9 u) l. y
        istrstream isin(s1.data());
/ I2 R( {5 s; A        double d;
5 W9 P! P% c0 h! D) [# A  C        if(fy_Exp::GetExpValue(isin, d))
, v8 p5 n$ a* t$ P        {5 K: u3 D( Y/ k* q
            cout<<d<<endl;1 C; L. @3 \) x# o
        }
5 h4 }# C0 T% g; N        else7 l& I( {9 C3 f: ^$ f
        {+ l! {9 m" R5 ^% e
            cout<<"ERROR"<<endl;& Z7 y9 _2 `* h. P
        }8 @6 `3 i2 e7 ^, P+ g
    }
. [3 z7 B( H+ W" \% p    return 0;
( T  N! r2 B1 Q2 T}
) A$ F0 l5 I; Q: J4 u7 Q
5 @! q7 R/ z( O$ g( k6 c) ]- w2 R- `1 ~' m6 S
然后编译执行就可以了(*^_^*)* g& v. B1 N: X3 U- E0 N
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
! P) Y9 F: C$ X7 ?; H1 g4 |& }      建议使用VC7或VC更高版本,或者使用GNU C++编译

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