返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
7 f& j* c: m" |4 G0 A. A. g2 m& _一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
4 _  n5 {7 n3 `& l# s" o只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn), Z9 q% R4 J% ^3 u3 Y; X- F
参数解释:
) H& a! q1 O# f, l9 Wistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
& E  W' }- i% k" L* L3 i# d& f7 o" F8 {nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
/ x5 ]. m, I5 z& N" c# H$ d返回值:- ]3 {6 r( N3 q, ]3 Q: L7 k+ {
返回非0表示计算成功,0表示计算失败有错误- e6 U# S6 v; |8 k& u/ I: d
- R; R% a! x# [6 E% S
8 z8 I) P) B9 O4 b/ h1 g) S

: @. W" H. E6 p/ ~1 j! C6 a程序代码:
$ @% q5 I2 @: T7 A/ m9 I2 T
3 g7 T* ?  ?5 q/ A7 U9 m# enamespace fy_Exp{! u5 b0 }, D; q1 A, o  h! v8 l+ Q8 R
namespace {template <class _T>
) `5 x/ }7 ]- |; g5 `4 O$ \inline _T GetExpValue(_T t[], char& csym){
9 T: y" g# y: ]% y1 b8 T3 B& B( U    char c=csym; csym=0;
: `! [) r9 A* s" A& J+ Z    switch(c){
; s( v' {" v( _' @5 k( a. O: l    case '+':return t[0] += t[1];7 C1 W# w) @8 Q: e* X& d
    case '-':return t[0] -= t[1];
& A9 x8 o6 b# ~% _' i7 X    case '*':return t[0] *= t[1];
5 I- W3 I; E; \  ]8 U5 g7 @    default: return t[0] /= t[1];//case '/':
$ \: Z; V, P" g$ X/ V. B' V) U    }& v4 c1 ^' S  j+ A# B3 b. y
}}3 X3 M. ~) j2 u  d) a( W4 C! X
template <class _T, class _Tstream>' v9 z' Z# }* _$ `; v: x( r0 R0 s, B4 Y
/* _Tstream: inputstream, _T: get return value
# {2 ]2 k! u5 E* Return nonzero if get value successfully */
3 g* S5 p# l$ jint GetExpValue(_Tstream& istrin, _T& nReturn){
6 C' X' z) p4 {5 w7 ~    _T t[3] = {0}; //雨中飞燕之作$ q# W! X7 p7 N$ j8 w# X# S
    char csym[3] = "++";
  @2 v, K9 \0 ?0 Y' Z, f    int nLevel = 1, nERR = 0;. U; p6 v8 G0 l# M7 @/ @
    if(!(istrin>>t[1]))istrin.clear();2 h- j8 a2 U% U( Z7 l
    for(;;){
0 W7 S: I8 Z' S$ G! x' S        if(istrin>>csym[2]){
7 [* d. n) d) ^+ q7 L7 S            switch(csym[2]){
0 Q: H5 ~$ z7 \- P8 x% W! o            case '(':1 n* @, J: Q8 L6 K, e: ~
                if(!csym[1]){nLevel=0x100; nERR=1;}else
$ z, N% n" R* q, ~, e1 Z                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;1 f/ I+ ~2 I1 D* `; j5 u! ?4 a
                else{nLevel=0x100; nERR=1;}. F; ?& Q, [- t' n
                break;
, b$ }" _+ ?. z$ A            case ')':
4 N3 [" O* I) ^( M1 x4 l                {nLevel = 0x100;}break;
- W8 n. o& ]. A$ z# c* H1 X            case '+':case '-':case '*':case '/':
7 ?+ Y  @3 m! @" @/ \$ J8 b  a                {csym[nLevel++] = csym[2];}break;1 W, Y% _& }# f
            case ' ':case '\r':case '\n':case '\t':continue;' z0 p9 ?" a; g3 W% O
            default:
( v7 p! o" V/ g8 ]8 R1 k8 K                {nLevel=0x100; nERR=1;}' z/ x3 S0 L, K) i: u. m: `7 A
            }  g1 N( T+ V/ Q7 [# p" B5 `2 z
            if(nLevel==0x100)break;& T0 Y% u9 p7 z% K5 @
            if(nLevel&0x10 || istrin>>t[2]){
5 X& p7 |5 a1 F( r! M. N3 w                nLevel &= 0xF;/ s; T6 y& o9 p0 z8 z+ L
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
% Z4 H+ b- ^  z/ n) G                if(csym[1]=='*'||csym[1]=='/'){5 s: i1 c6 L* {0 i( x) `, c) d% p
                    GetExpValue(t+1, csym[1]);
8 Z$ M. ]4 U, K. G" }                }, c) ~- q* G+ R, c1 x
                else{
' A0 D, T! u; ~( C! Y- d; Q                    GetExpValue(t, csym[0]);
& d/ k6 H" Z3 m) O8 Z( q/ E7 P8 v                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
' }: U3 D  q" N; T, ?                }, z6 k! F/ u. t$ j  i  M  u, l6 T
                nLevel = 1;
# j* p' z! v9 g5 [5 F( I            }, v( v8 b# V. t2 n0 R* {9 L
            else istrin.clear();
' @8 Z' z: N$ v        }
0 D8 v! F2 b% D' a2 C0 g( h        else{nERR = -1; break;}5 G( B( K" P/ b
    }
2 k1 i0 Z8 t; S; M  h    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
& @& h7 X$ I6 ~" X$ k4 g# k    else nReturn=GetExpValue(t, csym[0]);
$ N& D, b( c8 x2 N- O. T    return nERR==-1?1:0;- z" O! m( L6 d% R* T
}}9 S. }( u! U5 U- A+ O3 i

" {+ g& D5 a0 q9 w0 T1 w8 E
# _. b9 c! b# f0 U* t/ H2 t
# [( t4 K# l3 l; s; h5 f4 @函数模板使用示例:1 s; L$ ^+ W$ a7 Z5 p4 J; X1 B
在以上那段代码的后面加上以下代码:
2 Z  E6 z- E( B5 U; a" Y  f% y9 ~' [
2 \/ V2 H/ ^# l7 N
9 P! D8 a5 y2 H. ?, |- f
程序代码: : k5 U2 O6 M1 P  j
6 M1 J; ?. l% Y
#include<strstream>4 Y  W) j# ~/ Q
#include<iostream>
3 p. V) ?( Z9 }( r#include<string>3 k. `/ R  F: J4 O: D
using namespace std;3 i* o7 G! e$ e$ m
int main(void)8 O( }, P- \6 o5 C5 v5 V* R; P, j
{4 f! T- t6 n' ?9 e: t/ ~! I$ S
    string s1;
4 A  f7 A7 x& R7 R7 @( D# e    while(cin>>s1)
: d3 }. u: i* @: P4 H3 K    {& f0 _6 `$ |- ]' Y7 L
        istrstream isin(s1.data());. j& z) a7 X; H, g
        double d;9 V) i' H7 o; j7 r
        if(fy_Exp::GetExpValue(isin, d))
* f! F4 K. X  D8 b& M, A        {
: I8 @8 |: q6 n* ^            cout<<d<<endl;# ^2 t/ |+ L0 B0 v+ L3 j
        }
; `$ w' i% s2 _) ~6 E4 I" H        else
/ x% n0 N' E3 t        {
1 W# [2 U# Y5 o! a4 C( r* p- x            cout<<"ERROR"<<endl;
! N2 H% q/ E& c8 ]0 \, ]        }; J# r) b# \& o" B4 F7 h! B1 k& @
    }
* a# Y1 M& |0 X4 c5 _    return 0;
2 D' K/ D5 ]) w! l2 r. w$ u1 [}
' @: C) q. Z$ N) r* E: d
7 y  M" ]7 Q$ {0 V1 A& C3 \( x  K
1 m4 |* E: x( a3 d: @; O然后编译执行就可以了(*^_^*)( \% f0 D* d1 \$ d/ J
其它:TC++上一定编译错误,不保证在VC6上也能通过编译4 l1 E; u) Z& f' h$ w
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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