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

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

在9月8日那天我特意编写的,给大家分享的,
1 M3 z' {: A$ H( d$ C* Y一个很方便的函数模板,可以并且只可以计算含括号的四则表达式" `' ^' b5 n! r5 S. |# T! R/ ^' d; ^* {
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)# r" K% f9 H0 Q  {; F
参数解释:5 |# M. p$ y# n" K. @
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
: k/ S5 b$ I1 X5 y* KnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
  g! p7 n7 d( s: ?# W0 Z( M2 F返回值:' T' F3 o1 c8 m( z, e
返回非0表示计算成功,0表示计算失败有错误5 ^! r3 ^$ B8 k) |! ?; g5 x2 H

- C  ]: J; g# o+ N# F 6 `' L0 E- f' b1 e& r

. }5 y  s; Q9 M, V% F程序代码:
  ~# h% F! H! c" f2 L  w; _/ p, {
5 {  O3 m! J5 J+ _/ j. Hnamespace fy_Exp{
/ N; |% h. `7 u0 hnamespace {template <class _T>/ c+ j. l8 t- X; z9 a" Q9 e6 l
inline _T GetExpValue(_T t[], char& csym){
9 N! \! G: k; O. p2 o/ `- e! W0 ^    char c=csym; csym=0;( Y; p, t6 N- t0 `' d5 j
    switch(c){7 q) e+ V& {& z
    case '+':return t[0] += t[1];
. B. d" N! |% c    case '-':return t[0] -= t[1];
5 o- V2 {. C8 ?: X+ A* b    case '*':return t[0] *= t[1];5 S; a+ p; A7 |
    default: return t[0] /= t[1];//case '/':
; C8 d6 Y. I6 Q. i3 s8 A$ Z    }
' |; H. {7 s% {" ^; r4 K# u}}0 n/ Z9 N# z, K& _; Y/ ?* X0 Z4 n
template <class _T, class _Tstream>
# B. f, N9 f( b+ G4 ?2 p" h3 F/* _Tstream: inputstream, _T: get return value
. E8 Z0 K* w( c  [8 ?* Return nonzero if get value successfully */
2 ^" W/ O, Z. f8 t' ?! Q+ N5 A$ ^! \. ?8 Pint GetExpValue(_Tstream& istrin, _T& nReturn){* N7 g* O* E# E0 b) k1 K
    _T t[3] = {0}; //雨中飞燕之作  x: B/ w/ n+ e" O
    char csym[3] = "++";" g9 w0 c) n. Y& ]1 x8 h
    int nLevel = 1, nERR = 0;# b0 f7 E: |9 L# i+ ^
    if(!(istrin>>t[1]))istrin.clear();
+ l6 H: o' i+ G: z3 ~# a    for(;;){2 i/ ~0 g5 r' K+ n1 @
        if(istrin>>csym[2]){
8 F2 }& r: _5 U" c9 P) u9 `            switch(csym[2]){
# q, k# j, y/ Z; o% z, [            case '(':% n3 j$ s1 z# e
                if(!csym[1]){nLevel=0x100; nERR=1;}else/ ^1 n) b9 K& |, m9 k' |, l
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;$ |" \5 [1 N0 D4 f) R
                else{nLevel=0x100; nERR=1;}, i  S" V/ x8 C
                break;! v$ e7 _) `/ i$ [& c( n
            case ')':. K/ M/ L: i; w, U2 x5 t, }
                {nLevel = 0x100;}break;
# W( o  J. u/ k+ H8 H) g7 Q            case '+':case '-':case '*':case '/':" `. D: f4 k& p, i% E3 w' E/ U
                {csym[nLevel++] = csym[2];}break;1 ^4 t  [; i' F. t4 e% z. Q; d
            case ' ':case '\r':case '\n':case '\t':continue;
( |& f$ i" ^& w2 i            default:: s  u& t( B/ i: M; H
                {nLevel=0x100; nERR=1;}
1 y4 K! H9 n$ `. g4 ?5 ~4 z            }
2 b: v7 ^+ t1 e6 x  R            if(nLevel==0x100)break;3 [  ]! `& b: m  x4 T4 N; e
            if(nLevel&0x10 || istrin>>t[2]){- w2 i9 r/ |, o( B  P
                nLevel &= 0xF;
. j- r' s% X- M, q" o                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
) s2 O7 m" F7 D6 H1 m$ P1 r0 }, F                if(csym[1]=='*'||csym[1]=='/'){- w0 l4 u8 f0 R3 M7 f5 C- q+ l2 f
                    GetExpValue(t+1, csym[1]);
5 K& q' ?1 y4 I) W1 {                }
" h( L4 V2 U4 G9 x# j$ K                else{) U3 r( M) Z, }# R; S- Y  H
                    GetExpValue(t, csym[0]);4 a9 {6 J/ n, x8 |5 |% o% [* r
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 H, A9 P/ {- B; t7 }8 E; l
                }" g8 B$ D& e, i# P4 m+ v
                nLevel = 1;9 F) ]) Q! U7 A/ n
            }; D/ d9 ?8 o- k4 f2 |
            else istrin.clear();
) L( R+ U! |5 K6 t        }
0 v- [5 S0 P6 y/ i# t. S. X: e& i        else{nERR = -1; break;}% C0 [2 L+ a' d
    }8 F% D. W( ?6 M' e# U
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
3 D0 X, d2 a+ J; M7 L1 ~6 U    else nReturn=GetExpValue(t, csym[0]);
7 Y0 U( F+ {2 |) W    return nERR==-1?1:0;  w$ L8 j: d- Y  j/ ~
}}7 G' H7 T, c& r" w; s
& u: e7 q8 N0 Z& R+ O4 i
" F9 B: T% T- G  ]+ q

0 x9 i3 S$ C. Q5 u函数模板使用示例:
5 ?7 R% I- B2 Q* D) ?在以上那段代码的后面加上以下代码:  b" H4 e( M& W$ h$ X; H

% w+ |1 v: h% S% ^4 V 3 S0 e4 y  F& c  v* a6 r3 W
2 W7 `: Z8 W) [# f0 _/ r3 |
程序代码:
. y) a* a8 _5 _- d, N
: h/ s6 x0 s& u( O: ^#include<strstream>
" i' R  w% e, s$ V6 ]! G! C#include<iostream>
. q" c% C/ A; c6 p. A- W0 g#include<string>: I% y4 f7 r. `( y
using namespace std;* Z( R+ y  ~  J( y
int main(void)9 Q. \+ D" r7 ?, e9 u
{3 @* b* Z& \' V- z- x
    string s1;" S9 \3 w  |) z# d% O' |$ T
    while(cin>>s1)# D, o- B5 g" N- Y
    {
2 [: I, F1 k( a8 t5 r' w7 g  K, G        istrstream isin(s1.data());
) Q; T& _# n$ @  S7 [        double d;
2 c  t/ Q! D6 k$ u. u        if(fy_Exp::GetExpValue(isin, d))
4 u) {7 i" x: ?        {
! p) B: z" n( n" `8 ~, x& @% `            cout<<d<<endl;
% s- x0 T; X1 C3 s: a8 v        }0 n0 O% F9 P! ~& T0 z- A
        else
, n7 ?- m9 [/ \# r        {
  r" V1 S& m- B1 e& z            cout<<"ERROR"<<endl;! C$ J5 K) v5 z- e/ w" u
        }
& b4 s0 F/ `6 o    }
, I# ^; Z0 R! j5 X. E/ P    return 0;, x' @  b. p# A
}/ P3 L+ g2 ?$ b% o3 q4 s, m2 V

, @: m5 W2 o1 |1 r' m; S3 o1 O0 q* W0 C* s, K0 Z. J3 J, K: K
然后编译执行就可以了(*^_^*)4 x# ]3 z! G& i. B( a  r5 a
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
; d& @* g9 l2 \6 N& P4 N& B; Y      建议使用VC7或VC更高版本,或者使用GNU C++编译

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