返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,) f  _  ], e0 s- E0 P7 O8 X
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式# R; f0 O; B0 a8 N  @. s
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn); T' L: @# \8 b
参数解释:
0 M4 r, P* L/ T& eistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
$ k$ a9 `1 ?( x$ q; v, WnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
7 ]# L2 j$ [, E5 |0 z: n返回值:- t% ]* L, _, V0 O
返回非0表示计算成功,0表示计算失败有错误
) b3 o0 K" ~" k( W
% H4 P( V: R2 o% z3 f; g* O 5 x4 }! V1 ~0 T- l0 S0 m
# R4 t5 l, R& k
程序代码: ) _# U3 R6 Z0 b" q6 Q  ~

6 f6 J2 T# z. w/ \+ I/ @. f; Nnamespace fy_Exp{
' y) ~0 X9 J7 V/ `namespace {template <class _T>8 y; c0 x6 L3 F) \
inline _T GetExpValue(_T t[], char& csym){! k8 G9 y- S$ d1 e/ s, J. J9 H
    char c=csym; csym=0;
9 K! A+ K# p. j2 y  T    switch(c){
. Q: H8 F9 J4 H/ r" p; a# s, V    case '+':return t[0] += t[1];
* i2 d2 U' }" {8 _! s    case '-':return t[0] -= t[1];& j3 i. H" T7 [7 S) \- {
    case '*':return t[0] *= t[1];; I& `; n! e+ f  c( T, i6 u- B
    default: return t[0] /= t[1];//case '/':
- a$ R; o0 B8 w6 y0 E    }3 O: }8 m& o& q1 X
}}
7 p; L6 ^& J; }# e, ntemplate <class _T, class _Tstream>- f2 Z1 }& T/ u8 c! G
/* _Tstream: inputstream, _T: get return value- _6 b# H. [0 N, F8 t1 X
* Return nonzero if get value successfully */4 n8 K# ?! q8 V8 H' s
int GetExpValue(_Tstream& istrin, _T& nReturn){# @! z7 [0 a  y# V4 d
    _T t[3] = {0}; //雨中飞燕之作/ {0 D  `  G4 |( F. }
    char csym[3] = "++";
6 N& B" z( ]9 K+ x' s; g& ^    int nLevel = 1, nERR = 0;
+ z$ N2 z& m, Q    if(!(istrin>>t[1]))istrin.clear();; u- A8 p- k- D! l) F# W9 l
    for(;;){8 l8 l( x& e" N) @, t5 p$ b  s
        if(istrin>>csym[2]){/ P: e. }2 O" C+ v
            switch(csym[2]){) i+ _2 T- E5 x. k9 ]
            case '(':
$ r/ ~2 Q3 o* D( v. [, k6 I* A                if(!csym[1]){nLevel=0x100; nERR=1;}else$ i6 y) J! z& h' `( i
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
4 _; B* r2 Q6 f9 M8 C6 T                else{nLevel=0x100; nERR=1;}0 W) u# O$ r- e" T- j8 `
                break;
8 N. A+ S7 U% p+ c            case ')':. Z. j1 W: a; Z! |# }* p
                {nLevel = 0x100;}break;
9 F, ^) ]7 P2 `. o) p            case '+':case '-':case '*':case '/':* [' F+ d" _7 v7 u5 I" X0 j4 }. V
                {csym[nLevel++] = csym[2];}break;0 D* ]# ^) t. {
            case ' ':case '\r':case '\n':case '\t':continue;
; l" E# U3 }7 L8 @/ }! ]$ O            default:
. n2 [2 j* u, C3 q' p3 L; M. t& @( |                {nLevel=0x100; nERR=1;}
2 a0 i! z' P9 D7 Z- \* x/ D            }
6 o1 ]) r, I5 ]8 Y            if(nLevel==0x100)break;
$ _( A8 j. K9 H0 c2 m            if(nLevel&0x10 || istrin>>t[2]){
9 f4 S* `0 l6 c% y" d- J                nLevel &= 0xF;
: U9 D# l" I. Q! j7 ?# b                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. ?$ }5 l- T* l
                if(csym[1]=='*'||csym[1]=='/'){
" c8 Z- I, ?5 X  H- v! v1 ^& Q                    GetExpValue(t+1, csym[1]);2 D) I9 f/ _$ t
                }
" o& h5 P) }$ U0 ?7 S9 p  Q" }                else{9 G# g: C$ l3 {+ R- B6 O4 v- n! q
                    GetExpValue(t, csym[0]);8 t+ r8 L( G9 R/ W
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
& l- u3 q3 [2 B                }: v5 D& |8 h! Y
                nLevel = 1;
% d. l% |2 j0 N" |, ?8 w5 E            }( x& X" N4 U' u
            else istrin.clear();+ F& P5 Y, |$ L$ _( X0 N2 u
        }; p; \5 ?, h% g( V: q* {
        else{nERR = -1; break;}/ \* b/ Z( ^# g" ~, }2 }
    }
! h+ y6 b# t$ k9 y+ k    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);$ N* @, m  J, q' p" g' H' D
    else nReturn=GetExpValue(t, csym[0]);
0 ^; s; ^/ n! v- f8 u    return nERR==-1?1:0;
) k# X+ h3 _6 N5 F$ @) }}}% \% ~& G% w7 U; Y$ W

" P4 t9 x# K- \3 U" ^' |" x. C9 J# c) k5 Y, m: c" g  M

0 o& a0 P6 E% Q, \函数模板使用示例:
0 f. g; @& @: \; J- `0 m: j2 f在以上那段代码的后面加上以下代码:4 v4 h' S& X; V

8 S) R9 C- e* E' h6 h* @ ! a( _' T; E  [2 X
# q- |% x/ q7 y* B8 i7 T
程序代码: / Z; s# c% j* D& Q1 h
! c+ [- [; Y; T/ [' M8 {1 R
#include<strstream># |5 o1 [, Z4 ]1 ?, Y9 X
#include<iostream>
# u- p. L9 ^& o9 g( Y) h#include<string>
5 U- s$ J  y! Lusing namespace std;
$ S( `3 q4 Q& l' i$ m" wint main(void)
4 F2 s+ k4 \& n2 C# a{
/ n3 n7 _) ^2 Q# ]9 q    string s1;
4 P5 R( K1 h* a# X; J    while(cin>>s1)/ [6 R' m  Z" k
    {
8 X& R8 r4 Z! C. a1 {" O. ]/ R0 T% Z        istrstream isin(s1.data());3 \( g9 N0 Y3 T0 z8 P! N: }
        double d;  W! n* G, k* h8 [$ C
        if(fy_Exp::GetExpValue(isin, d))
3 O# l1 K2 L5 c7 h9 G8 {/ T3 j        {7 F6 i' ]1 s) B- K4 v7 o
            cout<<d<<endl;3 n. @* }9 W8 `% r3 R2 x- S
        }; ], t5 o3 I. T+ `1 L
        else
! d) I& g, _8 `' q; P        {" t. j: T0 z6 U: l+ d- |, o. x9 i
            cout<<"ERROR"<<endl;' j) G) g: k5 y) |5 ?% E
        }8 \( ^% i/ A/ j2 y
    }
, z) {1 r( K& ]2 l7 B: W9 a: O, Y0 C    return 0;
8 h4 E. p6 ~3 u7 y3 ^, k; R}
% F3 E; c) B7 F4 i; ~" U* J+ a7 N- G6 O$ [+ a
* k: J5 i- s9 g( t. l. c
然后编译执行就可以了(*^_^*)
# r+ Z7 Y% |1 ?其它:TC++上一定编译错误,不保证在VC6上也能通过编译
: U9 o8 s. H+ o' F6 M9 L" G      建议使用VC7或VC更高版本,或者使用GNU C++编译

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