返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,/ q) r8 {. T1 M  O7 ]
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式" d! ^' e1 E2 b1 o$ E- E
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)* r; w/ H0 J: s0 D( @/ L; [
参数解释:
$ r" Q% x2 }/ L! V2 t$ A( G0 iistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" b2 a5 V" C- b% nnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" M* t3 L: Y6 T  V2 K
返回值:6 b3 g: K; [, \: D/ I# [1 p
返回非0表示计算成功,0表示计算失败有错误
& B- l& Y- z+ T5 s' o
$ ]/ Q5 t9 S- w* T
! E  U' N& O8 f3 R4 w0 L8 D7 Z9 S$ t, F" F/ o
程序代码: 7 R; c' B4 o3 {3 f/ _0 i3 R% \
6 B) G' y$ e# Y
namespace fy_Exp{! X% K" L. Q) L8 Q8 Q' B1 Y
namespace {template <class _T>
8 R: {6 I% i" h. n. Hinline _T GetExpValue(_T t[], char& csym){, p. |  r1 C8 m6 G1 `- A' F
    char c=csym; csym=0;
, G0 q. t5 \! i8 S: v    switch(c){
% D5 \9 I8 T# L% u& x  I1 w    case '+':return t[0] += t[1];# M8 i. @. V/ K  O
    case '-':return t[0] -= t[1];
! ~& b. Z5 E* R. B6 }    case '*':return t[0] *= t[1];- k5 ?2 e8 H2 [8 S( A: {$ }% A
    default: return t[0] /= t[1];//case '/':$ S: J. u7 H2 f% g/ _  k
    }! g8 I' m8 Y, E0 T
}}
/ B6 e1 V' `; T7 ftemplate <class _T, class _Tstream>
: ~: Z- U# r9 ~4 t/* _Tstream: inputstream, _T: get return value
: X5 a. R  b3 c# x$ m* Return nonzero if get value successfully */1 L; g% E8 b& m* d
int GetExpValue(_Tstream& istrin, _T& nReturn){* x3 J( [3 K4 p+ v6 W& p9 I
    _T t[3] = {0}; //雨中飞燕之作
- E" w1 B$ k) i6 n* |; I, G    char csym[3] = "++";' G/ n) C  k  q  |& d0 z
    int nLevel = 1, nERR = 0;
0 s! E# v8 r+ C: M3 Y* w# _! a    if(!(istrin>>t[1]))istrin.clear();% O5 Q# H; \5 n. T. S
    for(;;){. D( Q% b. q, j9 y# x! K
        if(istrin>>csym[2]){: G& C2 d- @* ]2 |% w; |  ^
            switch(csym[2]){/ V, q* }1 b6 p& D* v
            case '(':
9 @" T; S! `: {1 Y( _                if(!csym[1]){nLevel=0x100; nERR=1;}else# z' F( v2 Z$ ?/ [. J! ~
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
7 b3 i! N6 r+ l$ X                else{nLevel=0x100; nERR=1;}
0 C: v% x2 u! d: p8 m                break;
) x: h% s. z' u9 p            case ')':$ {- G4 u% A, v+ h8 j8 D* r  P
                {nLevel = 0x100;}break;
1 Z1 }4 ]$ t4 l" t3 c8 F% U$ f: k            case '+':case '-':case '*':case '/':& n+ u2 i# ?6 W
                {csym[nLevel++] = csym[2];}break;) L% I5 w+ z. t4 `" `/ ^! @" J
            case ' ':case '\r':case '\n':case '\t':continue;/ e9 S- n- K+ }; n# {
            default:
' t5 k/ u2 d9 v5 Z3 E                {nLevel=0x100; nERR=1;}& a; F+ d) ?& o4 k
            }
: N' [% Z# m$ T5 D2 B/ [2 O* c            if(nLevel==0x100)break;
# \# y- ]) i* N* C4 H; ]            if(nLevel&0x10 || istrin>>t[2]){
: }3 L( J3 P7 |4 ]" n; j: L- p: M                nLevel &= 0xF;. Q% ^- N% h, z
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
# Q% e& J! ], I  m/ l( f7 g7 ]7 \/ {' m  {                if(csym[1]=='*'||csym[1]=='/'){8 l$ a$ k0 A3 l$ s& |
                    GetExpValue(t+1, csym[1]);0 L$ ?7 o/ a$ W  k. H, v* ?
                }
5 n  m5 u  Q% f5 n' |. s$ M                else{1 n( b  ^9 x9 K9 {& i; Y
                    GetExpValue(t, csym[0]);
9 Y5 i1 R% f" V                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
0 R8 Z; q& w3 c  ]                }
, C6 ]/ f& X/ d, X& x                nLevel = 1;0 N9 H+ v! t6 D) {0 R2 I
            }& {+ M# S1 a/ D8 M9 f) I1 B
            else istrin.clear();
4 z  h% }# h( v. s/ c  q+ j* p( X        }8 L' G6 _7 ^' N  k! g: c# c
        else{nERR = -1; break;}- [, B2 d: b' t$ o
    }$ C( E; v. d3 m- f0 D; V- J# s2 {3 Y7 b$ z
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);- k$ v& o8 |0 V, m
    else nReturn=GetExpValue(t, csym[0]);- S# Y9 F, J* f; s4 n1 w% Y
    return nERR==-1?1:0;5 e" z4 d  E7 d( S' ]6 v; i
}}
; P( e! g* L7 A
) M6 I8 @( K( ?; }' m2 E) S$ s# E$ a5 K7 d9 z

: ~) B  Z: `: T" Q函数模板使用示例:4 ]5 |  m; t% h' w( _3 q: u
在以上那段代码的后面加上以下代码:# p* i" T5 r! v

0 D: \; h$ }, [- m$ R # Q2 j* e" j8 a6 N
) ^2 Z  [+ Q% d- V: B
程序代码: 2 r+ I+ C& S" q. Y) t( t. \. \
9 u  w# K7 c3 ]& Z+ A  ?
#include<strstream>
$ F1 [# X: ], E1 `#include<iostream>% Y6 G; Y% F& j3 z& r- I$ w
#include<string>2 h8 p0 H' J/ E, V
using namespace std;2 U  v7 a' k3 [+ c% I  x  ]
int main(void), N1 O+ i; P7 S) b, Z
{
! V' h# a( Q6 l    string s1;3 Z# }4 A: V; m
    while(cin>>s1)
+ {  e! Y, u. g' V; {7 {( ?    {
1 i8 U5 @9 H5 I, m) x' ^8 {: {0 p        istrstream isin(s1.data());" {/ M- t* q- ?+ g. N/ p8 n+ E
        double d;
! X5 R% g! A0 G3 [. r        if(fy_Exp::GetExpValue(isin, d))7 {, N! p# o* l/ p" S# b4 B
        {: M/ v  R5 B- }: S" F0 M: O8 l( g
            cout<<d<<endl;
& n$ h8 ^3 w0 |        }
/ v# b0 P* k+ K        else
% S+ u% _# I7 d( e, `        {
1 N. c6 |3 @  d7 B            cout<<"ERROR"<<endl;
7 g3 m8 F; x* l& t8 I        }' i$ b; _- D; k
    }
1 B( J$ H* Y0 ]8 i    return 0;8 G! w  j: k' V# G; F) \
}
* {( d! `; E0 n3 S: o2 `0 R! `) h- e0 W% c- \

8 G8 P/ N0 F3 _3 g4 T9 K# e: |3 }然后编译执行就可以了(*^_^*)
: t: D" M2 u* T2 h& N: W其它:TC++上一定编译错误,不保证在VC6上也能通过编译( y' _/ T1 t8 k- L: e8 F
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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