返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,- W% P* x  k! \+ k$ f# I
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
$ w0 _6 P8 F/ }) p" i* _6 `只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)0 j6 ]' O, ~: d" \3 n  ?8 k
参数解释:
' g3 T) [: d5 m5 ~8 O3 ]istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流1 K: Q$ d+ C2 y, E' ~
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
  [0 e4 B. ?" ~& E9 e, s* _返回值:  g) _2 [; G1 a. x( E1 M- G
返回非0表示计算成功,0表示计算失败有错误
2 {* V0 t) z8 V5 t1 J* N
" D- W$ i7 \$ s8 x: f; Z% C   s) m0 v* P# j2 O

& c. O; G- A  r# V+ a9 Z# Q程序代码:
+ C: C, ~- H* E0 T
6 F2 o( A# H' e  V* G. [8 O. K% W) g7 xnamespace fy_Exp{" e; k1 m6 [4 t- z3 Y: g* ~* G$ z
namespace {template <class _T>8 E' e/ G6 [$ j3 c+ W, Z
inline _T GetExpValue(_T t[], char& csym){: E8 ^. X4 A; u% M7 e8 t5 w2 J  Z/ n! r
    char c=csym; csym=0;4 O# G$ v9 Z6 G2 y& P' \& B1 G, ?. a
    switch(c){
+ [5 T- c' s% E1 Q9 y8 D4 [! A    case '+':return t[0] += t[1];7 G# J; D# l& E$ K$ `& `
    case '-':return t[0] -= t[1];
" r' c6 S3 O: [7 [9 s& \& o' L4 e: ]    case '*':return t[0] *= t[1];
5 |& v+ v* r' j& }, }4 D: n    default: return t[0] /= t[1];//case '/':% h4 `/ L' D7 y7 q
    }8 t3 z4 \6 V/ R1 k1 g# c5 j/ S* d9 u
}}
* v  `  p# r! O, B, B9 wtemplate <class _T, class _Tstream>3 S3 X) `4 H3 h
/* _Tstream: inputstream, _T: get return value) ?- H: n. b9 y
* Return nonzero if get value successfully */
5 Q" m+ l% k' ?2 o* U/ b# b7 Mint GetExpValue(_Tstream& istrin, _T& nReturn){
; ~6 }8 S, ?: c6 F    _T t[3] = {0}; //雨中飞燕之作" h+ a/ {, j+ a( @' b1 T
    char csym[3] = "++";
6 E" }. M0 E; D    int nLevel = 1, nERR = 0;" V0 U3 F& p3 E% c; [& J5 v. x
    if(!(istrin>>t[1]))istrin.clear();' S7 }+ w' q7 F0 I
    for(;;){
! h0 F, {' \$ U# d3 \        if(istrin>>csym[2]){  M3 B) u7 d: L& W% Q6 E  m
            switch(csym[2]){
  }# ~& Z/ ]. j            case '(':% O- P& L; G: C/ i
                if(!csym[1]){nLevel=0x100; nERR=1;}else
: z; T! F! a6 G. k8 a6 o. J                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;! {2 H; k( F8 M2 q7 v
                else{nLevel=0x100; nERR=1;}
" y& z# \# c/ y2 P6 V! H$ p2 t: f                break;3 A  Z* S- H( i6 u" X. J+ `
            case ')':
+ u6 S% C- R! l6 i' g4 M                {nLevel = 0x100;}break;- T+ o1 ^( \6 h
            case '+':case '-':case '*':case '/':
7 W6 F& K" Y6 D+ ~+ L/ T: D! S                {csym[nLevel++] = csym[2];}break;
- {2 v# t9 T! R- g4 ^( [% A$ A- R3 m  B            case ' ':case '\r':case '\n':case '\t':continue;
1 T! t+ x2 t; i. o4 k  C+ ^            default:! O6 B% i& V5 g6 |% b7 m' L
                {nLevel=0x100; nERR=1;}. N+ C- R1 o3 H9 W
            }- P9 T) B' v$ x
            if(nLevel==0x100)break;
  a! t& m; _( h, L: T  A9 R            if(nLevel&0x10 || istrin>>t[2]){5 n' ]2 U% {6 p' N
                nLevel &= 0xF;4 ~4 s# O4 X- l9 F( ]/ r0 `
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}0 M; i3 q$ b7 o1 V- G
                if(csym[1]=='*'||csym[1]=='/'){& H0 ^$ x2 q* K
                    GetExpValue(t+1, csym[1]);4 @" c4 {. }; Y) j; X
                }
0 M& c0 m  O, {* P7 y' z9 M" ~                else{% b' L) x: J% `% k- \$ n
                    GetExpValue(t, csym[0]);& w' B1 k1 w" a+ v- q" Y/ O, x; r) }
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;/ K+ }! y% L. P
                }+ K7 T. n4 ?: N6 u( c! z9 Q
                nLevel = 1;
8 ^3 O- l1 D/ P: O/ a* O" \& X3 e, F            }
8 K' r* d% t/ `; v: N- _            else istrin.clear();+ |2 d- c; n5 G4 u& w4 q# f& G
        }' x& J( a$ Z4 r8 X* L8 D1 ?
        else{nERR = -1; break;}
, S& o- D2 B9 m* ?/ M; C/ P    }
! S" W  e, ^1 n& Z. ]2 G4 ]    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
' c% a5 \' c0 a    else nReturn=GetExpValue(t, csym[0]);- X6 I4 s+ q' E3 A6 M
    return nERR==-1?1:0;
: n$ {+ C8 F, q$ m/ X}}$ ]0 M5 g' i' e; ?* {& @% f! J/ m
' o8 Z. r$ W$ ^% X( k" A! Y

( i$ P/ f: h, g; e( S  |
1 o+ l& F" u) m  M  X函数模板使用示例:0 i# \, _$ B& k* n
在以上那段代码的后面加上以下代码:( k) O' d7 U. g4 v; L4 O
# v( Q! p: f* q) ~' X
$ b5 ~) s8 e) Y/ r
2 S0 h) b8 p* ?$ H" [* X) @4 K
程序代码:
3 x+ I1 @8 K3 q3 o6 \2 p+ ~8 }. M) s+ C$ j4 T$ P! {% a, h
#include<strstream>
- L( b0 g$ ]/ l$ v3 S; m#include<iostream>5 f) p) Q" a1 R% _4 F
#include<string>
1 [) q' M  p0 C' f: y; q; busing namespace std;2 ~. A' B+ o+ H- d
int main(void)6 x1 B( C4 q4 \$ b' C) P9 n6 g9 j2 D" A
{0 l) D) A' C* u+ V9 _
    string s1;  P4 F7 J2 e/ S9 h. _
    while(cin>>s1)
6 ~+ j3 L- w3 H! ~8 G/ T% `# b3 o    {8 l! d1 Q8 |  K- F, T
        istrstream isin(s1.data());
6 C  o: _" {3 _/ J" b, L/ n+ M0 q  }        double d;
" B9 N9 x1 q4 U2 H+ q2 u( k; R        if(fy_Exp::GetExpValue(isin, d))  F0 m' ?5 M$ c9 b/ ~
        {# K, z' d# F( E9 |1 u7 V; [/ G
            cout<<d<<endl;
3 r( T3 ~8 ?# j! _! ?' Y5 o7 I        }( ]1 |- u0 c. `! c6 c0 N; _  n
        else2 b) T4 `; g+ w( q& F
        {3 A2 c/ Y9 v8 l. ?9 K: Q' k' I
            cout<<"ERROR"<<endl;
  U2 b7 g/ s# b' ]9 V5 Z# _        }+ g( L; H) ?( A9 y% q) ~  R
    }* O7 B8 }! k6 w3 p$ F6 o
    return 0;
6 s; j; ?- C6 I8 l% z' O: |6 G}
5 o& i/ U0 M/ i5 T
; P' H4 X$ K  v' S
0 Z7 y" ^9 X* D1 N# Y8 Y* u然后编译执行就可以了(*^_^*)
. C4 m  g) ~8 d* C1 E1 J/ e2 D其它:TC++上一定编译错误,不保证在VC6上也能通过编译
" S7 f: N( G8 w0 u      建议使用VC7或VC更高版本,或者使用GNU C++编译

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