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

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

在9月8日那天我特意编写的,给大家分享的,
% D) }) H* B* E5 Y! v5 v  ^& k一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
4 o" b1 ^' E; Z& L6 y$ f! D: k只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)* Y$ e, f1 b8 h6 e
参数解释:+ B- j0 h( n$ }4 L3 p" ?' v
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
: J& b+ h% b  h" a; u/ `nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 P! K  ?/ V# w
返回值:0 |7 x8 I( ?* T$ O1 m
返回非0表示计算成功,0表示计算失败有错误
2 V5 h2 G: B' ?, x3 P5 d/ U$ ^9 b, ^7 u8 g: Q
4 c' K. f9 Y6 B1 x! f# S; {  h4 H

& V; ?7 m; K' @' |) K- _  r程序代码: % i  j* ?/ @% l. \+ s# Z# C

6 w" ^8 u2 r0 J6 T; a* anamespace fy_Exp{, b" G0 [6 d- ]; ]
namespace {template <class _T>
/ N8 A/ s% W. Winline _T GetExpValue(_T t[], char& csym){
4 z& S9 r% ^: b& M1 N. L    char c=csym; csym=0;
4 s4 T) e; T# F7 F$ v. n    switch(c){
% d7 {) b; ~( m1 X1 V    case '+':return t[0] += t[1];
& N3 @6 I1 W5 ~) x% ^- i    case '-':return t[0] -= t[1];$ L/ [8 k0 k: R3 B
    case '*':return t[0] *= t[1];2 i4 h1 |8 T/ Z0 h- }1 A, q8 m
    default: return t[0] /= t[1];//case '/':
& F. Y* ^2 ?# W8 p5 ~/ P    }
: I, J$ K/ F7 S) r! Z}}
. ^+ }4 K; b% P0 ~3 I, atemplate <class _T, class _Tstream>. a/ F4 v- b& M$ C
/* _Tstream: inputstream, _T: get return value
% T1 l# c* w# D& E) S* Return nonzero if get value successfully */: q8 ~4 S8 f: K6 A5 r) j$ V3 x+ R
int GetExpValue(_Tstream& istrin, _T& nReturn){
8 s. k2 {& H+ X+ d/ @/ W, e9 \    _T t[3] = {0}; //雨中飞燕之作
% g" E$ ~- w# A% ~" f& q    char csym[3] = "++";5 X9 J) x" l- n& I" i
    int nLevel = 1, nERR = 0;& G3 @: R7 f/ f- Q
    if(!(istrin>>t[1]))istrin.clear();6 B/ j0 M  u8 G6 g+ f2 N" a) R
    for(;;){
0 i# v. ?( `$ u; u; l2 f3 Z  U        if(istrin>>csym[2]){
( o1 j- y/ }- s# Z4 n            switch(csym[2]){
: g2 q3 c, K$ i# B            case '(':
" A' q- C; }5 i; \# M                if(!csym[1]){nLevel=0x100; nERR=1;}else
7 V; B% ]/ O. P6 u: l. P3 y) M, Q                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;9 S3 J' Q' l& a, v' F7 p
                else{nLevel=0x100; nERR=1;}
; b. o/ w% e: Y8 G0 H; F* c                break;. X4 O  l# d8 S! V) h
            case ')':8 @, @; n# B* w( x
                {nLevel = 0x100;}break;& G2 H7 B+ |( ^; O3 E' {$ h6 S
            case '+':case '-':case '*':case '/':9 r) d# t/ T/ c! \" S5 T
                {csym[nLevel++] = csym[2];}break;
; B( O9 v* ?/ e            case ' ':case '\r':case '\n':case '\t':continue;- E0 Q2 e- B! i7 X4 i  I, D8 m
            default:
! ?( @7 X" {( i                {nLevel=0x100; nERR=1;}
8 t* ]; d* T7 w" ?! ^/ r            }! b/ i: ~  W" k# Q9 Y
            if(nLevel==0x100)break;( M/ J5 F& s/ F' M, ?
            if(nLevel&0x10 || istrin>>t[2]){' B8 ~5 P( R( p& P8 g
                nLevel &= 0xF;7 l0 t" x2 Z5 m1 ]& }
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
- W0 q# o: Q- V0 T! l$ y# H3 G                if(csym[1]=='*'||csym[1]=='/'){+ m! J9 D8 c$ H+ A
                    GetExpValue(t+1, csym[1]);7 A( H- E, N9 T1 T1 ^
                }
1 x6 c6 F' l1 Q' H/ p                else{
6 s" a! g: V* V( P9 d9 E1 b: j                    GetExpValue(t, csym[0]);
5 [  ^, u6 \6 L- W0 j! x. u                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
7 y7 U7 X1 r, t1 v  b: A                }* @, S6 e5 y% w% V0 M! y. h
                nLevel = 1;2 D- G. x7 j4 S5 g2 Q$ |
            }
0 S0 b8 R/ z4 s            else istrin.clear();! \' ]0 q. J% N9 T1 A8 k2 V
        }
3 H4 n' F& d8 p8 C3 a        else{nERR = -1; break;}
. @6 B2 t$ D8 f, Y6 P) X    }4 G7 l! ]4 `4 m* B5 }
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);2 M) Q" b: f/ |* U" P9 r9 }
    else nReturn=GetExpValue(t, csym[0]);
7 o, G2 x  F# P6 t1 p, N  f6 |    return nERR==-1?1:0;
2 j$ U4 \$ N0 z. S  a}}3 W  Y" v/ W2 \- x" c  x/ C

7 e) G' F5 }( y0 ?- o" ?  H, l0 r  Z+ Q& |. l

: q) n( X4 T' H/ m- \函数模板使用示例:# v7 B$ M6 f- b: O: k  ?6 Y
在以上那段代码的后面加上以下代码:
2 b% H- G5 h% H( N9 b4 a- d) ]" M7 y; I7 J3 B

6 s5 f  d' g6 L% M' H& Y/ u) P2 u  ^
2 @2 \* Q5 W) ?4 w- c程序代码: + X- w; t4 U7 g' c; V+ ]. t; r2 f# l. N7 S
; F( e9 K* [% N( a7 o" F5 j
#include<strstream>4 P0 o* }1 l9 k- |4 g
#include<iostream>
+ l5 I8 e$ S+ `3 b5 u+ p! K+ O% n#include<string>+ K. j# H# m( b. e( z  Y
using namespace std;
' i2 m2 C: k7 ~+ Q5 w% ]+ Y, B9 b- tint main(void)9 G6 d  Q: l0 W& p# V
{
, }/ v) z9 r0 j& O    string s1;
; K2 g4 y9 F3 T- @  O    while(cin>>s1)
0 {/ C/ F9 U1 X9 r1 Q8 T% H! C    {
* v0 V5 Q! O+ z4 y        istrstream isin(s1.data());+ ^2 x4 X& r0 b! u
        double d;
. v+ A) O4 U! ]+ j/ p2 z        if(fy_Exp::GetExpValue(isin, d)), F$ _1 l# Y! q/ c/ L( r2 p. O! I- F
        {, d: y2 X7 \' S- z6 H+ |
            cout<<d<<endl;7 h6 Z6 {% R2 L8 o  Y! H
        }
1 o: I( {+ ~( w, |- J/ H% i, P        else
1 k( I7 K; r& b9 k$ A  w        {
1 F' r5 |2 N1 P9 y/ E3 o' U            cout<<"ERROR"<<endl;
0 M2 D$ n) f2 [! w        }
# x0 A% }" e' I    }8 E' w+ W5 [0 D6 _! t  L
    return 0;
0 P3 H7 S! c% h: M& f/ V}
0 _$ D% [5 U# |/ S+ T) G- p
5 E, }1 J  {- _9 I3 Q3 B: g) \. P. a$ f8 o) f( a/ {" J" P. E
然后编译执行就可以了(*^_^*)' E. q% X- L0 ^* N2 f& V+ V
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
# m, ~9 }4 W: k- H0 L/ O$ k      建议使用VC7或VC更高版本,或者使用GNU C++编译

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