返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,, ]* s# R; Y1 h* w5 W
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
! G3 d& X9 s  q# o  r3 i+ N$ m; Q" [只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn), A% j2 F+ G  U7 w( i. \( Z; y) i
参数解释:3 N6 r+ z2 Z. G4 c# L4 V6 r$ A8 _
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流) K$ }8 N6 @2 `  t4 T& |. H6 @
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
( j4 ^* q2 k/ B/ L2 \( J返回值:* j  _+ t" [0 ]: R. }6 y
返回非0表示计算成功,0表示计算失败有错误6 w* a3 n7 @: z% x# D
9 @/ _) ?  w* O  t5 T9 l
* f7 g% \5 ?9 r! c0 T7 E

- e3 o4 h* _9 O+ s程序代码: 2 v9 T7 X5 o+ i* l! [# ~

& M5 U2 c' ^* c; @0 X3 w5 Wnamespace fy_Exp{% R. f5 j# h4 H- k! I- _' r& c
namespace {template <class _T>& V5 p( `5 U! _- d
inline _T GetExpValue(_T t[], char& csym){
2 F' P/ f" o* Q% u# f+ e& {    char c=csym; csym=0;
7 v8 r% D! u9 l* V- A/ R    switch(c){0 P7 J5 G8 @* N- d/ B
    case '+':return t[0] += t[1];
5 p% B6 l3 A+ y7 H+ o: ^% E) v    case '-':return t[0] -= t[1];
# p+ i" V* A, i    case '*':return t[0] *= t[1];6 _% b0 t7 e' B* V" z1 l% H
    default: return t[0] /= t[1];//case '/':
' X. J; O) [- J    }
% ]2 a& `) B  p; ^. S* l$ J8 ^7 l0 T; w}}
8 R) \: s6 L6 w) s1 ^) F' p( c" Gtemplate <class _T, class _Tstream>
; K' n" P% i! A" L/* _Tstream: inputstream, _T: get return value& P# V" L; q: l- w+ n; `
* Return nonzero if get value successfully */1 `' Q. m9 T- d1 B2 k7 H! m& `0 v, V
int GetExpValue(_Tstream& istrin, _T& nReturn){
3 R) P  J4 m( P# W6 P    _T t[3] = {0}; //雨中飞燕之作
& j- g- s- n7 |$ |7 S    char csym[3] = "++";
' I3 y( B/ W. f+ K( H4 p    int nLevel = 1, nERR = 0;
1 W" d" f  G6 Y4 X( P    if(!(istrin>>t[1]))istrin.clear();
' p3 G4 q$ n, A+ F8 E3 C    for(;;){
5 }: p7 |/ @/ _& w$ q3 f7 {6 `        if(istrin>>csym[2]){
' O0 e4 Q5 a0 c( ^            switch(csym[2]){  ]; m  g$ n- O# C, r. J" R  U0 T
            case '(':: W0 n4 k. }4 a3 O5 u
                if(!csym[1]){nLevel=0x100; nERR=1;}else  m/ X" q( ~3 [% a9 E
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;/ g# @4 J! c- C0 x6 k( N" J  g
                else{nLevel=0x100; nERR=1;}" k! z6 W6 i9 M% k# O
                break;
3 q$ b9 |/ A( Q3 Y: Z0 ]& a3 h( b3 D            case ')':3 F" e8 S6 s" x+ C0 Z  Y7 k
                {nLevel = 0x100;}break;; I8 E  ]5 w) \0 F
            case '+':case '-':case '*':case '/':2 L. L8 s* s: G7 E3 q
                {csym[nLevel++] = csym[2];}break;
4 _/ J5 H& N& J# c            case ' ':case '\r':case '\n':case '\t':continue;
. b2 A  r; e: e1 Y$ r. c7 F            default:
' ?- @* e( U4 @! w                {nLevel=0x100; nERR=1;}7 ?/ I0 P7 f8 i- u1 R. h) t
            }$ B  h( E5 b1 j. G" C
            if(nLevel==0x100)break;
( X. w9 o$ p9 y. h# [1 I            if(nLevel&0x10 || istrin>>t[2]){
6 \' H: Q$ i( o2 Y" J                nLevel &= 0xF;, E' ^/ a, C0 S: @, Z  Y
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
& [! C& P; f! x: p                if(csym[1]=='*'||csym[1]=='/'){
" W, x! U& {( f5 e& ]' P% Y                    GetExpValue(t+1, csym[1]);. H$ K* {* R. Q
                }1 E% u1 c. r! o8 D( X
                else{" q) S  R  R- ]
                    GetExpValue(t, csym[0]);& T2 D. l; R0 q$ A8 L4 b" q7 ]
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;/ U; P) V5 U; X* t' O
                }
2 Q) C8 k# \, u' u8 D                nLevel = 1;
& s5 X" I2 E& q, @1 v2 S3 m% Q4 L            }( t; V! Z' V; N6 ^+ o; U# ~( _; ]
            else istrin.clear();/ S4 K6 n" E) \7 J, m5 h* k3 k
        }& U. C/ `7 }6 P) J) F) z
        else{nERR = -1; break;}2 j+ b' n; [2 w0 Z
    }6 ?) U. o8 v3 w0 I& f
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
+ B# a* ]6 }  Z5 l    else nReturn=GetExpValue(t, csym[0]);
* n" j( j$ P( i! q. U    return nERR==-1?1:0;" e+ F! f3 G2 j+ N% n0 K# F: I
}}; ^3 X' z& f* {
' l& L0 w: \( x/ s( D6 u7 o+ G

' \7 X5 C* B* _* F8 B% M9 y; }; R% R  [) e& G
函数模板使用示例:3 `3 I; L, L% d+ }
在以上那段代码的后面加上以下代码:
' q% U* j; D6 \- i" f* @; H6 v. i9 D! U* D7 }

  V$ \0 X0 r0 C% T
' b! I- \  B0 N6 ^' J& N0 T程序代码: ! f& L/ N8 u0 A# f7 C# a

5 J' z& J7 S; u#include<strstream>9 N* a4 I0 `1 [$ N8 |
#include<iostream>
; _( e+ Q* t) P. r2 P; P4 K0 H#include<string>
4 Z9 d7 }% r/ |; i0 ousing namespace std;, w0 I0 i; P+ J
int main(void)! z. y4 h# C+ _  M
{* S( i3 I: J. ~5 w4 U' N% P
    string s1;
1 R% d6 M+ f; W" ?) X, h3 [    while(cin>>s1)5 a# n# o4 `0 V; l. S" M$ i( L0 z) T
    {
  F3 M$ z5 J4 ]0 m& r        istrstream isin(s1.data());/ D) Q! ?: ^8 z# D0 `& S/ e- U
        double d;
1 j; p6 W: K4 |* D" u9 S7 i        if(fy_Exp::GetExpValue(isin, d))
! x' X+ z  p- @$ E) u        {$ Y3 {, X% B- J- e5 L+ Z7 j% P
            cout<<d<<endl;
/ D; q0 V5 t$ _% h        }
& T9 W' s- s+ S7 f: Y        else
9 d$ E1 R5 c' t9 e" N        {
7 B1 ]) i3 ^0 @            cout<<"ERROR"<<endl;
* P6 w: Y" _+ o        }2 p  p+ ~6 G0 x# x7 A" y0 ^) C
    }
% f  `8 q8 N; |    return 0;
1 n" T7 i) Z7 ]$ O, O- L( j}
" A& Z) G1 t. r1 V2 m
" |  O9 J4 E  Q0 A( q% L3 |8 B
8 o; ^5 V9 {1 @( ]2 h; K# o然后编译执行就可以了(*^_^*)
( Y, W! U4 z4 t, L+ N- G其它:TC++上一定编译错误,不保证在VC6上也能通过编译9 I2 t9 K5 ^5 B% |
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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