返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,) s$ T& R- N% o- J: D
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式& D: r0 |4 f1 H6 }7 ]$ K
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( p6 Z" ~( Y$ n
参数解释:
' c3 j' q$ U4 V- D' mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流" o$ ?- e) ?. p7 ]; b) w
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
: g3 w( a9 \# L2 E+ c返回值:
7 z7 C2 [: F3 T5 z返回非0表示计算成功,0表示计算失败有错误- ?7 Z, Y6 z4 g5 C( U

& w; c8 A: Y' ~! M- m ) r) ~1 Y$ M; c' e! V2 b# j. `
9 [9 z8 m, m( P& B, S8 q8 g4 D
程序代码:
& f/ ^6 p% j( Z+ \4 w
/ Y% J# Y6 Q5 H( L7 }namespace fy_Exp{
  R7 W- g2 L: A. Q8 Q; ?namespace {template <class _T>% W1 @' A3 T9 s: x& }! s& ~
inline _T GetExpValue(_T t[], char& csym){( G' X- U- {& X. y
    char c=csym; csym=0;
/ t- E* A: K2 R5 }    switch(c){1 c# k4 v3 j+ ]. C- f# A& ?
    case '+':return t[0] += t[1];
- ~  x7 I# ]' c; j, d* T2 [/ Z    case '-':return t[0] -= t[1];
& ]9 j$ _* s- w6 R    case '*':return t[0] *= t[1];" m0 p- G/ E, ?& Q
    default: return t[0] /= t[1];//case '/':
; ?: V7 n2 r" x  t  k    }  b: E. X1 T  d) m* d1 E2 A
}}
; b0 `- N0 U& u6 t* @" Mtemplate <class _T, class _Tstream>! l: }1 I& y4 {. A5 |9 P( l
/* _Tstream: inputstream, _T: get return value
$ T% M# d% @8 g% ~+ l* Return nonzero if get value successfully */$ k) U! m6 S- J/ u1 q9 ^% P4 _
int GetExpValue(_Tstream& istrin, _T& nReturn){; U# F9 k( J8 ?+ O% v! E
    _T t[3] = {0}; //雨中飞燕之作
" [2 q8 T% o: I8 s    char csym[3] = "++";
3 l( i) O, z7 ~1 V& V( c    int nLevel = 1, nERR = 0;8 w0 q; A$ L/ r" M$ P
    if(!(istrin>>t[1]))istrin.clear();
  O6 q5 R# @+ f5 s( N( K4 [9 y$ n    for(;;){/ m. R5 D& S2 U
        if(istrin>>csym[2]){
; I6 K& B: D) I1 V6 q" G            switch(csym[2]){: r1 \% }9 a$ j$ ~
            case '(':! A! Y. f7 v! L2 |9 @
                if(!csym[1]){nLevel=0x100; nERR=1;}else
% k) F8 t" N& b+ C4 P. C                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
0 M5 N' f+ C: r, g( L0 i9 q& o                else{nLevel=0x100; nERR=1;}
, V+ x. x4 Y! t                break;7 [; w9 J" N& L* m# x/ @- }
            case ')':2 q4 y" T* i4 H
                {nLevel = 0x100;}break;
( }! X! p# Z  s! M( S- N            case '+':case '-':case '*':case '/':
1 M% Y' b! Y/ R1 o                {csym[nLevel++] = csym[2];}break;% [& T- B7 U- y  u
            case ' ':case '\r':case '\n':case '\t':continue;
; c% J8 a& y3 V, }5 ~+ c            default:
1 b- U( V- T! [  K$ z7 u0 G                {nLevel=0x100; nERR=1;}4 w+ }  H; n6 e
            }
- W/ g( i$ i* H            if(nLevel==0x100)break;0 J6 p  H3 R0 A# d
            if(nLevel&0x10 || istrin>>t[2]){$ g' e; Z, s: {0 J
                nLevel &= 0xF;( L4 m  p" M6 `, f! U( {& @( }
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
- ~: p8 A( S0 j                if(csym[1]=='*'||csym[1]=='/'){& n' V, x; J1 D5 D
                    GetExpValue(t+1, csym[1]);
8 k0 l0 F( Y3 w0 ^0 r5 F                }
6 T; N0 m; Z: a/ l7 q                else{# H% E( j5 e! J6 p6 s
                    GetExpValue(t, csym[0]);
8 y3 {  ^! X6 ^; V+ ~* C9 P) a# k                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
# o0 D  e6 I# E( l4 E: b                }
- b9 P( R- }8 V2 ]; ]. Y3 Y1 f                nLevel = 1;' ?: _+ w8 T8 \% w2 B
            }1 \1 p5 ~6 W. i$ g" a" V% r
            else istrin.clear();- C0 N& ?3 ~! c8 D5 y0 ]+ u
        }
- I* X5 J+ L+ u! [        else{nERR = -1; break;}2 O4 k' S7 h! ^  C0 B3 {; H; A
    }1 U; A  f5 e9 D
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
9 j4 o  g& [- O# [- K3 ]# D    else nReturn=GetExpValue(t, csym[0]);
- W! v: i; r0 \+ r, I2 L; ~    return nERR==-1?1:0;3 k% R3 a, X  x! H& I# F
}}
% p% A4 z4 [# w; I1 w  d
. E. Z, g1 m2 L0 {' H5 O3 [
. [" m# p! L' x' s" U( ?! X9 `4 i. ~4 u7 ?0 [
函数模板使用示例:
. b; L& G! `! |在以上那段代码的后面加上以下代码:) k+ q- `! S) C/ T) @. A7 s7 m
5 z: `7 T" t( _" }) J5 i
: z6 ^- K" S1 m  k2 k

1 J; `9 t+ `+ i" V% p8 x4 `. P程序代码: : H; C& U1 K* C

5 Z0 g! \! L7 I  |#include<strstream>% Z. t' J- i4 s/ \) s, N0 z" L
#include<iostream>4 n1 _9 w& U* Y; h
#include<string>
: ^" |+ E' N: Rusing namespace std;9 |  m+ c: a2 T' \' {. c/ B4 g
int main(void)
1 i# p5 w4 W' T9 F. v3 |' Q{
+ x* f9 J" H0 `# N; e7 W    string s1;
% m! `, }: B# G    while(cin>>s1)
  K# U& ~% v  \    {1 O' X, z5 f% ~1 B% n# }
        istrstream isin(s1.data());; R. ^$ u& k* l1 r. W
        double d;% k) ~8 k. |" s" {, C3 H% D
        if(fy_Exp::GetExpValue(isin, d))& p* V2 ?' A# y& J! q1 }; |* V% P2 k
        {
- ]  @6 J- l% j- l6 E- c7 n            cout<<d<<endl;9 }1 M  Y6 f0 ~
        }
# a  c6 t9 P, k0 r3 C        else
/ |, z$ u! w0 t% Y& c        {, K7 G, z) H! _# o) p: f; Y
            cout<<"ERROR"<<endl;( A$ g: c7 X$ i0 S5 v$ o
        }
! [# O! V4 F( x% k+ p8 ~8 z    }
- P/ ]% |9 `  n! V    return 0;9 g8 A4 o6 W2 }( v+ Q
}
+ c/ C) @3 w3 o5 R% @0 D6 N- ^$ `, [% P% g4 A  i

0 H: s+ q- p# C: Z然后编译执行就可以了(*^_^*)& F) ~9 q1 I, T: e' q$ F
其它:TC++上一定编译错误,不保证在VC6上也能通过编译: i- B( J; w9 j$ [, C0 P
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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