返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
# c2 F, U$ h: x+ x' B一个很方便的函数模板,可以并且只可以计算含括号的四则表达式1 S$ m) q2 N9 d
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)  R& p, K# h: i! c& v! g8 c* S
参数解释:
. O( C5 f2 v% Q7 ?  m1 Zistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流; O/ T/ ^5 j3 F6 n# \- b0 K
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 }9 W& `3 d6 {# v- I
返回值:( Y3 r& R0 ~0 }6 t6 y
返回非0表示计算成功,0表示计算失败有错误
$ l* S& ~/ `, `" j+ P/ v+ h9 W- X, Q7 B) h) x# m" |" F
, F$ q5 u) f. Q& O

6 m/ A$ p% p4 W" P' I6 v( A) F7 {程序代码:
( r3 M; e9 x: c3 d+ K& h/ O( D: F4 b$ y4 O2 r" b: n
namespace fy_Exp{
# d7 I* |4 l. b! r) K4 k) |namespace {template <class _T>: Y% J! O( p/ T7 q1 g) u! C8 [! I* w
inline _T GetExpValue(_T t[], char& csym){
3 @* J7 J+ ~; t: C    char c=csym; csym=0;
8 d- }; L1 r2 N, Z2 A    switch(c){
8 Q$ W$ G# x. @: j, E  q; M    case '+':return t[0] += t[1];
$ h' Q, ~; ^' v. O$ I* f/ t    case '-':return t[0] -= t[1];
! j$ `2 x6 K% k$ i2 H# i+ I6 z    case '*':return t[0] *= t[1];
# t2 C' Y/ O$ J4 ^0 I" p    default: return t[0] /= t[1];//case '/':
( T0 [4 {: r( N5 f! T: O    }2 [+ K  E0 i8 _& H: x$ i
}}9 i% \/ M! O$ R& B' y- [5 ?
template <class _T, class _Tstream>5 `+ t- A: M- D& q; d8 X- D6 Z6 }7 [
/* _Tstream: inputstream, _T: get return value
4 r4 J, K, K/ I1 O* Return nonzero if get value successfully */4 x% H: S/ Y' ?% t2 c- {# p  Z9 G/ h
int GetExpValue(_Tstream& istrin, _T& nReturn){: v7 b* _7 `- M* l; J
    _T t[3] = {0}; //雨中飞燕之作
4 B$ l( ^3 g' o# m3 {4 T7 V$ n    char csym[3] = "++";1 n6 c2 Z$ S; O1 k# v1 r/ O6 H
    int nLevel = 1, nERR = 0;
8 K: d. E+ u, w1 P    if(!(istrin>>t[1]))istrin.clear();' x& ]2 c! H8 [4 o2 V
    for(;;){( {1 M) y) D' J! T1 T# b/ g
        if(istrin>>csym[2]){* d- r! Y8 J, _1 Y5 l+ I2 e
            switch(csym[2]){
/ Z3 N1 @+ `! Q: V, G- w            case '(':9 d7 ^! Z) H3 i% u5 `+ R1 F$ o1 d
                if(!csym[1]){nLevel=0x100; nERR=1;}else
! \* u1 ]! o' k+ C$ s9 k/ i" C+ o                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
5 x5 ^5 p1 Q) p( |5 y                else{nLevel=0x100; nERR=1;}6 I: j  c, u0 P( n5 X1 ?5 X
                break;1 r0 O7 d! M/ G9 M
            case ')':
, `6 Y2 I, s  B: v1 j                {nLevel = 0x100;}break;: u6 D% r/ v0 `3 Z' H& W  r
            case '+':case '-':case '*':case '/':
: ~5 b8 [1 _* V* w                {csym[nLevel++] = csym[2];}break;' R3 M6 i! i. @
            case ' ':case '\r':case '\n':case '\t':continue;2 A" n- L" V& f' i7 r0 `$ w
            default:: w7 r/ k, y) G
                {nLevel=0x100; nERR=1;}
9 o* x! w0 f% Q: M( N. g8 Y            }
: ]' @! H5 s$ F  T            if(nLevel==0x100)break;
2 |) a* Z$ A/ n( o5 L% Q3 B            if(nLevel&0x10 || istrin>>t[2]){
! M. Q6 Y$ a* v* X                nLevel &= 0xF;
) k& Q# K$ B: M1 Q! E) o% T2 W" \                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}5 t- X9 D: y. u5 b: u
                if(csym[1]=='*'||csym[1]=='/'){) w5 X# M# q9 j4 V" y3 P
                    GetExpValue(t+1, csym[1]);/ V  a7 J$ ]" w" J; d
                }
2 h$ a+ l. F0 z$ L9 _% h                else{
/ l3 [! l+ s. M8 x$ |% X                    GetExpValue(t, csym[0]);, D0 F: k& G+ T8 e7 z/ y5 U
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;  ^' K5 E( ]. I+ b
                }9 P7 r; O( M" \! y
                nLevel = 1;# `2 O" U6 c: k* T  n" ?' s* i
            }
1 D- x9 r5 m. p+ @" [% A* H            else istrin.clear();
( g/ G  _- _/ N- _% G2 {: D& s        }
4 x; B! u) l% o& W* X        else{nERR = -1; break;}
8 T3 l6 M1 |: X9 F    }
! }. T% b% O3 K' ^1 Y2 M    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 y+ u1 K1 Y: }3 `8 M) i7 o: t5 k    else nReturn=GetExpValue(t, csym[0]);7 K/ m7 o9 N& x, p! O8 `
    return nERR==-1?1:0;5 @7 x* h" N3 H1 i4 e9 f
}}% w4 `. s/ o2 L& i5 P7 [, t, {

+ ^: ]; ?9 K$ ?; p4 y  ~9 ]- D8 G1 W

& c4 B) B8 P( j+ L& G函数模板使用示例:
' |+ Z1 j, J# k7 @1 v6 [& a4 k$ s! k在以上那段代码的后面加上以下代码:
" d0 s, Y7 }) H0 B0 o& Y0 j
( c* T  C! H: Y 0 {- S* `, F$ O) J- M
$ x- v# k* r& U0 g# w
程序代码: % c, @2 q5 \: S/ e4 E

( A6 {: P* i" ?' Y$ R. r#include<strstream>
: n( H$ D) f- j1 O  D#include<iostream>
% B2 J( Q9 s! k0 M9 e9 |#include<string>; L* y% t9 q/ j3 n  f) }
using namespace std;
& S8 o' @! T* s( j2 J4 K. rint main(void)6 ~; a: f3 K6 G' g
{+ t3 z% P. ?: Y* r" a' v: A  F
    string s1;
7 ~) N7 E. c. ?% F4 {    while(cin>>s1)
2 }4 i  z: E$ W8 C2 i0 ^$ g& m* Z8 ~4 p/ D    {+ u8 t$ }: ~2 k; a  b5 K
        istrstream isin(s1.data());
* g5 F6 H" g0 w1 U        double d;' w2 X: ]/ P- J5 [
        if(fy_Exp::GetExpValue(isin, d))* h+ y# [  |! t# C
        {
6 V) S6 A. d: f5 d4 B: P            cout<<d<<endl;. E# o7 `+ x, ]# U: U
        }
' _% }- q. M- s: e) d# n        else$ O% V+ c" M2 [+ n& R2 J. k
        {
+ Y5 h6 T* e+ w+ g            cout<<"ERROR"<<endl;7 }) ?& R; s# N, J& j# ?1 `
        }) t1 e0 i5 J2 N
    }
2 m' @3 {" k1 B( I0 j: H2 u' E    return 0;6 U& T$ u- r3 U
}
- U! h) x0 c, \3 A8 E9 T8 o
) g* z! R# Y6 t8 k; S8 v" N& ^: u0 n4 e
然后编译执行就可以了(*^_^*)! U7 T$ S9 c* N4 `- g
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
  x) h5 {5 e- S1 G( q6 f5 N+ _- N) O      建议使用VC7或VC更高版本,或者使用GNU C++编译

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