返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
+ l2 _. J( `. \* T1 ?7 a+ z( V一个很方便的函数模板,可以并且只可以计算含括号的四则表达式0 m4 X, X, T3 h7 B
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
8 ^* F6 R! B  f# ?* h1 i参数解释:
, D* H% n+ M' Q7 Q" mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流& t2 l, o5 @/ A  u- Y- C; e
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
4 X( R, _; n" g: u0 j+ S返回值:
( q2 W5 w5 Q3 n返回非0表示计算成功,0表示计算失败有错误) t: v, V# ?4 E( [# T0 |
  b6 b6 l; J5 g( X
% ^5 q& H) W# _7 j' M
# w1 |9 K! n5 l( }4 Q
程序代码: 9 s7 m( B5 u8 P$ H

+ b% |7 L. {0 V: J( C1 O. enamespace fy_Exp{* f. v! i  R6 v3 z6 w0 a0 D  f4 j
namespace {template <class _T>- m& Y# j/ v) ?# Z, k0 X6 @9 t# V
inline _T GetExpValue(_T t[], char& csym){2 l+ z( g7 h; b- k; S
    char c=csym; csym=0;
' P5 ~! d) y/ T# \( v. C2 B    switch(c){  M% r  y" z/ e
    case '+':return t[0] += t[1];: m" Z  a; \9 f$ Q; S) Y) r
    case '-':return t[0] -= t[1];
  `; j0 t. M6 @0 n* Z- Z    case '*':return t[0] *= t[1];. `% D$ O! j, o, s2 O
    default: return t[0] /= t[1];//case '/':9 S; y; `; p  b1 p0 o+ O; b
    }, G3 Y3 l( ^, \. ^. [% O
}}  _. m# G5 G9 X; f7 ?
template <class _T, class _Tstream>6 _3 Y9 Y! G) x* X/ k% ^
/* _Tstream: inputstream, _T: get return value
+ H0 F+ v' ?7 y" C+ x* Return nonzero if get value successfully */
) t6 Y& r: v9 K) h, p2 ?int GetExpValue(_Tstream& istrin, _T& nReturn){" K3 u, k- u; M( w/ r3 y4 @$ v7 o
    _T t[3] = {0}; //雨中飞燕之作
1 K& y* W% x4 j! |" f" a/ c    char csym[3] = "++";
& M8 o% n/ j6 n/ t    int nLevel = 1, nERR = 0;! S/ {# d3 g7 @9 R
    if(!(istrin>>t[1]))istrin.clear();3 [( i4 t% r/ p) T
    for(;;){
8 a( ]2 r: Y  f# f        if(istrin>>csym[2]){
, x3 b, _4 {2 q# k+ C( I            switch(csym[2]){6 q# ^% f# a% S' E# q
            case '(':
! l7 {5 x% c& a* {$ Y# T! @8 J- Y                if(!csym[1]){nLevel=0x100; nERR=1;}else
/ x# ^$ r7 T/ T2 k1 N0 n                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
& I- L$ U/ O) j7 |4 q                else{nLevel=0x100; nERR=1;}6 S& w  ]; y+ {* _# u
                break;  }; V2 p1 R" f4 B5 H, k1 A
            case ')':: W8 g1 W3 o. D. ~
                {nLevel = 0x100;}break;4 B9 A4 c2 [- N( k/ e# t; q- n
            case '+':case '-':case '*':case '/':
; G; z! y8 J5 Z1 B7 M0 z+ Z) M                {csym[nLevel++] = csym[2];}break;2 Z$ Z8 f: ?% D4 ^1 k& L' V
            case ' ':case '\r':case '\n':case '\t':continue;+ J" V) D' ^0 `; x0 {% D
            default:
) @5 I9 k* e1 `3 }/ ?- [0 C                {nLevel=0x100; nERR=1;}
5 _# L1 I1 z! c- |, A* M0 s            }
4 g8 Z9 y) h/ M/ T            if(nLevel==0x100)break;/ j4 i+ }% v' r& N$ u, Y" I
            if(nLevel&0x10 || istrin>>t[2]){
, g! r8 A3 I7 w9 V                nLevel &= 0xF;
9 x& v, u) E6 _' x) `, j! j                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
3 q- q! k% g; F" l3 S                if(csym[1]=='*'||csym[1]=='/'){, K& f( y9 X$ m( o
                    GetExpValue(t+1, csym[1]);% r7 j' H0 ?0 w: e
                }
- n5 Y1 v1 l) b/ O# e                else{/ s* b* T$ z7 i/ |( k8 P
                    GetExpValue(t, csym[0]);
9 ^. V  X' m% h( m                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;% r8 h! x& W5 V! _
                }) c# G" H1 g3 Y$ `, K1 e
                nLevel = 1;9 ^4 ^3 m) p3 ^9 O7 \
            }
! S9 j. `5 m1 }: ]            else istrin.clear();- X" `5 r/ i  Q/ T/ D/ ^. ~. v4 L, |
        }3 [- A/ a- i# z: c, \' t- l8 P' i
        else{nERR = -1; break;}
9 u/ p. T% i7 d5 Z" G+ L% `    }: O# a6 I+ g1 z8 h. L
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);; E" ~1 O! q  P0 u( _) ~2 |
    else nReturn=GetExpValue(t, csym[0]);3 M/ M  Q0 K! t4 K
    return nERR==-1?1:0;
1 l. Y, H: c# M" o$ T1 z! j" ^5 T}}6 l. R* j4 ?) b4 T5 Y; L' L+ p
0 D) A! A' @; _# W& |- o3 e

& h9 l6 ^+ h1 L# Q; o3 t0 G3 v6 K* u' `
函数模板使用示例:2 s4 m$ x% |) f- c
在以上那段代码的后面加上以下代码:
7 w9 v) V, _' D$ G4 x( N% T* f0 q: L5 h. A! X

- T. N$ B/ n/ a5 A& Q1 c- M' I( K& L( i* r1 n2 ]* T( J9 s9 l) t+ s
程序代码:
' O/ Y! G8 U' d0 W' P" J% J  ?3 l
; p" h; t% g6 g* U" c7 u% x#include<strstream>- K' {- s$ w; L+ f
#include<iostream>4 b/ g* X% y" j; ~
#include<string>* C7 R2 O+ a) z! O5 M
using namespace std;9 o1 v1 n. {" r# s$ p* A4 @4 [
int main(void)
8 u. L9 n" e# Z1 T{
1 ^& e9 `1 D$ }3 M( e  x    string s1;! O: \8 @+ X- E/ H
    while(cin>>s1)
% ?+ Q- n/ c& ?    {0 s- l! n2 F+ b( e. |
        istrstream isin(s1.data());4 I0 S1 @- a; j1 G' a2 b
        double d;
4 H3 v; y# }/ X& Y        if(fy_Exp::GetExpValue(isin, d))+ _8 U* K) @0 X" d
        {
3 M; }+ z$ V  p$ Y            cout<<d<<endl;
. S8 j# e( F3 y* d7 l        }; ^8 S3 T+ R0 a+ ]+ X
        else
$ }+ U& x, ]# p9 o1 C        {+ \8 T( ~/ I5 R
            cout<<"ERROR"<<endl;
5 W7 m% n2 I0 ]6 T        }
+ l6 M4 t& ], k9 J5 z. B    }
1 T  C7 N& H/ A* @, _0 |- e  K    return 0;' K$ R2 v/ g" V& `3 M
}
5 T8 `$ z8 e, W9 _' q! o2 D
$ h/ L6 D) }) ?8 B; @
2 R* D$ @) U: p0 I( Z, Z2 S然后编译执行就可以了(*^_^*)  ^' L1 D. ~: ]7 ?* s
其它:TC++上一定编译错误,不保证在VC6上也能通过编译5 p% B/ ?% l4 U; k' v
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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