返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
' ]& w2 q0 e% J9 [4 I- z" d一个很方便的函数模板,可以并且只可以计算含括号的四则表达式7 g4 ~3 N' Q6 f# y$ f
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)! ~! ^6 R0 o$ p2 Y! F( \
参数解释:
9 B. v+ A& W2 `/ Jistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
7 ^0 t9 i3 i: l" i8 {nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定3 B' S' @8 d5 f; w) x, @. H
返回值:& U; x7 l' u" v4 k4 N$ U
返回非0表示计算成功,0表示计算失败有错误
5 R0 i4 i: Y8 w5 P. O5 N5 {
% F5 X3 C3 q  P# i. j9 l # v7 G0 _1 I/ z+ p4 o' Z

+ `$ E, @! r8 D& K0 J! m- \程序代码: " y' v" I) C8 q: G, s
* h1 y* J" ?; F
namespace fy_Exp{, l; B- j" ^/ ^$ B% O
namespace {template <class _T># A8 }- _8 ~7 A
inline _T GetExpValue(_T t[], char& csym){% T  q5 o. V9 D8 }+ ^  R) H
    char c=csym; csym=0;( o% |  {; O6 ~( n+ z( W
    switch(c){
& ^4 t) _$ L% e9 v    case '+':return t[0] += t[1];% t- w! [& E7 E3 N& @" W1 r
    case '-':return t[0] -= t[1];2 j: ~* b( _' S5 @
    case '*':return t[0] *= t[1];
3 |0 U3 u( T4 K6 \4 K! c    default: return t[0] /= t[1];//case '/':
( \. P2 w4 ^, l! T) A) E' B/ S    }. }2 J$ T; y/ c; N) ?$ i
}}0 k. Q1 e3 V2 s6 M7 K. ^, V
template <class _T, class _Tstream>
" \( @7 R; s4 f2 P" L! F/* _Tstream: inputstream, _T: get return value& y- Y1 S' c" d+ J3 m0 [) z8 W
* Return nonzero if get value successfully */
! F* b2 y2 A( q+ C& Z. F6 @0 R8 pint GetExpValue(_Tstream& istrin, _T& nReturn){; n8 [! X* b+ f5 Y6 r+ q
    _T t[3] = {0}; //雨中飞燕之作$ Q6 i; n- d; H# G! J7 \. o
    char csym[3] = "++";7 b( S9 `5 y% \- k" @6 B
    int nLevel = 1, nERR = 0;
0 [7 z2 ^0 E9 L( h- r0 C# B    if(!(istrin>>t[1]))istrin.clear();6 T; D) Y& L  g
    for(;;){
  R/ R/ A8 a: U6 d. G        if(istrin>>csym[2]){0 S2 n- M5 c& N3 I  x
            switch(csym[2]){$ {. d4 {9 G. x' T+ |( b6 ]9 u# D7 B
            case '(':
  }# _3 v, J4 \, C+ k( K  x                if(!csym[1]){nLevel=0x100; nERR=1;}else5 l7 S: X' y7 o8 }5 p# U% [& V
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
9 {; V5 f4 C( p0 ^' Z0 p7 I  v                else{nLevel=0x100; nERR=1;}) i9 G1 \, i* F, g* c. x7 H
                break;4 t, {; i8 q; h! @
            case ')':
( b8 }; m9 r' {# s0 k0 n* [                {nLevel = 0x100;}break;
. O5 M5 N# N; j6 ^, g$ y1 L& H            case '+':case '-':case '*':case '/':% \3 C0 V& \9 W6 ?) [2 w8 X: Z
                {csym[nLevel++] = csym[2];}break;
' M# J: S/ t5 u            case ' ':case '\r':case '\n':case '\t':continue;
( h( a5 Y, w6 i2 p  X/ c, e            default:7 l! l6 B) }8 v0 r+ b
                {nLevel=0x100; nERR=1;}. R2 g& x& J- X0 y6 ]
            }; c7 U" q: ~7 A5 P: L5 F8 K
            if(nLevel==0x100)break;
' N5 a. _" `* m9 x) U' S. D! O) h            if(nLevel&0x10 || istrin>>t[2]){% q; s' B1 a6 _
                nLevel &= 0xF;
- C! W2 X  p9 i! G                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}9 O5 O  e* T5 C
                if(csym[1]=='*'||csym[1]=='/'){
! c4 A) ?1 R$ Z3 l, m0 T) `                    GetExpValue(t+1, csym[1]);9 l" h: |: S# s) n! Q
                }# E( V+ ]. \: a; P
                else{
+ w) H: L- b) C1 ]* @                    GetExpValue(t, csym[0]);
2 O/ K; [8 ^9 F+ `' k- o0 s# o                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
, X) s. f6 o' G                }
; T% w3 M+ e& ^; t. Y                nLevel = 1;3 H( I" G. v+ x6 P( v
            }
/ D! p- ^  w# m) T3 H            else istrin.clear();
4 V+ Z  O( y2 X" i: M- r0 v        }
2 v+ R' I* N) R8 [" N; j        else{nERR = -1; break;}
3 r! H0 @7 }! \' x* d    }( }* K) e7 W1 t0 m/ w
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 r! k/ v( N* z/ T    else nReturn=GetExpValue(t, csym[0]);. j) w' L3 Y6 b! [0 K2 @  }
    return nERR==-1?1:0;' K, z. Y" _; f/ [! w
}}3 \2 @  p* K* B! E* H0 V- G
5 X% J; Q# M% ]+ J# F8 P

, i: s5 n) z& p; |) H, ]0 R1 L
8 Q6 ~2 T& a4 Z$ M4 V( l1 V函数模板使用示例:
8 n" x5 x9 f0 n9 M在以上那段代码的后面加上以下代码:
. r2 `% a, \! Y" y- c' e+ t* C9 a: A
" K; ^6 {3 f+ ~4 ]. a
6 I+ f3 i! d) H# U: A
程序代码: 1 e2 v- S& P9 p% q! [4 q$ C

& D/ F- `9 Y6 {: ^#include<strstream>
( F" n: A0 W8 ]#include<iostream>
! f2 L  A+ T6 ^#include<string>
1 d& s; {% `4 }using namespace std;3 x' H& Q3 G. f$ z7 y+ i/ ~
int main(void)
$ d# C7 _; q2 U# }{$ }, m' |3 K+ f. {
    string s1;
; L/ j' w( D( v& n" f5 c    while(cin>>s1)
. x( S' j" ]' G3 r/ m    {- A. P0 |0 B; x* |7 d
        istrstream isin(s1.data());
( o* r# q" n  X' t        double d;
( X/ H# D* t% y$ n5 }; w" W        if(fy_Exp::GetExpValue(isin, d))1 t& m  G! G/ d' X4 U+ l* B
        {* _, o3 O- _' O
            cout<<d<<endl;8 }$ s% u; }' A* B0 N. D
        }
( A0 e6 ^5 |, A9 i# @; B        else8 V! ?, h- ]5 W3 i6 D" t; [$ C
        {
0 e$ Q4 h, v: a1 \5 @( Q& Y0 G            cout<<"ERROR"<<endl;
% l2 J. y9 g- V        }
+ x/ N1 |9 H' F7 W8 d1 T    }
: a8 |6 A0 M( l    return 0;7 Q: N1 a1 i. Q) g) J
}
# l( x" j0 F: i7 d& O0 Q. c) ]9 E6 [% v5 C2 T$ t+ k5 k' Z5 }

3 q/ o0 q" v7 F然后编译执行就可以了(*^_^*)- ^. Z4 f1 @4 C  ~* e
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
# W3 m4 A' F1 A: f. j. e9 p0 ^      建议使用VC7或VC更高版本,或者使用GNU C++编译

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