返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
/ Z* F& E: Y( w( n2 V0 t% ~7 v一个很方便的函数模板,可以并且只可以计算含括号的四则表达式4 q: R6 N3 J$ S1 i7 k: y/ j3 r
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn), Y+ u. e- L5 Z% y
参数解释:6 m) F- g" u( Y' T( _9 _- \5 t
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流2 a2 G' h+ m3 k
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
3 q% g9 T0 `' }' d! {返回值:9 `$ k! X" g' q( ?
返回非0表示计算成功,0表示计算失败有错误
* N3 N+ S3 x0 E/ g) l7 E
" N# I  w5 T, k9 `& l
! s' Q0 @! c% X" f9 v1 R$ Z3 U
5 g( H. {+ Q8 c- k- b8 Q程序代码:
/ |3 _* j/ C0 l& a8 t& s
' S# \2 ?0 U7 \$ o, f$ @namespace fy_Exp{
- V+ e7 }% S5 l7 o, Q6 `4 Gnamespace {template <class _T>
5 E2 G5 h3 \4 M: X) E9 Ninline _T GetExpValue(_T t[], char& csym){. ?8 x/ e) Z) _: Z
    char c=csym; csym=0;
5 e3 Q+ z2 f2 g* n4 s8 s" x    switch(c){, x$ ^! c0 Z* Z, V/ Y
    case '+':return t[0] += t[1];" G6 @' t2 A. n: u
    case '-':return t[0] -= t[1];
( f; K% k$ Z  ^8 U0 f    case '*':return t[0] *= t[1];) p: v0 q& F9 \0 s" k. p, M+ z
    default: return t[0] /= t[1];//case '/':7 [- Z3 G8 U  L& E
    }2 p# ~% r$ b; P- Z
}}- T8 @! M3 }$ L
template <class _T, class _Tstream>3 f6 E8 P8 U* v1 l6 ^
/* _Tstream: inputstream, _T: get return value- C' D7 b1 A' c
* Return nonzero if get value successfully */8 g% W3 y4 @  B' @  h
int GetExpValue(_Tstream& istrin, _T& nReturn){
3 g, ]9 S4 I0 ], m* v% }    _T t[3] = {0}; //雨中飞燕之作
) `% x) u! p1 K; j) O    char csym[3] = "++";
1 B* B+ e# H5 U+ h$ k9 d    int nLevel = 1, nERR = 0;
9 \' x! H2 V/ `5 r3 a9 M$ ?    if(!(istrin>>t[1]))istrin.clear();
. ?# M9 {2 @$ w  y# m    for(;;){
6 a) f3 ~0 O4 Q. O/ `9 n3 b        if(istrin>>csym[2]){% ?3 ^1 R3 h; J. ~, W) p1 R7 p
            switch(csym[2]){( ~* N+ ^+ L6 Y* x/ m
            case '(':
8 i) H, {# t* j  N1 ?! c" r- Q4 j( S                if(!csym[1]){nLevel=0x100; nERR=1;}else- j4 E6 s+ }$ k8 V8 m- @
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- l3 \; V1 v% r- w
                else{nLevel=0x100; nERR=1;}: ~+ S+ W  a; y! {
                break;
5 Z- d' z* \. f3 t# H( k* T$ j            case ')':. m) p; N9 {& Q! v5 g$ e. ?9 U: o! D0 m8 ^
                {nLevel = 0x100;}break;
9 g% f- E9 r/ M" K% f            case '+':case '-':case '*':case '/':" |/ k! q0 @4 J  m: Z$ U8 n: G: u/ z
                {csym[nLevel++] = csym[2];}break;
' y- i2 I# C( N3 ~            case ' ':case '\r':case '\n':case '\t':continue;/ z1 b0 }. d( d1 C& c/ j" N* t
            default:
0 @9 H  n* H% D' ~7 y                {nLevel=0x100; nERR=1;}
( i* X: S0 G/ n' W) S            }; p0 N) P- u2 G; K- d, }) O
            if(nLevel==0x100)break;2 r* ^4 _0 E. q4 X# }# z. c1 G* z
            if(nLevel&0x10 || istrin>>t[2]){# Z2 J4 r4 X! P2 h
                nLevel &= 0xF;
+ Y, J9 V& ~; x                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
: h9 I$ ?7 q3 L# \, o9 d1 K2 T0 Y                if(csym[1]=='*'||csym[1]=='/'){
! j* B7 n8 [/ W" S                    GetExpValue(t+1, csym[1]);
: P; @5 A6 l. V+ @1 C                }! e4 z/ `. ?* H0 `  b  _% n
                else{' w, o( ~: ^% Q. w1 K! ?; D
                    GetExpValue(t, csym[0]);" m# k+ S% V4 K+ T' @
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;& ^" v3 N% @0 m/ J' h' G; O
                }
, a, b# b1 j, ]' B# \* B                nLevel = 1;5 D. E9 R' U  ?3 d- r
            }
6 ^; ~! t4 _; k8 B: G) Q            else istrin.clear();
/ I9 K' x' c; @* O8 K1 t( U! a        }7 R/ A, k, C* T4 z7 V% y
        else{nERR = -1; break;}2 V" g! j; F* f) \3 |# v- U5 w
    }( D- S/ [$ [, H: t2 A: ~9 G
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);( v- G9 {+ v& O
    else nReturn=GetExpValue(t, csym[0]);  _* O. a& A# v4 ^5 j. x
    return nERR==-1?1:0;
* B( n( A" b7 p9 Z1 I}}) w1 S1 C! j. c* L( n

" W7 ?. h$ W8 f0 y% Z, |$ X5 w$ I  w1 T. y! ^

, [+ d* y) G/ l函数模板使用示例:& J! V; c8 D4 g1 G; ~
在以上那段代码的后面加上以下代码:- M1 y7 c4 U" k6 E, H
- z1 c2 S8 q( o! Z
" Q8 l7 n! K8 m0 ?( e

! N  l0 D8 N  }" E程序代码: + U0 C( O8 s7 t
  r! S1 a2 S' N/ u  Q
#include<strstream>
' a" X9 O, [% V+ K0 S#include<iostream>- A7 t9 x) F8 g  Q0 j
#include<string>
$ {  Z! P! S- X9 v+ _using namespace std;& H  b% R2 o0 ?0 A
int main(void)7 I' j# t' y0 Z* C/ D8 ~* ^* R
{# Y8 J  a& z2 r0 }5 j
    string s1;
  u- F, F% ]) w6 G* z    while(cin>>s1)
/ Q& ]4 ~! }8 a3 t/ R/ D    {1 x$ y/ s  g! [  [/ c6 E
        istrstream isin(s1.data());
4 Y9 I. u. o3 A& \( z* ~, O        double d;
8 _6 x/ N) N/ q+ H  p. b        if(fy_Exp::GetExpValue(isin, d))+ e+ }; Y/ i$ g' g& ^
        {
. D6 |) b- L9 x            cout<<d<<endl;
- ?6 l) F9 K  f$ c+ z" G6 Q! ]) A        }! E# [' n: o; ^; N* X6 G7 g6 ~
        else
0 B* J( |' D$ I8 A) j        {6 {& M2 c6 m: H% k: |0 `, Y3 d+ l
            cout<<"ERROR"<<endl;+ `) L% k& w: ^1 I' Q2 I
        }6 K" _3 v/ K9 N" H0 ^! t
    }
: R2 g& n% c3 T2 D) {+ O9 ]" X    return 0;: ~: l( D+ B5 @* \
}. S6 I& y4 m& H+ m

, k/ x! V, K, p5 F& ?
# ]2 @2 G0 A, G# ], g然后编译执行就可以了(*^_^*)3 @* z" I6 v' c
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
$ H, U4 H# ^4 n6 w      建议使用VC7或VC更高版本,或者使用GNU C++编译

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