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

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

在9月8日那天我特意编写的,给大家分享的," C& p- |9 V1 R* s
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式7 r) }) l3 e" j1 \8 C
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 W1 ]- j7 \/ O2 Q+ q参数解释:
/ g: e1 k. c9 g1 ~4 Q  V6 A. ^istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流6 ], A5 r% M, @" S6 M
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# _2 b  `' t2 e2 p9 S返回值:
. v0 O) w$ T7 N. d: u) ]  r  f7 D返回非0表示计算成功,0表示计算失败有错误$ y( |0 _# Y; o8 a
7 F0 N1 F$ J4 U7 B6 ]: m

% A2 g9 ?0 \/ {" T. o' y6 u- M1 D$ o0 ^6 q9 c  M1 q
程序代码: ' O& i& q6 m) t* o+ ?+ Q! G
$ u8 s4 I8 z- ]4 _4 c* }0 x
namespace fy_Exp{( s5 }1 z1 ]- q4 H/ c
namespace {template <class _T>
. h9 d$ W; D; j5 p6 q+ q- b4 Iinline _T GetExpValue(_T t[], char& csym){
# a! o6 @( A3 e9 _    char c=csym; csym=0;
7 [+ O6 g& V7 @! n    switch(c){
) x' W, j5 M  e! l. ]    case '+':return t[0] += t[1];
* \2 n! j, c$ ~    case '-':return t[0] -= t[1];
* q2 _  m% D9 N# k* X) U    case '*':return t[0] *= t[1];0 o, C: Y/ U0 `+ S
    default: return t[0] /= t[1];//case '/':& Z/ \4 D7 m- ^" r
    }3 q5 |( p4 Q% o* B1 a
}}  Z+ D$ n, V1 S4 w0 i
template <class _T, class _Tstream>& b" t2 u1 u! g4 g4 }
/* _Tstream: inputstream, _T: get return value
. C% B0 I, T# T, ^' u6 Q* Return nonzero if get value successfully */
0 X! t$ l* Z. V$ t8 ?/ k" iint GetExpValue(_Tstream& istrin, _T& nReturn){9 B  D* D" ?9 R9 b
    _T t[3] = {0}; //雨中飞燕之作- F" ]$ @" r7 ]+ `  ]4 ~/ O
    char csym[3] = "++";6 P% y4 |+ }  j' F' Q1 d
    int nLevel = 1, nERR = 0;
: V5 Z: @0 _: W8 G5 H' u$ j& a    if(!(istrin>>t[1]))istrin.clear();
# m' U+ Y, F2 I, f% |* q5 l: t4 |) i    for(;;){: e  h  R+ ~$ [! h1 a0 |
        if(istrin>>csym[2]){
3 j& d& ]/ n: V" R/ M. l9 V" |            switch(csym[2]){9 {- c! r) }. i! R! _. _+ g0 J% [
            case '(':; a/ y% z2 `% ~0 X* Q4 s# T
                if(!csym[1]){nLevel=0x100; nERR=1;}else: ?  H5 k6 {8 C; q8 i0 c6 W
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
) x/ }* M4 w& Q& N3 C8 K! y7 ^: d# k9 G. x                else{nLevel=0x100; nERR=1;}: k& q7 |- i; C+ l# S, m+ k
                break;
# P' ^( G- g1 ]. ~6 d            case ')':
5 y+ {+ V- C. p  d% P7 ?                {nLevel = 0x100;}break;  O9 l, T" D  \& D
            case '+':case '-':case '*':case '/':' ?) W5 N& R% V: z0 N
                {csym[nLevel++] = csym[2];}break;: |! z" [8 X: c# w1 y
            case ' ':case '\r':case '\n':case '\t':continue;7 K% ~2 z# K+ v& S7 G
            default:2 t. n" {( J6 N' a( Q1 W
                {nLevel=0x100; nERR=1;}
* H' ~& U# B+ a! T- P3 y            }
$ y1 r! k* `4 ?) Z: u! i" [& Q1 v            if(nLevel==0x100)break;
$ D: n& @- p& Y0 Z: r3 N            if(nLevel&0x10 || istrin>>t[2]){
3 F* c3 m2 c( k+ ~3 p' y7 c* O                nLevel &= 0xF;
- s; P4 a$ O3 r                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
8 G5 ?+ V: N4 i' @/ `- f( r1 I                if(csym[1]=='*'||csym[1]=='/'){' d7 J. W! B! M. H2 Z/ {
                    GetExpValue(t+1, csym[1]);
3 \: V2 o) _2 r$ Z/ L1 _# N) Z                }' Y% C/ |) d" P+ H7 H
                else{, \1 b4 u; L# Q: h' t+ U- U5 e
                    GetExpValue(t, csym[0]);
) _& N: W& o8 a. i. o6 l1 d# _                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 P0 q" a* S/ A; t
                }+ [' d" ^$ ?. S1 [
                nLevel = 1;
8 G- V' ^+ ]7 _            }
8 U( b/ m2 F4 I: v; ^* n/ E            else istrin.clear();
6 F" `! s: R) C! Z, h9 W        }8 V: j: u1 D& b0 E$ \8 I% {
        else{nERR = -1; break;}5 B" J- Z; j8 c( S8 k  L
    }
% z$ g& r0 Z! v/ e' v; D    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);. v. `# r1 z1 h0 A
    else nReturn=GetExpValue(t, csym[0]);
6 C  p! s/ m+ o    return nERR==-1?1:0;# O( A2 U; h; L. \2 J1 ^
}}: l+ t$ {8 q: B5 z6 M$ U
* S2 h. s3 t% ]$ I1 J  I1 ^
! L! ?4 ^: V2 R. x- {9 B

" p9 C0 |: s5 J8 K2 b2 Y函数模板使用示例:& j) m# j2 b9 M. S" O  n  ^# N1 R1 E
在以上那段代码的后面加上以下代码:
- V( K' ^  t+ I1 y) H2 x3 n1 @) c1 x# Z' W# u1 \

  Z2 z! }" E* x" Z- n: O, E8 Q& w* @' ^, N, w5 O
程序代码: ' i5 V* A2 D0 s  t

3 p/ F2 r& t/ R! d6 V* B#include<strstream>
: ?5 l( w4 o! F' K3 G#include<iostream>
6 r6 r! u5 M: n1 n" ^  P#include<string>) {% e. \5 y& J, }. ?/ O# b
using namespace std;# z4 V* A5 T) ?! r( V: ~8 z+ j4 X# |
int main(void)
/ a5 k* _3 l& O- G) w{
3 G  V  p6 B( |8 t    string s1;
3 i5 W: }' p/ ~/ B) Q, ]7 v1 y8 `    while(cin>>s1)
+ r& E- `/ p9 v3 ]    {
; Y0 w- C) _* |. k9 j        istrstream isin(s1.data());
* v% i2 \* Y' i' h; C9 s* U- d; U; F        double d;
; u# ^1 V' b% P+ z' a) |        if(fy_Exp::GetExpValue(isin, d))
" }* d3 V) [9 i: F2 d6 A        {! }! e1 o6 X- J, `7 R
            cout<<d<<endl;
3 u0 T0 w7 J. |4 S( f5 t6 d2 k! m; I        }) M5 n# X% o+ \; K$ |9 N
        else- E" Y! F2 W; V/ t/ Y/ f" O
        {+ \. w% C% u$ K, e) {$ B3 s2 c
            cout<<"ERROR"<<endl;4 @. r1 b' j/ Y# h6 ]) I
        }1 \4 o* Z7 C0 z3 `6 Y' s  e- n6 U
    }0 a: X* e) K5 e/ o- I" \
    return 0;7 Q# R3 Q4 ?% _  ]* F- p+ J  C; }  h3 d
}, S$ }8 J% L: D# S

$ _3 h+ s( \9 {1 m0 Q4 r
, E' b- u6 ~; M2 c然后编译执行就可以了(*^_^*)( n( i6 ~. V. z- M( @, M' V) G. n
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
; Z: x5 J. j6 i& ~      建议使用VC7或VC更高版本,或者使用GNU C++编译

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