返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,' G4 M7 N  G$ x7 c( p- e
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
* ]- L- y, m7 a' b7 j只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)% Z) A) G" A; u) W5 T! A8 p3 a
参数解释:' A- z! [( i* Z
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流3 Y) N! Y4 |/ E4 C* l8 W: W$ {& c# Y
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定% e  K0 i, M/ e
返回值:
9 b3 J9 `9 l' M5 T: a" m- S返回非0表示计算成功,0表示计算失败有错误7 D+ @# i4 O! `  i

& T: ~- k5 F  ~( m) Z. {: S7 U3 |
. e7 }: d. ?0 {# G5 d3 }# J; d
' p. R5 H6 h' H% P( {7 U( n程序代码: 3 I. @1 F4 x% Y

4 m/ K  P7 ]% Hnamespace fy_Exp{
, j; S- J& ]$ g$ ?$ c. tnamespace {template <class _T>
$ p1 H' f" g4 [1 minline _T GetExpValue(_T t[], char& csym){. b$ L7 C3 ^+ b
    char c=csym; csym=0;4 X9 _# S+ Q: r, ?! x
    switch(c){
9 t' |4 X; L* I; t" J1 C    case '+':return t[0] += t[1];0 \; L9 K/ l  ^
    case '-':return t[0] -= t[1];
; p) f3 P4 @& |6 r$ a7 o4 Z4 {    case '*':return t[0] *= t[1];
' g* p. q7 n0 D2 q1 I    default: return t[0] /= t[1];//case '/':7 J- K: Y) s  E" W$ ~- D* n
    }' X( h& a, h; l
}}
+ C" q) v" V/ K" }6 @. ntemplate <class _T, class _Tstream>
# L7 c. y1 u9 [5 w7 |# C  ~1 k/* _Tstream: inputstream, _T: get return value/ `( p% C. U& q
* Return nonzero if get value successfully */7 D4 c& c; i3 r+ g; `& h5 U6 o
int GetExpValue(_Tstream& istrin, _T& nReturn){
2 I% ~1 ]1 B! |# j& a    _T t[3] = {0}; //雨中飞燕之作
) z  u& b: e8 p2 m! H    char csym[3] = "++";0 h; p% V7 x- W0 `( a& y
    int nLevel = 1, nERR = 0;5 i6 i" S" V( C) g$ H
    if(!(istrin>>t[1]))istrin.clear();
/ n9 z$ |8 Z7 \9 }7 f. j  [    for(;;){1 N* b( J5 c5 R  ?1 \# C" s+ v, `
        if(istrin>>csym[2]){  \: y* O* [& U% T& Y
            switch(csym[2]){) Q* E. p6 Q/ t; @% z  d/ A; G. I
            case '(':
: a$ G1 M, l7 E6 `/ m                if(!csym[1]){nLevel=0x100; nERR=1;}else
& o0 P5 m0 U5 L                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;  h, }& g2 H1 T3 w" g- c/ c, V; p
                else{nLevel=0x100; nERR=1;}
! @( t( W% _# C# |6 R% R1 B; X                break;$ U; ^3 O2 {5 P( s& j
            case ')':- R  H, ~2 x' j' N
                {nLevel = 0x100;}break;
) N2 Y5 S) N) q            case '+':case '-':case '*':case '/':8 \# X1 c) g1 R& U5 e8 d
                {csym[nLevel++] = csym[2];}break;, y1 x0 T: X* p( m( j9 y
            case ' ':case '\r':case '\n':case '\t':continue;
: A0 Q* O: L/ G9 q            default:5 Q& f* f! x/ N+ h1 m* z& k% V; ]
                {nLevel=0x100; nERR=1;}0 c6 u! n1 r- n. z, X" a
            }
3 k9 ~+ a4 L5 X4 ]8 N9 F            if(nLevel==0x100)break;
/ Q1 H% g5 m! A" B            if(nLevel&0x10 || istrin>>t[2]){
  L7 l. q' n! @2 t                nLevel &= 0xF;. x2 p/ X/ K: u4 f
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 J9 n  i8 v  [                if(csym[1]=='*'||csym[1]=='/'){
7 |7 ]( ^/ A1 ~5 d0 s                    GetExpValue(t+1, csym[1]);
& ~$ V# K6 y3 l  Q4 V2 w                }
; d" p) D8 O4 }/ l) j3 Q$ e8 g. S                else{' j! g% _. A6 z+ n9 [) w$ p4 w
                    GetExpValue(t, csym[0]);
9 _) F, W8 ~! O1 Z( k                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
8 j9 D' O3 p3 x                }
/ Q- e% K/ i* a9 c                nLevel = 1;/ b3 D7 \6 `: ]" |
            }2 G. |1 P5 a  D9 E: `* F
            else istrin.clear();
$ j$ B3 B  l- [* V' w8 o        }4 @% u8 e) D- N8 j$ u1 r; ^
        else{nERR = -1; break;}
: W1 z5 s9 f& J    }
, e1 ?3 _! W1 u    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);5 e; o9 D7 n( K
    else nReturn=GetExpValue(t, csym[0]);
, u5 }+ u. A/ |! R5 F9 U    return nERR==-1?1:0;
) c# [# e& I% }: E; o}}: w& Z0 z8 L7 p) O) O* ~: g" s
/ `2 i# _/ I, C9 c

0 E+ Q0 s7 A8 j4 ~
3 u. |6 v/ T6 A函数模板使用示例:
; f: d( w- B. X( e6 i) ]在以上那段代码的后面加上以下代码:0 d- w6 }1 n: m! n" R' r
5 e# D* V% m! K9 m; \

; R. C* e/ m6 Y3 E8 x" ^1 V7 ^, U
  B% H4 J& [2 Y+ [程序代码: $ J( W( u1 J1 ^
8 M1 D) Q/ N2 ^2 A3 x% A
#include<strstream>
  D+ V, M0 I) U4 f! z0 g* B( X#include<iostream>
' V1 ?9 L4 s0 C! E" }8 m# x, v#include<string>, J4 ~: k$ q, S6 r1 J2 `
using namespace std;- G  A" c5 q$ V2 _( f
int main(void)
9 r6 T: B4 ?! w; J. n* w5 s# @{) T- G# p+ V! _% P" f: n/ t4 c$ N
    string s1;, Z. D' {$ u% ?" C  ?7 }
    while(cin>>s1)1 W1 A- O$ j4 N
    {
" ^- m" m- d" I, M! k        istrstream isin(s1.data());
0 i. V% {1 T: j+ \        double d;* ~" ^) g7 }& ]
        if(fy_Exp::GetExpValue(isin, d))9 e3 T: `& z. _6 o
        {
* c4 A. R- b& V- M1 H            cout<<d<<endl;! Y* F, j9 k6 _
        }0 S* I- j+ O3 Z0 E6 F; i# p1 C
        else
# w1 M3 h* v! v        {
2 n" B+ N  h8 }, {3 i            cout<<"ERROR"<<endl;
, ?3 V" \( s) a/ e4 t: B7 }        }
3 P+ D7 A( S0 N6 y4 }; R1 h/ J% Y0 x    }
% j7 B. L* O. @2 Z1 o, u6 A  i3 _- ]% U    return 0;6 n4 l- g+ Q& j. O
}6 {  i& R, g, u6 Z- j
8 W9 _. d+ ?) \) u; o! V

. K/ u. d% z6 _  }8 e然后编译执行就可以了(*^_^*)- ~7 O7 z* y( ^
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
& Z& R& f8 n  ~, U      建议使用VC7或VC更高版本,或者使用GNU C++编译

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