获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,) P+ L# M. O/ K5 v9 C/ [* v2 X: P5 [* C
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式$ `9 a1 b) v' h( {) [  E' I, \. k5 p
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
! \& h6 [* d! d& U- R# m参数解释:. T; U9 U, p. ~9 n) m
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流+ G! g0 D! @$ t
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
, o& u* q# G: i* h+ G返回值:8 S' O# T* a# m4 y
返回非0表示计算成功,0表示计算失败有错误
  R+ ?9 E$ T( t, H1 `6 `" Z3 z) \
9 I* U$ y$ a! }$ x  d 9 K" |1 f4 _6 g" U" {

3 j' M+ E- x5 e( S7 t! ]! Y程序代码:
+ O1 M, C& z: d# V/ g8 b& C3 r6 O
9 s& O: z5 [" b0 n7 I2 Hnamespace fy_Exp{, i( i' ?  {6 Q9 Y+ E6 G3 Q. ]; ~
namespace {template <class _T>
+ @. }. x; ~: K* ?, k: r6 hinline _T GetExpValue(_T t[], char& csym){
1 C& Q8 n1 v  A    char c=csym; csym=0;
0 ~5 M; h$ `$ |& W6 V    switch(c){
2 ]9 _& O7 u: v) o    case '+':return t[0] += t[1];3 Z+ U) O6 \( _8 i4 s" g
    case '-':return t[0] -= t[1];
( l, h8 U0 e! `/ _0 P4 t9 D' P    case '*':return t[0] *= t[1];5 J, U" a) Y+ _2 v5 n3 r$ f% X0 S
    default: return t[0] /= t[1];//case '/':8 @3 q' G, |3 M7 m& h6 n6 H
    }: s. T2 Z7 z7 ?+ s/ X
}}. u8 D# ]$ ?. |8 s2 T! e+ b
template <class _T, class _Tstream>3 l5 h% ^" w& e5 \/ a
/* _Tstream: inputstream, _T: get return value) ]- a7 b3 d1 Q  {  W
* Return nonzero if get value successfully */
# f  ?0 w' x) r& h9 l/ ^int GetExpValue(_Tstream& istrin, _T& nReturn){
5 W. q+ ]2 f% S; z5 R/ `$ M+ P9 z    _T t[3] = {0}; //雨中飞燕之作
! v2 [2 q4 y1 E& L    char csym[3] = "++";
! c* N/ F3 d0 z$ m$ c7 n    int nLevel = 1, nERR = 0;
9 [: x2 S; e8 R$ [2 W! m9 r    if(!(istrin>>t[1]))istrin.clear();% M% S# z9 o3 l( c+ Z; Z7 N
    for(;;){
" V- E8 c, k' x" S# U- N        if(istrin>>csym[2]){) L  q1 t* ?6 h7 Q& h' T
            switch(csym[2]){
+ b% k3 P/ M- \6 j            case '(':
  x( A) f' c: T% K                if(!csym[1]){nLevel=0x100; nERR=1;}else$ X$ G. Z! }% s
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;; f9 W* a3 w: l6 p
                else{nLevel=0x100; nERR=1;}; g" a, o- ]# V0 [& F. A. Y
                break;
6 }  A8 e/ j2 {            case ')':
/ }! N$ L; s% g) B7 d' R                {nLevel = 0x100;}break;% S  C' R5 j( w; I% C6 G
            case '+':case '-':case '*':case '/':
8 \6 ^$ L# T% D+ \0 w6 E$ ?                {csym[nLevel++] = csym[2];}break;
3 p% ]9 T; Z: x; Y/ s7 a            case ' ':case '\r':case '\n':case '\t':continue;! K+ Q0 j2 l- f' q; p" ?
            default:
0 A# K4 d& e6 j5 S; t                {nLevel=0x100; nERR=1;}% _, Q; t5 n% G; W  U* x) p
            }
9 R( ~- ?6 M" E0 @5 l1 R/ ~            if(nLevel==0x100)break;- F/ P- `( ~. V
            if(nLevel&0x10 || istrin>>t[2]){) Z6 Z) S& H  L: M1 W
                nLevel &= 0xF;! @; G# L. \6 U8 v. N
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 |9 k; n, L" x& N  {! e                if(csym[1]=='*'||csym[1]=='/'){& z2 B& B& e( E, Q
                    GetExpValue(t+1, csym[1]);
; C! R) Y. A; F+ i                }
  |# W, i8 F. ?$ c                else{
; }9 U+ |7 z7 O8 t: _                    GetExpValue(t, csym[0]);* l: u4 J9 B& A- j
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;# v8 a4 H8 O0 x5 i( b% Z7 H
                }
- L5 U0 v$ D. R( T. ?" \                nLevel = 1;! }* j9 I$ |5 i/ l) Y
            }
' p2 @6 v2 g3 N7 A4 f5 h$ m9 \            else istrin.clear();8 X- A( N* I8 Q) l" d2 q
        }2 T/ Y3 g8 `/ d+ g
        else{nERR = -1; break;}( ]* x" Q! J# D0 x. i+ Z
    }5 f, \" L* Y9 o$ s8 D9 S1 \4 S
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
/ d; \, P( w& \+ W! b  j! F    else nReturn=GetExpValue(t, csym[0]);" k; ]  R/ T6 f! c
    return nERR==-1?1:0;
, D) k  v/ h4 P  u* p! O6 N7 i2 P}}& [1 I7 r6 [8 t. g' ^
# F2 J8 ^/ b0 a
8 g6 {0 _9 ^: t4 ~$ [

5 Y; L6 F" K. R& A2 y0 O, G  C函数模板使用示例:
& h9 h( V/ d* ^" {) X1 l, }. [' X在以上那段代码的后面加上以下代码:$ L2 s. O( ^3 H7 X' j9 x1 B$ a
. u; E: D6 G& w& K" P+ J
3 @( O$ p/ P3 ^: a' q. H: p. S

& G+ q9 L: Q( f) W* P  b' {4 Q: }程序代码:
% }) _0 ~5 E- `8 ?; _" o" [
( u4 U& d# I0 C5 v. ~#include<strstream>6 |+ ~( \4 u" w) ~* [) v+ f
#include<iostream>
8 O! g/ d7 [; N5 m) x' A#include<string>
" Q; X6 w! p# ]! Husing namespace std;
  {" Z# D- \: ?! E: `+ r( n) Iint main(void)
. h5 [! t* |6 ~! {- w{
" Z( Q. o6 b  ?/ m2 Y* `    string s1;; @6 d+ V2 S" Y: q' Z9 ~
    while(cin>>s1)
& m7 F; [6 c/ o# D  s( W* r8 R1 A% ?    {
2 G! s) B, B4 v( k3 s        istrstream isin(s1.data());' d' y# I/ v% C& j6 `" V
        double d;
8 {, }( Y8 f% [$ W; Z2 W        if(fy_Exp::GetExpValue(isin, d))
) G) I* C. c% H        {, L: ]) W: a# E0 C& r5 t3 G! ~
            cout<<d<<endl;9 K; J( q2 u* n/ ~+ d
        }5 L0 s; d! v$ R% d' ^
        else3 k" z2 R$ d3 g' Q9 _$ Q$ Y
        {  }, s0 [8 z$ `" |4 b1 \
            cout<<"ERROR"<<endl;. l6 z0 w  u, w4 }* Q8 ~& D
        }# t3 f% `. w5 M" e- K" m$ }
    }
8 f: S0 v3 Q! C    return 0;! Z. M2 z5 {: J/ r+ Y* T
}
1 X7 c( m/ G! p/ F/ \; A: h+ t; k! B5 V# i
/ x/ Z3 o, Y) \
然后编译执行就可以了(*^_^*)
. G% [1 ]& F* Q* P1 {( }+ J8 c其它:TC++上一定编译错误,不保证在VC6上也能通过编译+ b8 R' o( [/ c
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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