获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,# Z8 V  u6 T1 o% d( F, a
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式% t5 O/ ]5 g% W, n% p- v3 W" E
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)+ @* q4 Y0 B) x
参数解释:) k0 }: s1 ^3 {' e9 V0 z5 D+ B' w' \
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
6 w, g; U$ e) A2 MnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定3 q1 V' J' \# n* X% N
返回值:6 r$ w! [- L; X- a% z7 G
返回非0表示计算成功,0表示计算失败有错误
( I& c" `: {' X% U
  H: i0 ~% t: M5 a! c
2 K5 t" W; k' ]9 m
+ m  ^# n7 I  e6 X5 E$ a+ W& @程序代码:
- Z/ H( H8 x9 G9 k. j1 \; j; Z! i% B. {5 \; o0 I- w4 |
namespace fy_Exp{
  j* E1 j* J- knamespace {template <class _T>; W, Q; S8 D2 P9 o: }$ V
inline _T GetExpValue(_T t[], char& csym){6 |( y5 m' N, s; P; v6 Q
    char c=csym; csym=0;
2 {  Q1 P2 v* C) ^- e9 e    switch(c){
- r1 Q6 a% i% K# F9 V3 H    case '+':return t[0] += t[1];
7 T3 [& q) V  W- r* k    case '-':return t[0] -= t[1];
& i( z0 I- B7 h    case '*':return t[0] *= t[1];
6 N8 R+ U/ M% u4 E& Y; U    default: return t[0] /= t[1];//case '/':
/ r2 _) }0 H- @5 E3 G8 R    }3 t! @  n  R, z1 B
}}6 d# s2 i) y  g2 `# W- I
template <class _T, class _Tstream>
" d/ M& J' z+ U/* _Tstream: inputstream, _T: get return value, N6 ~3 ^  ~* M, w. v1 |$ {
* Return nonzero if get value successfully */& g8 w# J6 g+ }" B
int GetExpValue(_Tstream& istrin, _T& nReturn){
, H& V" K; v, G    _T t[3] = {0}; //雨中飞燕之作3 D4 n; P- p, }+ B  r) [
    char csym[3] = "++";
2 O3 M- a" v+ l$ `' E    int nLevel = 1, nERR = 0;7 z- ~7 o# d3 N, p5 K) @7 _
    if(!(istrin>>t[1]))istrin.clear();# v* L. [# M3 L! q! }% e* E
    for(;;){+ b' S5 n% l2 M: v. p; U* m0 H+ j
        if(istrin>>csym[2]){
8 S8 I" G, b  c3 n7 D) {( C            switch(csym[2]){
4 E$ G, Y  Y% P% S            case '(':/ H9 k$ f- C) m% K4 H( ~# h& {5 V
                if(!csym[1]){nLevel=0x100; nERR=1;}else) a* j# L* d% ?! s9 P
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% @+ ?; z  r6 |9 ^; c0 W8 g% V
                else{nLevel=0x100; nERR=1;}
% Y# i( M" d$ W0 r( N                break;
, H- \' Y( V8 ], X! q+ P            case ')':1 p7 R1 W: k; ]
                {nLevel = 0x100;}break;
4 h6 q+ Z0 ^$ O7 T1 k5 R, A            case '+':case '-':case '*':case '/':
$ F4 s: Z' x) W  V1 p4 Y+ s1 C                {csym[nLevel++] = csym[2];}break;
- R& R; K1 n' \3 K* K" m) d9 c- p7 ^            case ' ':case '\r':case '\n':case '\t':continue;
* |$ L7 H  r& c. ~7 k& e- ~( e" H            default:
: f) f0 {9 d9 k: r) _& w5 x+ t                {nLevel=0x100; nERR=1;}
' w4 d& v& @7 C- X  r1 J            }8 P& x% z' C  s1 e6 t  b: P
            if(nLevel==0x100)break;
' R# q/ r/ I" T# s' @            if(nLevel&0x10 || istrin>>t[2]){
& x0 N( f. I; k                nLevel &= 0xF;3 F$ h6 t8 L9 J/ K* f
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}2 v/ _( @2 Y5 `+ K5 }* ]
                if(csym[1]=='*'||csym[1]=='/'){. b; _7 {# n. K  Z+ X6 q. ?
                    GetExpValue(t+1, csym[1]);
6 u0 Q+ g9 W0 ~                }# y8 G: a& @2 m0 b8 m( C
                else{
/ j! f  O* j  y! J% l& M                    GetExpValue(t, csym[0]);
5 i5 x- w% y( F- F+ B3 [. j) I9 ]                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
! D' E/ N2 p1 S                }
( v' ^7 O* _1 U6 G                nLevel = 1;
) g9 I- K3 I5 l  k. B7 U! W0 l            }
2 F, t/ O& N- h( ]0 y: a            else istrin.clear();
9 T) A! E4 K, x" {& D. `3 \        }
) w, M+ E& d' E! p- e* y        else{nERR = -1; break;}4 m3 O& G5 b& i  ?9 W6 ^
    }
( \% M) j& L2 ]  N4 a/ T    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
) u! u) x/ u8 h- M( N    else nReturn=GetExpValue(t, csym[0]);% u* Q( c/ y& I  F8 K& [* U- e
    return nERR==-1?1:0;
( ?& e$ G0 z* O( R}}
: Y: C" f1 f0 ]- T5 N7 L
( L& e, Y( _2 S0 g3 k6 a) U) i' Z. N/ I, d

  B7 t3 R9 A+ N函数模板使用示例:) T2 @8 J4 \+ b0 v
在以上那段代码的后面加上以下代码:9 F# X+ y' b8 }/ k9 \+ o

. n) D( ]6 y% V8 P
" |& a/ x# g! i( h" N5 c  q0 L  e$ a/ Q* E" P2 n  M2 H0 w' ~
程序代码: / H: \% D3 v) q1 U
* P- u1 Z0 w5 ?0 j; O/ x
#include<strstream>7 U. B. u4 w9 H7 Y# [1 a
#include<iostream>
$ \3 _* c2 D! g9 r) d#include<string>
3 _; C* {! t9 Q  O6 y1 t$ Susing namespace std;
: f! v1 u8 E+ X" ]5 D$ jint main(void)
2 N: c  V* M) M6 E; L{- U: t; ^/ D, Y% \( D
    string s1;4 C5 N5 t7 Z+ M- E2 k/ \- k
    while(cin>>s1)+ T6 Q  S8 h4 o
    {& t' R. a; \* A" B* G
        istrstream isin(s1.data());
" V6 n2 y6 H# k& y8 e2 H& Q  o- t" k        double d;- u# P$ H( e2 i2 Y. }
        if(fy_Exp::GetExpValue(isin, d))0 {+ @4 k4 u  J% `5 ]
        {  y+ E; A4 X5 W7 z: |& Z
            cout<<d<<endl;
9 q" I2 R, |2 q) R0 I$ p, Y- a/ s        }
4 `) \: @7 y( \# B        else
; @7 N3 u) \+ t: g        {7 t: L8 I* a+ u* v/ w) q
            cout<<"ERROR"<<endl;; L$ C% t, w: P9 S
        }
0 y) B; ~3 q2 S3 d8 S    }7 o$ Y% N; F" L1 B. K  `+ X  ]
    return 0;& U6 ~/ q; N/ W5 b6 F0 N
}4 o" p3 L) Z6 b# T, V8 J9 D% }) x

% G: c$ h7 P+ \- ~8 x5 J( m; o$ Y  {* f- T5 T' {
然后编译执行就可以了(*^_^*)
9 w% N: P0 \1 o其它:TC++上一定编译错误,不保证在VC6上也能通过编译) X& Z1 ?2 e; m
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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