返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,# c! O! ~; ^1 w5 S8 `) ~
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
# N- @! N9 ~7 ~9 b) t5 `只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
& L  ]' o4 [2 I2 z9 t9 r参数解释:
( O' h3 |: \0 C: S+ j7 {+ K/ `' Jistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流+ w4 Q0 k  K, n% {
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
! R& s2 N+ b: B& l& X  ]2 B返回值:
: L/ V6 D( |& _& {; |返回非0表示计算成功,0表示计算失败有错误1 W* \; n: w; g* P7 S& D
/ ?$ D, m+ F# h7 K/ n- @
) N/ d  W% O- E2 Y" {1 A( [
1 y3 v: O! Z" u7 y
程序代码:
; h# {) T1 B& [" a! N7 e0 D
2 i* Y! h9 Q' _1 F& nnamespace fy_Exp{/ l" o$ U2 M: }
namespace {template <class _T>) o* Z0 y2 }9 E4 i* g
inline _T GetExpValue(_T t[], char& csym){
% d% E4 m% O- r9 r9 s% e    char c=csym; csym=0;
& f8 L) T- S' `" A/ Q6 g9 R    switch(c){
: V2 m! |' l/ j: Z    case '+':return t[0] += t[1];6 ?: {- z4 M4 n# z- e
    case '-':return t[0] -= t[1];
  x- K9 e) }: W$ O7 s5 i    case '*':return t[0] *= t[1];: X4 ~4 _# M. z  t; T9 \
    default: return t[0] /= t[1];//case '/':
5 |5 _4 x/ u* x" E. }% X9 U" a    }: ?& W& H, X3 @. n$ G0 `1 H- J
}}# U9 I1 `  `  R6 ?3 `& y9 P: P
template <class _T, class _Tstream>
% e( w$ F  t0 s7 T  w" d/* _Tstream: inputstream, _T: get return value
* ^% u6 n& b7 M7 p* Return nonzero if get value successfully */) [: A6 u1 m1 e
int GetExpValue(_Tstream& istrin, _T& nReturn){$ }7 P$ R' d1 t" P( W
    _T t[3] = {0}; //雨中飞燕之作8 d& J2 b, ?( g9 k1 v) x
    char csym[3] = "++";
3 ]4 X1 k, I  e! r7 z: M; }    int nLevel = 1, nERR = 0;
( v/ k( V' I* j$ B! h6 @' K  s) k' s    if(!(istrin>>t[1]))istrin.clear();2 ?9 t, I5 p; u+ k$ \0 |5 u
    for(;;){- j' ~2 x" ~( X; |5 l- e
        if(istrin>>csym[2]){
* A/ b, y4 K( D1 V            switch(csym[2]){
* o% P* s" Z. n1 D            case '(':
6 t" r; I2 _( @6 P                if(!csym[1]){nLevel=0x100; nERR=1;}else
# {  `  k) z% p; _* h                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;' _; d$ U1 O, j
                else{nLevel=0x100; nERR=1;}
; s2 c& t. _0 U: S/ a                break;
% ?  N1 S# t1 m" Z0 q            case ')':! {" n6 A+ L9 G+ l
                {nLevel = 0x100;}break;
3 ^1 {6 o% H5 t" T6 z( m6 o            case '+':case '-':case '*':case '/':9 F2 c; c4 J/ _( |( ^
                {csym[nLevel++] = csym[2];}break;3 @5 o9 s" K" V+ `4 ~: n) i
            case ' ':case '\r':case '\n':case '\t':continue;5 H* o+ E: r& Q- w7 I1 N! A* t* _
            default:
6 ]$ b: H; d, k$ Y                {nLevel=0x100; nERR=1;}
/ E1 s% q8 l4 a            }
3 P4 V  @* x9 r$ r! n  t* U            if(nLevel==0x100)break;
( s+ G% k* g5 k# O$ i0 Y2 y% m1 q            if(nLevel&0x10 || istrin>>t[2]){( Z7 J  T4 w2 F$ H2 z6 y1 K
                nLevel &= 0xF;
% t+ i5 [7 N" g2 Y                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}- Q. Z1 }# v% \
                if(csym[1]=='*'||csym[1]=='/'){
- V' E& N. j$ ]; W+ C/ h                    GetExpValue(t+1, csym[1]);
- V: f/ s5 W6 b* B                }
+ E1 _1 h  r) b                else{
# Y; D2 _  p* x. d# n4 n! c8 ~                    GetExpValue(t, csym[0]);4 _4 H" z- \0 i$ F0 L. _+ g" H) _
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
! \+ H5 {$ y- w, y5 ]                }+ `6 h$ w  F7 y) |$ X1 Q
                nLevel = 1;
# u  f& y: `3 B; r0 V2 p% k            }
" l1 n1 W2 O, A; w6 ^            else istrin.clear();
: t0 |/ E, G3 B. K7 f        }2 @2 O3 z$ n% r& x8 d8 E
        else{nERR = -1; break;}5 J) I% Y* n" k! o$ z+ f" K+ s+ O
    }
8 m) e: @; J; Q" ]% Z, A* p' f    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
, H5 r, ?# {  h% [9 h- h7 r0 @' ]    else nReturn=GetExpValue(t, csym[0]);; t/ D7 P$ W! X
    return nERR==-1?1:0;
5 [+ \$ R  f  M0 ^' z}}
- z- l. m0 R5 N1 q4 k$ M0 H
; t- b, U( f" z2 K- ~. ^+ Q2 o) E4 c/ q0 x/ ^+ O* S2 R

1 s6 |8 N9 A- x4 A- V. B% T函数模板使用示例:# b* M. K  T% c8 J7 q& M
在以上那段代码的后面加上以下代码:" k1 @/ Y0 h4 s
' j8 X1 ?* \$ I2 f" S8 n

! s  x' |- ~! ?* Y$ P, a" e' j. C& q4 q
程序代码:
2 Z; G  X6 E2 Q) y  G) z
! D% ^* X/ ]. E/ K2 t#include<strstream>
: K# X! [1 u# o+ {1 _#include<iostream>
* q: x& M7 V- ^2 }. B#include<string>9 O& j1 v& l) A, L; H  c2 B
using namespace std;
8 W2 C4 A. d  ]' m) x1 yint main(void), s+ f$ s) h: ~; a9 s0 I
{* D# C, y, M5 O1 k4 H7 \: }  E0 Q
    string s1;
: D; [$ X0 y, P    while(cin>>s1)% a9 O; Q0 E3 _
    {& P- V8 y% [- a1 w
        istrstream isin(s1.data());7 p+ Y! {; Z+ B: o
        double d;* f4 @/ h5 [, G; d3 d, R- R; b; f
        if(fy_Exp::GetExpValue(isin, d))
/ w' U# c2 i3 B        {# U" p6 s7 }" V/ c
            cout<<d<<endl;9 G: V% ~( S1 p% H# `2 R
        }
" k6 y1 F/ B/ [1 T# m, F& H        else
3 _, o) z* F$ g: @7 z        {
$ J6 h" n" A3 N1 Y  U            cout<<"ERROR"<<endl;
" E1 q6 K4 M" k. L' L- E' l: P        }
0 t2 {: L% F8 B# X! p8 M# S    }
6 ~6 ?) j6 l% R2 s) V0 P( t    return 0;
; x6 N5 ^: Z& |* d1 H}
' c- y3 h6 L' Q+ }$ y' O4 ?8 ~: A! ]5 I1 n' i" g
7 W: W+ K: N4 j4 w- ?
然后编译执行就可以了(*^_^*)
0 s2 D, C7 m" @5 c# u1 k其它:TC++上一定编译错误,不保证在VC6上也能通过编译# [) n" q$ T. B- o
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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