返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
- {# N) q* s& q+ f& g/ h一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
+ ]0 r- _& i+ U0 x1 f$ L只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)3 Q1 k$ i" r( C% f8 t( A% ]+ H0 j
参数解释:
2 K6 y. @6 r$ T6 J- n+ Tistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流, z. N- E% I0 k, |9 t
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
9 i1 u( Z" R0 v2 y1 Q返回值:
- p) A& J, X) b# j% n2 ~返回非0表示计算成功,0表示计算失败有错误$ ~) y' C  R! p' b5 F

. V4 D  i* S2 d; ?* }" Q
  S. ]4 o- F3 i  k+ A# t, w, e5 F2 p1 y: _" ]5 D
程序代码:
2 W- c# g/ Z4 N  }+ j" _0 ]
% E/ B% V/ r0 C3 @6 Y: B4 Unamespace fy_Exp{
7 \' h6 T# D% Y* k- t* P4 }0 P6 F, ^1 bnamespace {template <class _T>. j0 [4 {( g, x. A' ~6 J) Z
inline _T GetExpValue(_T t[], char& csym){" L9 \% R0 V* z. p. f8 H
    char c=csym; csym=0;
% d; U; ^# r( u4 g' K" g    switch(c){
0 d8 D0 `- O2 C+ t2 ~4 d7 l, _    case '+':return t[0] += t[1];. v( X& X. {" e: w5 C
    case '-':return t[0] -= t[1];+ q6 Z/ o) d; J0 C2 I2 o
    case '*':return t[0] *= t[1];
$ V+ ?) s. i! i* ]; d' y% [    default: return t[0] /= t[1];//case '/':
, V& h8 H6 l: C+ P& ^# [. |7 L& M% s    }0 ^5 b5 L& U% S. m9 e6 ?
}}
( T! T5 |, H3 E, itemplate <class _T, class _Tstream>' k8 ]4 b5 O# W& x7 T5 k* r
/* _Tstream: inputstream, _T: get return value
7 ]* n. p# e8 p" b( J8 k* Return nonzero if get value successfully */$ J, h% T2 m( N) t
int GetExpValue(_Tstream& istrin, _T& nReturn){
9 B' F) n) C$ j6 j2 R    _T t[3] = {0}; //雨中飞燕之作
4 Q( \5 u8 R% i    char csym[3] = "++";
& j6 O( X: F. a9 j" U( C+ V5 z    int nLevel = 1, nERR = 0;
8 w& c4 U' h1 [' `# [    if(!(istrin>>t[1]))istrin.clear();
3 v$ Z; N( r% q7 s0 p1 q* L2 Z    for(;;){3 e, z: G9 U) V6 \8 z
        if(istrin>>csym[2]){/ a# P. o2 g4 O- t. r$ f. G
            switch(csym[2]){
! _/ |/ k4 i" y            case '(':- g7 h8 B/ T, U) k
                if(!csym[1]){nLevel=0x100; nERR=1;}else
) O% ?7 ^; Q- s1 x2 x                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
; F3 E+ W( R: j$ `) r5 R8 F# j                else{nLevel=0x100; nERR=1;}
* W1 l+ l8 Z  x2 m                break;3 P# ]2 c  p( }/ G
            case ')':
9 x) A8 A& @2 N( o, c9 l7 I1 s                {nLevel = 0x100;}break;: |' O2 v6 {1 i" `# t3 ^5 }: {, x
            case '+':case '-':case '*':case '/':1 D% ?2 d! F# p" d) D$ ~# S
                {csym[nLevel++] = csym[2];}break;
6 k7 W3 h( s# ^/ [1 h) z            case ' ':case '\r':case '\n':case '\t':continue;
# Y) O& [: S0 U7 V; ~            default:
% L6 q4 B2 M1 ~& r4 y* [2 F                {nLevel=0x100; nERR=1;}. J4 u& B* n& m! ]( K
            }
4 I# n/ ^; S) _            if(nLevel==0x100)break;5 I2 c! E. ~7 o6 V% E( S, [
            if(nLevel&0x10 || istrin>>t[2]){
( k+ u! x2 P+ e* y3 u7 @3 U4 p                nLevel &= 0xF;  Y  i9 Z- A; b7 {
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}+ \& H- _# c# _3 y' s' h3 p
                if(csym[1]=='*'||csym[1]=='/'){- [0 Q- B7 V; U" m+ {2 H
                    GetExpValue(t+1, csym[1]);" C  V( g6 I/ @/ |9 L8 K8 S
                }
; G% F- [6 Z/ F2 p8 w                else{( N3 V. C  v% t1 F3 D& M
                    GetExpValue(t, csym[0]);
* @8 W; f' m8 V0 ~3 u" _3 f                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
; o+ b- V" h3 p1 G! L) G                }
( g% C! l" T# C: y" U, V                nLevel = 1;
! r/ P, l; l5 F3 R' |8 _            }) t3 Q, x3 y3 Z  Z5 L; ^
            else istrin.clear();8 i7 H- Z3 X# r. F+ z) J
        }
  j' }: E( S) \7 ]        else{nERR = -1; break;}
  k: a' ]  b/ J5 H1 M  M( h; w    }8 S2 E# C; I* S  u6 O. Z3 j
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
, o* s$ Y, f& F  n6 k    else nReturn=GetExpValue(t, csym[0]);
7 w+ d& i+ p- O' f* {: G    return nERR==-1?1:0;" l  n7 J: V, G+ S. S$ w  l
}}
9 t3 |0 B' ~* z& @" y: }7 c; K) }8 S
2 z. C7 ^) C9 s3 ?2 z+ c5 J7 o7 ^$ g* l# J

! }8 u5 K3 c: O; _函数模板使用示例:5 g% [6 H9 Y1 y6 m4 H
在以上那段代码的后面加上以下代码:' x/ ^: h: N0 V
/ N' n8 @9 n+ B( `( n0 m( I

$ J. b5 o( ?1 z: s' N1 E0 K  F$ h! [! I  V+ m
程序代码: 8 s3 X: ?0 g+ T
5 N" c+ d1 Q) G) U5 ?% c
#include<strstream>
# S: Z1 o6 Z" p$ j. I6 k#include<iostream>
$ m( X; s2 ?+ f& M+ U2 n#include<string>% i6 r$ X- f( a/ x
using namespace std;
0 A: c( d8 T4 A) V" d$ Yint main(void)9 u  J+ o& i" X4 _. y9 p2 z
{
% {$ `" x5 L( o) _    string s1;
+ K# m5 u! I& [, G( V: U    while(cin>>s1)3 r+ r3 a' J+ F; K! x2 p8 q0 l3 d
    {
$ c0 s6 L- Q, R1 p' b+ a        istrstream isin(s1.data());1 y4 H* C6 t% S+ H. ^  L
        double d;
4 v: f3 a& V  W1 a2 q        if(fy_Exp::GetExpValue(isin, d))+ o" n* K5 o$ x( S
        {2 C1 ]% K$ y6 a& J/ V3 o, G
            cout<<d<<endl;" U* w" [8 w2 ^( C0 }7 s
        }
2 b  K$ {$ m( ^" g. {# `        else  \- m3 E# g; h
        {
5 L! k* v" a) y6 M4 N            cout<<"ERROR"<<endl;3 b2 K) e! T7 _4 R; e
        }% B- V0 U% f) I
    }" y, `6 I7 n9 V2 X
    return 0;
( U( J, L, T6 c& n# I}! u2 m8 H0 Y3 a+ ?$ ?

& z9 M3 g% Q. v8 T* r' `' v
- f; R; u8 p1 N5 ~8 C然后编译执行就可以了(*^_^*)
8 g2 r# A1 I, O其它:TC++上一定编译错误,不保证在VC6上也能通过编译
2 V4 y* q- c3 ?/ ~      建议使用VC7或VC更高版本,或者使用GNU C++编译

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