返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
0 Z8 Z; p4 o5 o9 P1 v% S一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
7 ^: g4 ?" n0 y% e1 ]只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( T& M6 r. S! p! |0 ^! g8 q
参数解释:$ z. ~  A  r( O4 n' A1 N' `2 N$ y
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" c+ ?- @8 v2 B% o( s7 p3 ?2 YnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
3 g: D# ^' V5 [返回值:
1 e% |; L! m- v" q4 A返回非0表示计算成功,0表示计算失败有错误
& F# g  |; r) X- {% Q
1 o+ U+ u. h- |: O ) A$ i' r2 R' @" O8 S; h* r! V- }
0 u8 M+ x' d) ^' i9 W
程序代码:
: Q" ^, K) v; x: h, k- V( {
& P7 |/ O, Q% u% t& Nnamespace fy_Exp{
+ s' Y* {( A5 n% }) E: Inamespace {template <class _T>9 j5 L9 s- A- N, ]" F- Z
inline _T GetExpValue(_T t[], char& csym){
7 D+ a3 `  d; S* P    char c=csym; csym=0;2 C5 ?- f! {2 x- F, a3 G
    switch(c){& M' Z  L8 l3 M* E7 V
    case '+':return t[0] += t[1];
( E; A6 d" \# C    case '-':return t[0] -= t[1];% t2 [4 S: w+ X! k. ~' o) U( O* P$ C
    case '*':return t[0] *= t[1];% u1 S  B: L% L2 a7 ^: n' d
    default: return t[0] /= t[1];//case '/':
1 O0 ?$ R& q0 |/ ?    }& B2 o* a) S8 y4 y+ L6 t
}}+ B# k8 c& z6 {5 W
template <class _T, class _Tstream>
5 ~/ W  d0 a9 |; M% d7 R; p/* _Tstream: inputstream, _T: get return value
8 j/ e) I  h) R) O. p1 ~* Return nonzero if get value successfully */
0 l: @2 D: f6 m  bint GetExpValue(_Tstream& istrin, _T& nReturn){
) D* H  B# z# \+ z. P6 q7 }    _T t[3] = {0}; //雨中飞燕之作
5 G$ U, ]0 r- N8 _" Z( u2 t    char csym[3] = "++";
+ G+ }( E& v  W  [8 B4 P    int nLevel = 1, nERR = 0;5 P, l9 u' P- |) o: s/ f; H5 Z; |
    if(!(istrin>>t[1]))istrin.clear();
' k/ Q6 n; O+ P0 m0 a& N2 @' d    for(;;){2 l( H( X7 M8 L( r/ ?
        if(istrin>>csym[2]){/ ^' {9 `/ L+ z# x- e
            switch(csym[2]){
6 `* Y' V/ w- j( s: R9 E            case '(':7 M1 F+ G% f5 [! c+ M7 g- t
                if(!csym[1]){nLevel=0x100; nERR=1;}else
" E: a" H8 e' x8 ?+ C                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- G8 k- Y3 U- T7 p, T
                else{nLevel=0x100; nERR=1;}
' y/ F* u) L. K5 O                break;
. b* O: H/ s' V  Q            case ')':
8 ]- h- q+ W2 B% R6 G0 b  m; V                {nLevel = 0x100;}break;& ]& R" B0 H8 h3 Q' |6 p3 k
            case '+':case '-':case '*':case '/':' X& v- G) @: }  g4 l
                {csym[nLevel++] = csym[2];}break;5 v8 @  J! z& }. ^& \
            case ' ':case '\r':case '\n':case '\t':continue;
. c" e( n' U- u            default:( o: ]/ C0 O6 Y! f6 o5 i: S
                {nLevel=0x100; nERR=1;}1 r9 q! c& L. C# g  _) w
            }
$ T$ w  ?& c! Q/ d* M" l            if(nLevel==0x100)break;8 y& Q8 v+ Q6 H! h
            if(nLevel&0x10 || istrin>>t[2]){
$ P' a: M& L0 M' \                nLevel &= 0xF;
3 s) {: v5 @' x  @                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
: I4 l) v5 L. `8 L, b7 f+ C                if(csym[1]=='*'||csym[1]=='/'){( B' Z0 `/ @/ k& H- D* G) {, o" a
                    GetExpValue(t+1, csym[1]);
; C* j" L3 B! ^4 ]8 P- q                }
+ d  T1 j' _4 o0 _                else{
0 Q0 ~- I. A6 ~$ p( j                    GetExpValue(t, csym[0]);- J6 [; p8 m/ `* E5 m; _/ |" u
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;# |7 T( v8 p5 Y# ?, d
                }
4 n; P( ^) J/ k0 M! }) @                nLevel = 1;
; X3 o. f2 z/ a3 w" X            }
4 v& |# H5 R- u- T' I: t1 \# T9 }            else istrin.clear();( e8 K3 F8 r1 E* L
        }
9 M! W0 {4 N. C        else{nERR = -1; break;}
2 x3 u; {' S2 P    }
7 N$ i7 ]& V3 W$ N; F2 K    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);* ]' u9 E% v" N+ U
    else nReturn=GetExpValue(t, csym[0]);2 A$ F# g% [! A8 V( k1 g
    return nERR==-1?1:0;
( ?& K# V; C% K: D}}
9 d0 J; I. ]7 D1 t
$ r( z1 Z, P, ~: o. d& m3 B, k. f+ h" R5 Q1 m$ q; P
' e- o1 R& Y# ^. o2 C
函数模板使用示例:  |5 J$ B" n" w' M3 Z0 O
在以上那段代码的后面加上以下代码:
7 q6 Z. Z7 R% g( H$ C, F- a4 r& m* F6 Q" j. P& B7 f( o9 z7 `% F
+ r+ S9 h; ~% T% |! Z7 Q4 g
+ t$ h3 n" |2 `! s' V* C2 A
程序代码:
- I6 R8 t1 M. p$ o- }" ~/ Q" p8 [- F3 V2 g" X1 L* d7 q) P% g+ s, c
#include<strstream>
5 `8 w8 C0 O; Q  U#include<iostream>
1 I6 D* n+ O1 p- o+ _7 H+ R8 P#include<string>
- O, O/ ]7 |, z5 j$ O! i: ?+ dusing namespace std;
2 W; K) _! ~: ]! Bint main(void)
( F; d; U& n# e% R0 J{
. u5 c4 r7 @3 [' u# I    string s1;
+ F2 Y/ E/ l; D4 H5 w  @    while(cin>>s1)! }: i7 v( X  d7 D# T; V
    {
3 C: `5 a" M' f, e/ i! F8 |* p        istrstream isin(s1.data());, a5 q. `+ n. q9 e; E
        double d;; Y/ n; G( F3 ^5 `: p
        if(fy_Exp::GetExpValue(isin, d))9 b! E* Y, d7 M0 T. E
        {" b" r. z3 h( w7 V* q
            cout<<d<<endl;
: s+ F. q5 Q3 y+ z$ z        }, k1 B3 c# t2 E: n
        else
9 T1 X0 z+ c; a) }9 d& m        {
) [) q  W; e6 f7 ]' u4 A            cout<<"ERROR"<<endl;; M1 B2 y+ i$ Q( `" s+ b
        }
7 F" e4 g' x: G2 r1 m    }( G! q/ r0 x- d7 K8 t
    return 0;5 @: ^: e3 A, x! g6 [$ H
}
( |+ _* S0 g$ U4 h% f: t  j9 c( @0 x; c
  n1 Y# u% x4 r0 [' U4 w. s1 b, X
然后编译执行就可以了(*^_^*)
. m* g% D8 m% N# }+ i, C) |其它:TC++上一定编译错误,不保证在VC6上也能通过编译
( ~& h' Z4 _0 n: l8 y      建议使用VC7或VC更高版本,或者使用GNU C++编译

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