返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,) D0 y7 N1 Y: _8 h; y- p* \
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式& E2 }5 X6 Z/ k  j
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
& |# U. |7 G$ U  G, N) D0 w3 {参数解释:4 X1 Q# u$ m7 E" [$ {+ L" d
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
0 J8 ?! u5 ?, I# Q3 nnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定1 |: v$ ?& j+ i4 k
返回值:  a" n3 F% J7 N8 a
返回非0表示计算成功,0表示计算失败有错误
: h; x* e. O+ {7 e  U; b. J8 A1 D4 \6 q
2 a2 j( E: F5 Y! {+ D4 p
/ k  w+ `/ q. H& P& b% v/ }
程序代码:
8 M* U0 v3 G9 c/ ^/ U9 z$ P! Y4 @9 S6 y, T6 E' E! y( J
namespace fy_Exp{7 I  [( N  M/ ?: L+ W& C
namespace {template <class _T>
1 f+ ^! y% e' ~& G3 ainline _T GetExpValue(_T t[], char& csym){
' ]. @! X. n3 K5 ?/ ?7 [0 t4 |+ V    char c=csym; csym=0;
5 h3 p) [, o! @3 q% ]    switch(c){4 S' }3 w  B" o$ x( K- [2 x
    case '+':return t[0] += t[1];* q+ W! e5 z! t; k6 V
    case '-':return t[0] -= t[1];
. H7 v- P5 X( i+ j8 D+ [    case '*':return t[0] *= t[1];
. q1 ]8 Y% n$ P! k1 T; o6 F    default: return t[0] /= t[1];//case '/':1 W7 Y' I  P% _( p$ j- O  \& ~
    }( H+ w. ?( Y' W( D2 v% K
}}
' F1 M: {/ K. ^. _; O) etemplate <class _T, class _Tstream>
  X  Z" m, l) J' C* A) A. Q5 D$ n/* _Tstream: inputstream, _T: get return value
: O: ]3 q9 a9 C" ^. m0 F* Return nonzero if get value successfully */) {' G. y5 I5 E  q* x
int GetExpValue(_Tstream& istrin, _T& nReturn){
# _: D3 g: a* H# l3 y, W9 E2 k    _T t[3] = {0}; //雨中飞燕之作
1 {% n$ _- W* P3 B    char csym[3] = "++";
3 W6 `5 m( M6 C9 a' {6 B* u8 V( R    int nLevel = 1, nERR = 0;  \3 ]3 N1 O6 |8 \; Y' X: U4 V' J& H
    if(!(istrin>>t[1]))istrin.clear();
) K) O' ]! E' r' L) h    for(;;){6 ~; Q6 D. H1 _# @* m
        if(istrin>>csym[2]){
; E0 u( Q5 m+ Q. G8 y4 Y, |            switch(csym[2]){
! J7 ^' m. L; @4 y, t- D' o            case '(':+ ~0 ~1 `  |3 T
                if(!csym[1]){nLevel=0x100; nERR=1;}else
" i7 H- g* Z& N2 p; M                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
; ]- g- X( n6 ^& d# K1 q$ ~                else{nLevel=0x100; nERR=1;}8 R3 W8 }" g& U+ e% c5 m1 n# |
                break;
6 Z4 |7 j+ s& `" q4 y( c1 W            case ')':. F  [. z* {3 [  r/ f. ^# X9 Q: k
                {nLevel = 0x100;}break;! ~' t6 i+ n! Z/ i
            case '+':case '-':case '*':case '/':
7 w* `' s) x9 j) ^5 d! n! j                {csym[nLevel++] = csym[2];}break;% L* }6 D* Z0 j. ~2 Z9 W
            case ' ':case '\r':case '\n':case '\t':continue;
1 F, C+ Q8 n0 J  u, b            default:+ l4 I9 ]$ W6 {0 b- R3 D
                {nLevel=0x100; nERR=1;}
6 H8 G; M6 N) }' P- b. C% b( S- {& `            }
, U0 J2 m0 q5 B# f+ `            if(nLevel==0x100)break;3 x% Z: X% ]3 `' z
            if(nLevel&0x10 || istrin>>t[2]){6 x; ~7 _5 P2 E) H# |4 ^# t" f
                nLevel &= 0xF;
, i& L- p" e$ H. N                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}, ?, h+ ~* l* J7 X, V. k
                if(csym[1]=='*'||csym[1]=='/'){7 q4 G# w# F+ ]3 j, o
                    GetExpValue(t+1, csym[1]);
9 w+ Z. s( I5 `2 w. n! i                }
' C, P* A! v( g/ ?  x                else{
7 {3 g* t" M0 ]! q                    GetExpValue(t, csym[0]);
. [( d2 d6 V: k; C. a2 M                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
  ]4 _9 n, n$ ~! D2 Q2 J6 P                }, ]0 s; ^7 W: Z+ f7 g
                nLevel = 1;2 R( n$ j: \9 D- s$ Z6 a7 u
            }
. e. |, R/ V- y$ s: b- a- T3 B, M, j            else istrin.clear();
- Q' g$ b* s' J" f6 d7 A" K        }' T( U+ Y( O8 d# {; ^3 C
        else{nERR = -1; break;}2 Z. Z0 L) e5 b
    }2 L& N. C$ n, F$ a) H* d: J  A& f
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);/ B1 F) A/ ^1 j; b; Q% @! x# S4 E
    else nReturn=GetExpValue(t, csym[0]);7 ?! c4 w' h: P/ X) r0 E" H4 `
    return nERR==-1?1:0;3 z; c- j- b, J0 _
}}
$ i, O% P1 G9 O8 i; S- [) a+ z+ W+ w: u0 b3 j

, w. b9 Q* S1 C
" C% T4 u8 y# {函数模板使用示例:* K& S3 P0 d6 i4 ]* z, L
在以上那段代码的后面加上以下代码:5 y( J5 |# H5 t. N9 H# O8 c
0 `& T4 I4 `0 k1 M; D, V3 O. M
: y& X* _) V( a6 s
; f& ~* e. \; y7 {: ?+ l! }
程序代码:
  o. A) \1 h0 T2 u# ~, J' e6 G' `% N" B& Y7 O. T
#include<strstream># q" \- x7 w- |4 p# d/ S- c* U# |
#include<iostream>  n- i6 i/ h1 O4 ^) S- I  X
#include<string>2 I, V- Q4 z/ B) F2 y8 f' B! ^. i0 B
using namespace std;& e7 j% k. H6 c+ j, {: a& W
int main(void)
2 ~# }. @( ~: J, Y{
) U, Y" d; U; A4 ~* v  n, s    string s1;
  I! b, ~3 p) U+ [    while(cin>>s1)  |' P" K$ j4 I5 ~7 O
    {9 n1 K4 ^, {% z! n! y
        istrstream isin(s1.data());
! V( \! f- c& w8 Z) n5 H0 G        double d;; F5 ?1 e' q/ W' y) I/ U
        if(fy_Exp::GetExpValue(isin, d)), ~8 Q" F% B2 l; @! K  b
        {: A( `8 z6 Q0 v( j" |  L
            cout<<d<<endl;7 k  D: ^: Q6 |' z: O
        }5 T) q+ F! M2 H5 h0 H) u
        else* A& f6 V% O# [( b) x7 l' s
        {/ w# N7 S  {# P" I
            cout<<"ERROR"<<endl;
: B/ E9 r4 D2 m        }" b- m# t" M. ]
    }  a' Y' ?8 e. B' C& d
    return 0;8 w8 z" @' r* H3 q' P3 }0 S
}' E2 n$ k5 N# g; W

0 u  d' y+ H* x
; w, S. y# A- a然后编译执行就可以了(*^_^*)& u4 c2 R* h, a  y$ c8 |
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
* A2 f% Z9 U: _0 g; ~2 p- z2 @4 k      建议使用VC7或VC更高版本,或者使用GNU C++编译

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