返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,& e7 a0 y( q. h1 E0 v
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式, Y3 F9 e5 u7 U- W
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 `% Q2 J+ D+ z参数解释:
7 D* o. G1 s* ?  tistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流* K# M- _" C  c6 Y
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定1 D5 z2 Z5 q! w; i9 e7 v
返回值:
6 g! T4 u  ?6 v; x. a" U. [* x% z返回非0表示计算成功,0表示计算失败有错误+ T: G/ n+ D8 C
3 A# ^$ R, J! W/ U; @7 L, _% L
4 q6 @0 k- @3 U9 y" ~* O

- [( \! g$ |& b: v; M: I& X程序代码:
7 C0 i2 _2 |7 @" f
) q, O% K$ t( S$ i5 F6 C$ znamespace fy_Exp{
1 M3 @# j% k' w$ Ynamespace {template <class _T>/ {0 n" H0 K1 b9 }$ P8 C
inline _T GetExpValue(_T t[], char& csym){$ S6 L9 @1 L. n/ M/ g; i
    char c=csym; csym=0;
3 Q7 o7 F& r$ H! a2 E; o" E1 G+ n    switch(c){: M/ F" ]$ z6 f# D6 T+ z
    case '+':return t[0] += t[1];( H( l% {9 w, X2 |
    case '-':return t[0] -= t[1];) K! m* H' Q5 T) B4 \4 a8 Y
    case '*':return t[0] *= t[1];( ]+ y) W1 w/ H0 G/ I7 X
    default: return t[0] /= t[1];//case '/':
. u$ I! }& ?0 H; S6 `    }; w9 A& H: k2 ?1 q3 n( J5 d0 i
}}$ x; Y2 L* ^3 D) F6 A
template <class _T, class _Tstream>
( o; Y1 m- p+ A. ^/* _Tstream: inputstream, _T: get return value
  x# ?/ h) U% V8 m* Return nonzero if get value successfully */
" {$ ^% J- d1 G3 c' gint GetExpValue(_Tstream& istrin, _T& nReturn){
5 @0 F+ ~. l% J1 ~    _T t[3] = {0}; //雨中飞燕之作
8 h$ E3 ^4 Z1 V& F( }0 P, k' ^- |, R    char csym[3] = "++";* W$ E  S  H3 h( |# t/ B8 a9 O
    int nLevel = 1, nERR = 0;' l% \" c2 c! e3 q( q6 q3 F
    if(!(istrin>>t[1]))istrin.clear();
, r. `- I, u+ R6 V* J    for(;;){/ C! ^: `  V3 ~, ?! @
        if(istrin>>csym[2]){- J# B: Y8 N- }% r/ z- n' X
            switch(csym[2]){5 j9 t! Z, s: o- M
            case '(':
( G5 B! Y2 R$ m8 j. [/ [                if(!csym[1]){nLevel=0x100; nERR=1;}else2 c$ u; T& o$ n/ a0 n' T
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;+ ?8 B$ i1 _: n
                else{nLevel=0x100; nERR=1;}
* K2 Q- Z7 z  X9 r. q                break;
1 K+ \3 H2 Y7 u3 V5 x3 ^8 c            case ')':  h6 k6 F' X( e' R! [6 }/ Z
                {nLevel = 0x100;}break;8 f1 `) O: E$ N
            case '+':case '-':case '*':case '/':
( z/ y5 f0 c+ P# e1 F" j7 [                {csym[nLevel++] = csym[2];}break;, f  W* M! e! q0 C$ m9 o, m
            case ' ':case '\r':case '\n':case '\t':continue;" Q) H5 \& m+ ^2 z6 K* Y
            default:
: p% o7 R% b6 h( n" ^                {nLevel=0x100; nERR=1;}1 G0 T% l5 `7 s% h$ A- p
            }, h- |& `- t! f6 V6 M; ~9 O) \
            if(nLevel==0x100)break;
" B/ w) m$ ?; e$ Z$ v; e/ U# k" |            if(nLevel&0x10 || istrin>>t[2]){
! W* K, a4 y6 {                nLevel &= 0xF;
) p+ p, N) d, ~. u$ U1 ]0 J                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
+ ~8 _  {" |1 c/ ~5 @+ {# {: V6 K                if(csym[1]=='*'||csym[1]=='/'){
( b4 r) {: D) E% |( M6 b# h# Q                    GetExpValue(t+1, csym[1]);
; M8 L/ w5 y7 r; L6 D                }
* @0 u5 C4 n. \$ C7 C9 w                else{
5 }& E/ l; w2 A; |. k  F                    GetExpValue(t, csym[0]);
7 j7 n) W( F& S; Q' ]& c                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;' ]' a- l2 ^5 c
                }% L! Q- R& a+ v$ V9 ~
                nLevel = 1;% t' m( P3 X# \" w7 j. n1 m
            }
. [4 q4 J# D0 S* E            else istrin.clear();1 |+ F& a5 s8 W4 F4 Y4 u" `2 m3 s; m
        }5 U  K: p- x. r- {$ [) T
        else{nERR = -1; break;}
2 K. v/ a+ J! E$ l7 }1 C    }
: U: L+ I' f# g5 ~    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);) t6 Z; x! ^* h; x0 g) ~
    else nReturn=GetExpValue(t, csym[0]);' p! k+ L$ f* G% V2 o
    return nERR==-1?1:0;
( [8 N: ^! U3 J/ T7 c* y; C}}5 m5 o6 L5 L7 o* F, G; j( f

: z& }" S2 y; E9 L
, E) e2 ?% W" M; _( X: X) h  z4 e. P& |0 `4 N% Q, X
函数模板使用示例:4 Z* [2 C- B0 d; i7 R9 P: Q$ v; @
在以上那段代码的后面加上以下代码:
6 K: a6 A/ ?: d4 f' r1 H) j8 M' I/ l! w3 Z5 C$ t( V

( H" i; u$ c& r# O4 F: `! ~. K7 D8 Y' k0 P8 n
程序代码: * a% a: O; x7 k& z3 U) j
" h# i, H! l- t) E4 Q+ t
#include<strstream>
0 {2 }# ^* s4 \/ d) [0 R$ d#include<iostream>
8 p$ P) G% {  b: x6 @& f#include<string>
& p7 i* k- P" K7 }+ b" K" X% `using namespace std;; [% S: O; {; k% L; B) [
int main(void)3 ?1 M+ d6 I" z) c) D% o
{2 \/ E% [/ Z: D' E. K3 _' C& {
    string s1;
/ b6 y! Y5 t4 F# b! P    while(cin>>s1)
% D$ Q8 a. c: d0 ]1 v3 T    {1 K$ y, r4 k+ J: m9 `' J
        istrstream isin(s1.data());
2 m5 B5 L* }- h2 Y7 {1 S        double d;
, R% E$ z; m3 \( l4 u# Y8 R! A* }        if(fy_Exp::GetExpValue(isin, d))
& T* @4 k; A; s) [; ]. u0 i# m        {
5 \, ]' L# V! z7 \            cout<<d<<endl;
: L6 V) G' z* [" ~9 b0 R9 L2 f        }
  J3 w9 y. L% n9 N' u        else6 _5 A9 O% M5 V, Z7 j+ v
        {) F" _3 Y( y7 j$ c
            cout<<"ERROR"<<endl;' Y9 x& \5 K4 \6 s
        }( G8 y% ]8 A# K: @
    }) E; [7 ~5 \# t
    return 0;
: e+ n$ M: V) \3 z% m0 T4 a2 Y}
9 t7 w( s) [+ L* W+ h& V/ G5 Y& k# s% T! x0 `$ ]. _

  T2 l5 O; }* e2 ]然后编译执行就可以了(*^_^*)3 J: ^1 T2 D, b% [  I/ w5 ^/ ~7 f
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
8 N  Y- s* t) H) g      建议使用VC7或VC更高版本,或者使用GNU C++编译

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