返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
5 R7 l6 X7 E' l" `! ?& f' c. ^( [3 j一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
4 I9 E4 I! o& I只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
( k8 c% G5 v5 t- C3 |" v参数解释:1 a+ r2 q* a! j- ]
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流8 D: n" `8 S6 r' `6 `  l+ Z: _
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
. w+ T3 Y  a  N' I0 |返回值:* ?8 D- ?! H, ~% \1 K8 }6 d
返回非0表示计算成功,0表示计算失败有错误6 `8 c/ L% G: W) A. }
8 F2 n# R& M. A, ~6 V' g

6 Q- h5 v9 ]+ X, K  Y
- _7 Y& |7 p  _程序代码: + |) b2 I6 i: X. L9 c, u7 {

9 S5 d" N) R/ s$ xnamespace fy_Exp{
/ k- L9 p, U% H2 g6 Z1 s* t7 ?9 L4 dnamespace {template <class _T>
: E% W/ S" I. X( i  X2 J  Tinline _T GetExpValue(_T t[], char& csym){* {! \5 m' X7 |2 A- V
    char c=csym; csym=0;
0 v* O5 K3 S" D: j  C& e  ~    switch(c){3 d% H2 t* R+ ^# d3 a+ }
    case '+':return t[0] += t[1];
) N. q( q4 l% d# c/ m3 c    case '-':return t[0] -= t[1];$ e' A3 C3 ~; F1 _4 T: H
    case '*':return t[0] *= t[1];9 [/ Z6 w6 c0 s  f7 \7 W
    default: return t[0] /= t[1];//case '/':3 C  z! q: Z. i+ @
    }( K7 w5 V! O( r1 }$ Z! y3 L! X
}}3 m2 k4 P0 B$ C% h1 o
template <class _T, class _Tstream>
; a. F0 F: ]2 D. }# T$ R: Z/* _Tstream: inputstream, _T: get return value
, m8 t0 N0 u3 Q" P1 I7 u6 O4 S* Return nonzero if get value successfully */
% o5 H. O" }' ^/ o6 y+ d2 ?7 c' A: |int GetExpValue(_Tstream& istrin, _T& nReturn){8 |" v4 M6 f- P( m! D% J
    _T t[3] = {0}; //雨中飞燕之作
; `1 g/ l5 h8 [# n, a    char csym[3] = "++";( k; c  N. @. `" M
    int nLevel = 1, nERR = 0;
6 R% r+ H+ }& w    if(!(istrin>>t[1]))istrin.clear();
; D: H& k+ X+ C3 M8 W" u    for(;;){
" u" [& S- F0 k" Q0 [9 Q        if(istrin>>csym[2]){
9 J; K' R! B0 Z" I            switch(csym[2]){
; ~5 k) l$ H8 ]% K            case '(':
5 C1 Q8 p. ^5 b; }6 V  [3 p                if(!csym[1]){nLevel=0x100; nERR=1;}else
' \& Z8 Q4 `0 q$ N                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;  }) c- R& g/ c: y! w- _' P" C
                else{nLevel=0x100; nERR=1;}7 Y0 }0 C# r4 m4 h) y5 s' q
                break;
9 r% t; s( O8 G4 U% f            case ')':
# H. f5 y6 H9 `9 v1 X$ V; V                {nLevel = 0x100;}break;, r0 P3 P% Z7 o$ b' ]
            case '+':case '-':case '*':case '/':
6 }  O& C( A+ i0 W# u) }                {csym[nLevel++] = csym[2];}break;
& G# {4 @4 l0 z+ E/ ?/ l# Y: E            case ' ':case '\r':case '\n':case '\t':continue;% L( `! }3 t* [) v9 L! d
            default:
+ Q0 l0 f* v  [1 }1 b9 }                {nLevel=0x100; nERR=1;}
7 U& X% L5 x  u2 T$ @1 e1 {            }
* k: ]2 T5 ~1 c: V. y9 f            if(nLevel==0x100)break;1 T3 |1 A+ E# }& k9 J
            if(nLevel&0x10 || istrin>>t[2]){$ n* w6 V$ d8 `
                nLevel &= 0xF;, [$ {* W  A  Q% W
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}' E  ?  s3 d) j- I0 ?& P
                if(csym[1]=='*'||csym[1]=='/'){
* b' _7 G3 x# P4 S/ ?  k5 @( S: l                    GetExpValue(t+1, csym[1]);3 E. U1 F2 d: p: x" V; T6 e0 p' J
                }
4 @. T5 C+ D7 P6 Q7 n& W                else{. h; t; A* B; R; M" x  j5 n
                    GetExpValue(t, csym[0]);
" p9 }0 g# |" ?/ h- v% f                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" W3 x, s* D- T* P                }
0 z2 u0 s1 L9 n5 J4 e, x* k" U7 P                nLevel = 1;
6 n' p  a. C5 s; f5 C            }
0 ~) G. \/ C' K4 C( T" h* U) q            else istrin.clear();# d% q( Y; v! A! l
        }
, V- h- \9 |/ g8 M1 Y; D        else{nERR = -1; break;}, M7 N9 S* a! }8 H6 T+ k3 _
    }  Z& H% B9 m4 F. t# j/ w4 X
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
! {$ a) T5 o; S    else nReturn=GetExpValue(t, csym[0]);
/ d8 u" ^' s6 t    return nERR==-1?1:0;
, R* n4 |( y6 P* E}}! T( R: \$ Y* }" b8 y) \
2 D( N4 c- j  B! C3 h* x

" m* T2 r0 g9 O# q0 m9 Y; M3 f) \/ U. u5 F( _& T& V( [; @+ _- H. @
函数模板使用示例:
4 i; q+ J6 h$ b# V+ T* N在以上那段代码的后面加上以下代码:
9 g9 Q+ x/ [* ]% y& A7 G
& G& @  T5 H  f' U4 v % E% f6 M. r4 |3 r# Y6 a% n* \4 H" n

' F1 i: L& h7 Z; Y/ v* Z程序代码:
) M4 D% f7 c5 U5 S, B3 v' N1 N2 T3 K9 K6 w
#include<strstream>
9 Z" Z% x. \+ D+ q' l% M#include<iostream>$ L+ L8 z. s$ q) o1 `
#include<string>8 K/ s4 Q! T2 m3 T# y3 x
using namespace std;
, w2 {* Z2 P; X2 T  O: _! yint main(void)
" @! J- Y# D8 j6 x{
  q( A" G( T: n3 D    string s1;
9 U4 `2 n/ K% w" A    while(cin>>s1)
( O4 v/ \1 V! O    {% Z, t  ~6 c# S8 p0 }3 H
        istrstream isin(s1.data());
1 y: w( r4 X# m        double d;
8 B( |; F: p8 L        if(fy_Exp::GetExpValue(isin, d))" G  S5 ]9 ]  d% R
        {
* e& O; ?2 w, c2 S, V. Z3 o4 @            cout<<d<<endl;
$ o& D: G7 N& {. V7 M$ d        }
8 y  E2 A0 F. \: J0 o, I8 c" M. w3 Z        else
' s7 b* Q7 I  _# P7 A% M        {; L- E1 i' ?# G
            cout<<"ERROR"<<endl;6 l; E6 M! B! h% ~
        }; F* N+ g. h: d0 L; l" Q5 y
    }
6 ]8 H& y) D8 I  ^9 q1 {    return 0;
5 A  L6 e2 R' h  j6 `! X# m+ K}
# J. B; X  a$ d, N% J2 T4 H" R0 \: V7 w& X- M
3 ]$ S# d$ @6 }( c$ l0 J
然后编译执行就可以了(*^_^*)
; r0 q7 h- \5 _" ~. m其它:TC++上一定编译错误,不保证在VC6上也能通过编译
/ t7 d! ?' r+ i3 d8 c: {# x      建议使用VC7或VC更高版本,或者使用GNU C++编译

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