返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
- ~4 m7 T9 q' P4 P5 k# R一个很方便的函数模板,可以并且只可以计算含括号的四则表达式/ O3 O3 @' s. G3 M, j8 b
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)5 P6 K5 z( |3 j% U- W1 G
参数解释:5 E6 w' {8 l# O/ b1 G3 i, _7 `
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
. F* j( T" [; ?/ O, WnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定+ q& F+ o$ }+ |; q$ ^
返回值:
& @+ G& R# {! F! ~4 D& D返回非0表示计算成功,0表示计算失败有错误
: ~) @+ L3 b! F, p3 m8 f& S; p
7 s3 I/ l8 \6 F' C) D6 }1 @ 1 ^1 ^# s  r3 m0 t* t
/ r0 n( i1 o  M/ \3 _( P) S
程序代码:
% S+ {& V* P$ n! \$ }* X# z
- v5 J5 }* R( X2 o. Z& \1 {namespace fy_Exp{
, l& V5 ^0 C% }2 ynamespace {template <class _T>
! m9 ?0 i( s1 S$ Dinline _T GetExpValue(_T t[], char& csym){
) M/ m, ~/ M  o0 Z$ E( w7 f5 d    char c=csym; csym=0;
9 M$ g! Y! i7 b, b6 q/ }2 U( R    switch(c){
7 X1 O% B" B5 i1 z* y- k1 ~    case '+':return t[0] += t[1];" Q; O) U7 P2 A, R
    case '-':return t[0] -= t[1];
/ v! q6 ]( Y" a( F. \: Y    case '*':return t[0] *= t[1];
! [) c, Q8 K. L" X' M; s4 _4 [    default: return t[0] /= t[1];//case '/':1 K- c! i, j( ^8 e* j( G! b9 r
    }
  D, F$ B$ S1 h' U" h7 |- g  H- b}}% {; ?8 C( U8 Q% ~& P4 t8 l' ?
template <class _T, class _Tstream>
& A; j- U7 i) G% I/* _Tstream: inputstream, _T: get return value
* p& Q6 {2 Q% y$ k8 G/ g5 e. r* Return nonzero if get value successfully */' h0 W! i! Y! T
int GetExpValue(_Tstream& istrin, _T& nReturn){1 h" B7 z, }# v1 k. }. O
    _T t[3] = {0}; //雨中飞燕之作
; o% c# D# L* y/ u    char csym[3] = "++";
/ V- L0 {( k! m, z, ^' _+ l    int nLevel = 1, nERR = 0;
- F4 o( v1 i6 K0 S7 m) t. w    if(!(istrin>>t[1]))istrin.clear();
; A1 D0 n( t. a* W9 Y    for(;;){
9 F" Z( t) v7 H; F        if(istrin>>csym[2]){
2 L' M8 Y% P. Z0 C2 j            switch(csym[2]){" Q2 y  S6 g; i! l6 ]: x! O5 P
            case '(':
& t7 H! ^8 j8 [                if(!csym[1]){nLevel=0x100; nERR=1;}else
" C+ a. ]# l1 S$ @; E                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
6 P' z0 h# q! e  X( i+ d                else{nLevel=0x100; nERR=1;}
- c. c( v6 N9 ?6 ?2 M. K0 T) T                break;
3 }+ W% r! n( ~* N8 p            case ')':
, w7 N+ R% A6 |# ^) ~                {nLevel = 0x100;}break;$ E8 E1 [' g0 T1 x
            case '+':case '-':case '*':case '/':
& P7 w; }3 I9 c+ d+ u! w                {csym[nLevel++] = csym[2];}break;' q  T6 u' E4 A
            case ' ':case '\r':case '\n':case '\t':continue;7 v- h* }( {6 E* K
            default:- K9 w. R/ ?4 }* b+ O, N% P6 _
                {nLevel=0x100; nERR=1;}
& }" I: @4 \6 s. E( h- V            }
' d+ a# e9 J5 A6 f* s            if(nLevel==0x100)break;
; ?; y7 V, n2 T, m% |            if(nLevel&0x10 || istrin>>t[2]){3 f; D+ N& k' u, d
                nLevel &= 0xF;
: S( f( Z/ n+ o4 E* j$ \* H: [                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
) `7 [6 L2 `# E4 p9 R                if(csym[1]=='*'||csym[1]=='/'){, O: V. o# |- Q) o8 |" ]
                    GetExpValue(t+1, csym[1]);1 X) ^" Y5 f7 N, k! l
                }
& b2 P$ g$ x) N1 O                else{* c( ]( u7 C5 q; P1 C: ~
                    GetExpValue(t, csym[0]);' ]* k) A0 x' P; `; ?% C) k
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;7 s; H( z! b$ X9 }( k9 R
                }
+ ?# r5 \, ]3 s* }/ Y& m3 N                nLevel = 1;
7 g! g6 y) R1 M& S2 x" r            }, k9 }0 q2 s; L; W$ [0 C  n* f# Z
            else istrin.clear();
+ I$ z1 m& m& d+ j7 g$ @. R        }4 e* v' C$ U; v* @: f- X
        else{nERR = -1; break;}
! _0 h4 @: g: @& ?. E' w    }
5 I7 x4 ~* C! r9 g    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
' W* R  e. f- N# U/ Y: H/ O    else nReturn=GetExpValue(t, csym[0]);
3 A& M$ h$ k  b3 O6 H( A7 A/ s2 a  n: y    return nERR==-1?1:0;" o- |0 f, T3 K
}}' T- [" Q3 \. ]4 S
3 y$ A' R8 [9 a7 A1 Q, N
* }9 x8 T4 y! U* K# Z* O& s

* j/ z7 L. O- p! [& \! K函数模板使用示例:% V  w9 t3 l7 L& u4 T3 A
在以上那段代码的后面加上以下代码:
* A% l$ O+ e/ L' ~4 u* A% R
0 T3 l9 e$ s0 R+ b5 T; e
4 w2 |5 B4 q) [: i
5 N: ?. r, `& i# j* r程序代码: . C( S3 t7 `( [1 W

1 M' @9 K) ?" _0 q6 a, v#include<strstream>1 \0 H1 K6 p% e, K2 l" P/ ]; K2 _
#include<iostream># d1 v4 u* s4 s( v" d6 |3 m( T1 L
#include<string>6 p" h" Y/ S8 H9 S0 Q% `
using namespace std;- y! H: ~) c. A& q
int main(void)
7 s1 O" x' C. ?5 {  c{/ w- z  t7 `7 g0 Q4 v
    string s1;! Y% t* @3 v+ P3 \
    while(cin>>s1), A: X6 s5 S0 r, c
    {
: |" Z/ ^3 G& L8 X  M0 e        istrstream isin(s1.data());
' A/ Z9 N4 s  W5 {        double d;. ~: ^" J& i8 e9 n" ?. m
        if(fy_Exp::GetExpValue(isin, d))
8 F. c4 I- w* W( @( h$ ]' E        {
4 N4 b# s3 i2 i            cout<<d<<endl;
, [+ \' M. |  s2 H; d$ U        }* G; t9 x5 }7 ~/ O8 @0 K/ i0 L
        else6 j( b9 S" N1 _# D5 d9 J
        {
" J8 D/ w5 u1 B& i& Y            cout<<"ERROR"<<endl;
/ Q) T! c5 z+ J) Z( `6 b" q        }
% A  N1 P* M: L; D$ I4 W    }
) d4 a& v6 c# u2 }" r$ I8 P. V    return 0;
; {& k8 z+ Y6 {% E}
; [3 b0 w  J" a6 R/ Q- x( `- s% S+ l6 [' `8 x. @
9 K8 G% c* b# l& U9 y
然后编译执行就可以了(*^_^*)
' D  S2 b# H* P/ x  O0 T其它:TC++上一定编译错误,不保证在VC6上也能通过编译
" a' d, o( @, H2 Z( k% D      建议使用VC7或VC更高版本,或者使用GNU C++编译

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