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

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

在9月8日那天我特意编写的,给大家分享的,
; t- H$ G4 b: |; q5 C一个很方便的函数模板,可以并且只可以计算含括号的四则表达式1 T: F" ~; s$ V
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)# N+ @( K$ C; q) D
参数解释:5 i/ D. l+ y+ ~
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
4 P# U1 D& X. z6 T* g5 L/ u) bnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
2 n) n! D8 A* w) ?# y8 m4 n( x8 R返回值:# A2 q0 O' Q! V# ~% Y/ S
返回非0表示计算成功,0表示计算失败有错误. Y; ?) I' I" W4 l) T) o

+ S  s2 n- C% H6 j# y# {  b
0 T0 R8 P  K" c1 Z9 ]( \; V, |+ @; e' p; f; `0 y
程序代码:
: v2 q. N- k6 G( n9 ?' U+ w+ ?1 D9 |6 o. ]
namespace fy_Exp{
) x2 ]. B  ?: f) Enamespace {template <class _T>
3 M/ A2 N0 Y& F7 `  \inline _T GetExpValue(_T t[], char& csym){$ w6 n* E1 T) t- M: Y/ O
    char c=csym; csym=0;
( [0 R3 [0 X, l0 O9 g    switch(c){* F2 c2 F) x2 M. b
    case '+':return t[0] += t[1];; P4 ~9 W% R" v  D+ z
    case '-':return t[0] -= t[1];
1 e1 `( @6 V' R+ \; N# m    case '*':return t[0] *= t[1];
9 m3 X6 o' x9 i5 O3 T7 V    default: return t[0] /= t[1];//case '/':
% h: b# r3 A& g& g# M5 E7 |    }
- H- K0 |8 @: H+ x9 m& W% L; j7 s}}
% M3 S0 L8 t, ]5 J$ ^8 ^template <class _T, class _Tstream>* z6 c) C& ~+ z6 r" |- E
/* _Tstream: inputstream, _T: get return value
) @7 B) Z4 ?/ u; N' G. Y6 E* Return nonzero if get value successfully */
( f7 z- V7 R5 J9 e) }int GetExpValue(_Tstream& istrin, _T& nReturn){* H1 {6 c' d! f
    _T t[3] = {0}; //雨中飞燕之作; @, f; y2 a. \- |0 e
    char csym[3] = "++";
% O0 ~( C0 f$ d& }! p    int nLevel = 1, nERR = 0;
9 k; r* A7 G! d" h: y% j    if(!(istrin>>t[1]))istrin.clear();
8 Z/ d! Z7 u) m  b# x) w    for(;;){- I. S; B% E" J& D% c, J$ Y
        if(istrin>>csym[2]){
, Q  _8 m* t; W2 O+ m; o% d3 v            switch(csym[2]){; \. ~7 i" K% ?$ S. Z- I
            case '(':* j: t& v2 J" r! C# U) x" z
                if(!csym[1]){nLevel=0x100; nERR=1;}else
6 S" z! K$ U  l6 B- J                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
. u/ {( q" S9 U; f0 |# b                else{nLevel=0x100; nERR=1;}
1 Q3 {) z" F. O& B- A+ t( y                break;6 ]/ R' ]' o/ r/ P6 l! d
            case ')':/ z7 O5 p' j* ]& d! g3 J
                {nLevel = 0x100;}break;
$ g9 G, x6 m- `            case '+':case '-':case '*':case '/':
3 T, H- F. B! J" I# C( L( h( v                {csym[nLevel++] = csym[2];}break;! d7 J# m: {/ O& Q9 ?% _' X% Z
            case ' ':case '\r':case '\n':case '\t':continue;
4 v" [2 F$ }  u! P* {2 {, V            default:
/ T6 F* M' A; x' L/ y) v6 ^+ h                {nLevel=0x100; nERR=1;}  r% b) |! N, V1 h9 ~) H/ E
            }/ b( n% w. ]( U. a+ v, ?3 s- J) i2 T
            if(nLevel==0x100)break;
1 w" D# h% }2 G, n$ h            if(nLevel&0x10 || istrin>>t[2]){# ]0 K) i, \4 R7 e( i( o- i8 g
                nLevel &= 0xF;
9 i0 [0 x, E. z' p6 i) m& v) H                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}$ _9 ]. J) x& w( T6 C7 f* I7 @; E* ]0 z
                if(csym[1]=='*'||csym[1]=='/'){
' L) s  p: W: Z) h9 x5 b1 j3 V4 |                    GetExpValue(t+1, csym[1]);8 x+ w: h9 D9 k( B2 `
                }7 K6 U- Y# o3 [& M; G" i  \
                else{% ]/ C( R7 K& B! [7 U5 u
                    GetExpValue(t, csym[0]);) h6 n7 _9 Q- M" a) @
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
9 V( B! U2 y. q+ V! s* Z0 b' K                }1 m  Q1 M4 s( l7 o1 W- y9 I
                nLevel = 1;
! ~5 I/ V# {3 [2 s            }3 t% A$ ]5 c9 Q( R% ]& Z* C- B
            else istrin.clear();
9 Z! N0 T+ \6 D- E% J. R+ R9 Y; q        }
1 L! Z4 }% V2 V0 n) ^; S        else{nERR = -1; break;}, ?+ W" ^1 ?% k: N6 n
    }/ N2 m, M, V6 k8 f
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
; k+ r! ^/ n6 x& `$ C: {" T    else nReturn=GetExpValue(t, csym[0]);
3 }1 K: b- q$ d9 ^3 i& f8 Q    return nERR==-1?1:0;
7 s! T" h: P* {" [. n}}3 G7 b8 ]! V  A5 i/ K6 M/ `9 P

+ `- d0 n1 O6 Y: A1 v
' k7 v, g& x7 x- D; O' F9 s% b
函数模板使用示例:- c" X: ~3 S( L2 r/ l
在以上那段代码的后面加上以下代码:1 I3 m- `! q+ l0 S

8 c: k7 U, A. h2 o7 i0 c * {8 X- u5 U! F0 g9 L

, X( o% o: J& x: E# l程序代码:
+ l# x8 n5 {7 y1 y' ?  l- {+ ?1 @+ _! q* f# o6 g$ W
#include<strstream>, Y( ^' v* L. U7 O' o" u7 t8 k
#include<iostream>
' k9 I  f) @$ [#include<string>3 f$ P$ {) u0 ?! k
using namespace std;& x/ }0 l; H& t. I
int main(void)
3 U" S6 ?5 \# x, J{) m" \1 G3 c  N* z
    string s1;+ `" a0 i3 g. N0 e# I% ]
    while(cin>>s1)
0 n7 q4 L+ X+ A2 b9 a3 a/ k5 d    {
- |- }) }' \9 J$ Z        istrstream isin(s1.data());- M+ B& H1 |+ ?; ^; q7 `
        double d;
% o( W; w# \" y: W, d7 x) _' u        if(fy_Exp::GetExpValue(isin, d))
6 S5 U3 Y" f$ e6 e# T6 b5 g( I        {
/ ?" v7 p+ ^% p* p/ I5 I1 v6 Z! O( V            cout<<d<<endl;
) ~4 X) V/ Q7 m0 b- f2 m9 d4 j        }
3 G5 S7 |7 u- U& {( T0 g        else
8 p8 d+ S: y: X        {5 ]( g$ ~. o: l/ |3 h9 q
            cout<<"ERROR"<<endl;
. x: x. J$ q5 B  {' f( v        }
8 l- l5 L1 [; O8 v+ u* b  X/ P0 [2 T    }7 k" @% H" S* A; `- j
    return 0;) Q& g* B& ]$ E( X1 p: g# `
}  J. T- K' `+ U) u9 L

) p" A" }, e6 Y2 v
1 D2 X. L3 M1 M3 G# U然后编译执行就可以了(*^_^*)
# b5 ~9 B5 N4 Q! S$ K4 h! i& z其它:TC++上一定编译错误,不保证在VC6上也能通过编译
0 @; [- b6 I1 J! Z8 z      建议使用VC7或VC更高版本,或者使用GNU C++编译

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