返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,- O$ `' b$ [) _( C* b( Y
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式  l; \3 l0 X, F
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
9 b* N2 Y, i$ v% `7 [参数解释:
6 ^+ W1 Z, o5 `  e( @( \' l8 [% J+ Zistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 S% q! i" ?! L8 Y( `nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定7 o8 K7 i! |# M% K. w" M
返回值:
2 p; T/ x" z' P返回非0表示计算成功,0表示计算失败有错误* t! s& c8 M; _3 N
7 o7 q# H/ b- F6 h" _, ]

- Z' a/ |3 Y2 n0 y1 M
1 F+ M- _, p4 I1 A2 l& ^程序代码: ' P$ w: n  S! A8 A5 V7 i
* Z7 V' U6 S$ y0 e
namespace fy_Exp{
* {# f" W. J  B1 x* `0 Cnamespace {template <class _T>
; h3 o* l  s1 b* R' uinline _T GetExpValue(_T t[], char& csym){
9 ~" W, E' ~& |    char c=csym; csym=0;/ l7 D8 \3 o. [  z, D
    switch(c){  J4 G. I7 M; p5 h# K4 W
    case '+':return t[0] += t[1];  l" @4 ?: r$ O1 [; s" Z7 c
    case '-':return t[0] -= t[1];4 [; D4 D8 O4 G5 |/ g: v* R- F  ~
    case '*':return t[0] *= t[1];3 e5 W; ?: i* w' _/ m* G! S7 ^! g
    default: return t[0] /= t[1];//case '/':7 n  V; z. h+ m
    }
2 o' n! E8 v5 v6 _}}
, }/ K6 a9 |: U9 n) O, ~# ?" P  Ttemplate <class _T, class _Tstream>1 j; E8 k3 v5 c: k) ^, F
/* _Tstream: inputstream, _T: get return value
. z# T6 F/ J' }, C% B* P* Return nonzero if get value successfully */* o' ?' d7 e4 u& k5 W1 _) A+ Q
int GetExpValue(_Tstream& istrin, _T& nReturn){1 n7 l0 j3 \% I
    _T t[3] = {0}; //雨中飞燕之作" S) \1 W( y+ s
    char csym[3] = "++";
' k. t. e% h7 ?5 G0 N8 }    int nLevel = 1, nERR = 0;
2 |+ {5 v! {+ g    if(!(istrin>>t[1]))istrin.clear();# X  L) @6 w; \- ^8 g9 a
    for(;;){
9 I4 u) F- k5 e        if(istrin>>csym[2]){" ?& U5 C( E3 R- E+ h
            switch(csym[2]){8 r) g# C# a7 t
            case '(':9 s: h; ]" I7 H6 }8 M
                if(!csym[1]){nLevel=0x100; nERR=1;}else
" e5 o! M9 H3 x- S) b: `! x                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- v' }' u: d! ?) Y: G+ ?" S/ d+ {
                else{nLevel=0x100; nERR=1;}8 x6 r) o. _% v4 e
                break;
9 I  z  w3 T! p3 I' m3 P- p            case ')':, T) B/ n- Y) u9 f+ l
                {nLevel = 0x100;}break;& z- g+ U( b3 i  t" O5 m4 N- J  P
            case '+':case '-':case '*':case '/':
% g  G/ C( @( `                {csym[nLevel++] = csym[2];}break;7 R7 B3 _. \: e( A9 V+ q
            case ' ':case '\r':case '\n':case '\t':continue;
+ ]4 u; C% _" h; _" _( |* M            default:. j/ b! J, C5 B- p0 d/ S
                {nLevel=0x100; nERR=1;}( s$ p' i& |( L: o1 j# o
            }
; v8 p' g2 P# ~. @* ]# e! U7 C3 u            if(nLevel==0x100)break;
" g3 a+ b& z0 h3 }4 X3 h( i            if(nLevel&0x10 || istrin>>t[2]){
0 u$ ~: P# ]  u3 B$ _3 }                nLevel &= 0xF;) D4 I6 z, W8 Y- c' Z
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. H" J- v' e- j7 A  ?5 G: Z8 g                if(csym[1]=='*'||csym[1]=='/'){
" N& f4 R# Z: C- [                    GetExpValue(t+1, csym[1]);5 M! o0 D- w) V- C' r% p3 N1 b( W
                }
' u- u' z  p" M8 k% N                else{; y5 _, x7 P+ [. t0 d, @( x; w
                    GetExpValue(t, csym[0]);
; W5 t, o: ]* E6 H6 q1 ]                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;  [: `% y: k3 b( B
                }
) o0 r0 [/ [( m% t6 D! Q/ T                nLevel = 1;
  D) A0 o5 W0 ~6 z8 g% j/ o            }" r7 G; Q7 Q" [3 f
            else istrin.clear();* x- H, [& @( L
        }3 m9 l5 w* C8 G. C& |. T
        else{nERR = -1; break;}3 ~( v# w4 _1 w/ m) P
    }
. g; A2 o4 J  @1 o7 W* P    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
7 L* g1 [8 A6 v    else nReturn=GetExpValue(t, csym[0]);
/ \4 Z9 n4 \3 @. I    return nERR==-1?1:0;
6 ?/ q5 e( C. J" N' i' P8 b& o}}" _3 ?+ R8 _( n  _* B" \

$ R6 {. H( F  q0 e1 f/ w2 v7 U
  F: S  V  \3 h' d
, D# e+ B$ p" ]0 X2 ^/ Q函数模板使用示例:
- F4 }" l4 s( T; U在以上那段代码的后面加上以下代码:
4 a% s" K9 V+ X
% ?+ H% U( K- A0 H7 O6 `
* E0 @9 Z4 \* |) ~/ A. U/ D+ \  M! D+ _! @  w3 ^+ J# x
程序代码:
- f: m3 Y4 c6 A1 X% l
2 `/ C, ]& `1 s% H& ~4 A#include<strstream>  s) W& [8 r; T$ z9 o" S
#include<iostream>
' N8 {* r$ C8 ^+ ]/ H& t/ ?#include<string>
2 }( i8 b3 ~( ?7 Xusing namespace std;
6 u% J7 d9 Q% V6 d* C3 U  Zint main(void)
1 L! b5 c  ^/ G) ^{$ X! K' V' x6 C2 v
    string s1;' l3 z+ }% D% I6 Q/ u8 l  b
    while(cin>>s1)# ?2 ]8 k# M8 |( B/ D# U! s. m
    {! q( R, s% {" h
        istrstream isin(s1.data());
! B% e' a' w& E, h1 C6 O& |        double d;6 K6 O  I6 F, F: z9 _9 A/ c( d
        if(fy_Exp::GetExpValue(isin, d))9 Q2 C; e* H0 E0 X# y$ b
        {# I' R# b0 L% U' ~; y3 t" y( e% @2 t
            cout<<d<<endl;
4 u. \$ G. p: {' h4 T        }
! b" i; {" m* {% r* D/ e0 m8 [        else
! A4 k  f& v$ {- f+ W        {
4 \/ I0 t6 s1 _+ L/ i: e" p            cout<<"ERROR"<<endl;
% z! f! ^+ }3 L        }
$ k' h3 t! Y9 J, Z2 k    }
7 w3 M2 T% M# ^0 P) N    return 0;
- }& w2 j( Z# P" W7 J3 n+ ~  [}
3 r# i! M* P. g4 @( v$ ^
4 v1 h8 ~$ O+ G7 f; X' u2 V( J
% z; H6 h5 {) ~+ c, }然后编译执行就可以了(*^_^*)
+ V+ b) z( l2 u3 B7 h( v其它:TC++上一定编译错误,不保证在VC6上也能通过编译
2 j' A1 t& I8 Z      建议使用VC7或VC更高版本,或者使用GNU C++编译

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