返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,- m/ G/ \+ f) w, z5 l; \7 s
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式# b5 U( L" u# Z" j
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 |6 h! j/ d3 f6 K- l* v! s% a% y参数解释:6 u3 p6 T% D! l
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流( |$ ]. Z* q: T, R- M" V7 |% K
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
! l8 h, Z: j7 a8 @; \4 q返回值:, w$ r/ T( b( Q; |7 |) }1 Z# Q7 Y
返回非0表示计算成功,0表示计算失败有错误/ V; Y+ f# a8 L( C2 A; V

$ H- \6 u! W; {* x   s% j7 h  O( g9 U4 |
3 S$ c( L" L- M: Z
程序代码: : I) L, k5 ^! C0 I: j( n
: I1 q- V& G$ r6 h% {
namespace fy_Exp{! B0 N! o! m3 V3 T% O
namespace {template <class _T>
: n* B3 H* N. y" X* z) ainline _T GetExpValue(_T t[], char& csym){
, Z4 G( m9 S8 u( r) N    char c=csym; csym=0;, m  k& \3 U5 D  @5 P
    switch(c){) t! }$ v9 K( a. Z7 ^+ G
    case '+':return t[0] += t[1];
0 A/ m  S) \6 Z$ z$ X    case '-':return t[0] -= t[1];
+ [0 |. i/ W8 ~3 i  H$ y( Z. a    case '*':return t[0] *= t[1];
6 F8 ]# K+ t9 F    default: return t[0] /= t[1];//case '/':
% }; r4 z. D$ R3 V# _4 a    }
& \  W+ D5 I; t% r; F9 i$ w2 A+ u}}# ?  J! m" ?7 w5 I; W- p8 m
template <class _T, class _Tstream>  E) u. n3 U# H5 t. u. m
/* _Tstream: inputstream, _T: get return value
! e' {. s$ N. W; g; b' o# k* Return nonzero if get value successfully */1 y) S  c1 j+ [3 h" X: h' S
int GetExpValue(_Tstream& istrin, _T& nReturn){
: G+ A) i8 D$ t! _/ v" _    _T t[3] = {0}; //雨中飞燕之作
5 S7 R/ X3 T+ }: t/ C7 _  `    char csym[3] = "++";+ a1 R1 e) W1 T
    int nLevel = 1, nERR = 0;! ^8 T, u2 d  c* g. [7 ]+ A9 H
    if(!(istrin>>t[1]))istrin.clear();
+ K' Q' b4 x1 r% q+ i    for(;;){
; Z' y3 `5 j: X0 t( }: V8 |$ O        if(istrin>>csym[2]){; u. q" n  {: }% B6 Z( f  I+ z
            switch(csym[2]){) I7 r; W- g+ [4 \- k2 K! l
            case '(':
+ m& J( F3 [' j+ W                if(!csym[1]){nLevel=0x100; nERR=1;}else+ b. I1 T; P$ E+ H6 R
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
+ i- ^! W+ {. J# V* ?                else{nLevel=0x100; nERR=1;}; W2 t- ~, l7 w7 d2 }
                break;
2 D! v$ C" D4 S* i6 {            case ')':
% K( G, H" c1 i0 Y3 y                {nLevel = 0x100;}break;- Z9 X, M; d* h# z
            case '+':case '-':case '*':case '/':; x9 s+ l" Y! o0 p; [! c
                {csym[nLevel++] = csym[2];}break;% U  h5 [& i$ B0 Y% F/ r1 v
            case ' ':case '\r':case '\n':case '\t':continue;
$ e/ C' |3 J: e7 Q- k$ B            default:( ]9 }: p! F0 O) A
                {nLevel=0x100; nERR=1;}$ N2 j7 `) f" t# ]# s3 W! A. A7 Q
            }
; S5 N, s% v$ i5 L6 z            if(nLevel==0x100)break;
( ^+ T5 s2 P- i            if(nLevel&0x10 || istrin>>t[2]){
, [; q* V  c4 ?/ W# a* N                nLevel &= 0xF;
) ]2 A( Z& ~; ?% x; Z4 [$ g                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
( `( L/ o' T+ z  ?7 |( ^                if(csym[1]=='*'||csym[1]=='/'){  D. j6 h& |- }+ K
                    GetExpValue(t+1, csym[1]);' j( Z3 I3 i. u' l3 \
                }; v, }3 V2 W# m
                else{
4 t5 ^6 j3 b3 C* X                    GetExpValue(t, csym[0]);2 c2 X2 i/ C3 i
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
/ n& A2 w9 J  c. e2 R9 ]                }: B: s9 |0 w, I3 D
                nLevel = 1;
* L% u) o7 T. r6 `* V3 ?            }8 Z, M. A  ?0 I. ]
            else istrin.clear();
  h4 a3 r$ Q5 T* D5 J# ^- m+ N        }+ }8 {  W% y2 `
        else{nERR = -1; break;}
/ j* Q& a, U3 @    }7 w) j' U# ~6 \/ |
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
; U* s1 a5 f' o- g8 T6 E' m    else nReturn=GetExpValue(t, csym[0]);
- e: f1 z9 F  m* D9 \+ m2 W3 y    return nERR==-1?1:0;
/ a' {( m/ a: S}}
) Q1 b# c/ c7 j- H) d
3 p  Z* O2 o4 c+ Q9 M- ]' }
3 {3 z0 x$ ~6 ^+ A# g; g" T) U& m. f; O& R( Y
函数模板使用示例:
& x$ A2 d0 {: T+ O% V* i在以上那段代码的后面加上以下代码:
$ ^( z- s1 `& Q& b0 `. D, Y3 w0 S  Y1 v
) x5 Z2 n. _& f& y+ h# S/ E

' r% j% y7 v8 {* F7 |# ]程序代码:
8 d2 m* R; G) @# M2 x& h/ r# [1 s- K7 w" Z6 F
#include<strstream>2 e0 v: m1 Y! Q5 y# |) y
#include<iostream>: K0 ?' y; x  R9 g+ K
#include<string>
. `% f# c( N' O+ n2 E$ c- J4 }1 Jusing namespace std;
# P$ ^) d% p, L  Wint main(void)
& n* u) q1 F7 j{5 U1 F4 Y1 }1 c4 \. ^
    string s1;
, \" @6 s: i; p    while(cin>>s1)) v! n0 l5 J; J  M7 _
    {
$ ?- i) b9 `" N& b. j        istrstream isin(s1.data());+ K( Z$ P$ z/ X8 T) {- m. z& X
        double d;! u" _: y$ p- B& g3 z. i: G
        if(fy_Exp::GetExpValue(isin, d))+ h7 J/ o% [1 ~# A* ?" S" v5 p: q0 u' c
        {6 G7 }8 G0 f& Y
            cout<<d<<endl;
4 Y, M' v" |5 w7 {# ?5 U* @' d        }5 l; D) M  w# ?  O( {* k
        else
6 C# M2 H% Y- m        {
$ i! \" `( }% ~4 n% @            cout<<"ERROR"<<endl;
# ?) W; w0 B& N! m8 \% g9 p        }
( \4 t  k- ^& W0 E+ g0 E  s    }
& g" C: {1 B' ?+ t/ i    return 0;
8 Z, I9 c0 R  a' h; H+ V5 n}
! r, @' M* W6 }1 \$ H3 d& x9 T' x1 p( y1 n- E$ ]0 D

: |3 L, I  G, X1 D然后编译执行就可以了(*^_^*)
' Y; @7 m9 C/ n& _0 g其它:TC++上一定编译错误,不保证在VC6上也能通过编译' y! _5 P3 G2 m7 K/ o
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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