返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
; }5 y/ a* N6 z0 f一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
3 U: t6 U: Z. a/ B# ^7 H只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( c- O& `& _! z2 F7 }4 l; x% L
参数解释:
. w; G' ~% a2 |0 ?! aistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流; j0 A& l9 p, V# R" ]
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定) M$ Z8 h" L! L. j5 w  v% X1 x. \
返回值:
' N5 q9 D0 o( V8 |返回非0表示计算成功,0表示计算失败有错误
; Z; c( X2 H! l3 q) C8 z1 B, C# g+ {+ O+ G3 K$ B0 @
  o% V1 o! H# h5 @
2 `4 k; L4 A/ d1 b% N: t
程序代码: 4 b: h3 ~8 m; g

! S  _3 @9 ^% _namespace fy_Exp{
+ N( l  Z, E( B0 unamespace {template <class _T>% P, ]! X% y/ @" s$ x
inline _T GetExpValue(_T t[], char& csym){
, e: V7 c* ?9 T    char c=csym; csym=0;) n  M, ~" i7 H+ ~7 X) d' T. T
    switch(c){) b. H8 A! p& }" n. S7 m2 @
    case '+':return t[0] += t[1];$ Z, [! @+ l: Y4 p+ t/ o3 ^9 x/ \) l
    case '-':return t[0] -= t[1];+ a1 Q+ q( M- R
    case '*':return t[0] *= t[1];
; t7 L; k" {: J, C: h    default: return t[0] /= t[1];//case '/':6 g  m. z1 e1 p5 O) J- G
    }9 X( X& L" \, w0 V- i% ?& e% G; _
}}
# Y' W( [8 m$ ~template <class _T, class _Tstream># a8 c: L8 r" N* R4 l+ }
/* _Tstream: inputstream, _T: get return value' q: @, G( v7 i1 x7 g% U
* Return nonzero if get value successfully */: i4 A. j; ^# `* X! x
int GetExpValue(_Tstream& istrin, _T& nReturn){
0 T$ r, S) G1 f/ n* U9 L    _T t[3] = {0}; //雨中飞燕之作
, \& [6 \2 B7 H$ p$ H+ n    char csym[3] = "++";2 |  V# [$ y3 v8 g5 n2 H
    int nLevel = 1, nERR = 0;
0 r+ I: [; w$ I    if(!(istrin>>t[1]))istrin.clear();$ v: B/ @+ M2 w* d: f' b- t
    for(;;){
. \" |* B' V# D3 k        if(istrin>>csym[2]){
# ?$ F) T; n  S9 K- }            switch(csym[2]){: f4 s; _* L5 l( z% D
            case '(':- ^8 E- q9 o$ Y" Y% C4 s2 R
                if(!csym[1]){nLevel=0x100; nERR=1;}else% _( b7 l6 n0 D0 s
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
7 m- v: h1 `# u! |  S' o6 R5 b                else{nLevel=0x100; nERR=1;}
: L0 Q6 d  W. T) R! l                break;
3 `1 b6 v! C3 K: l. c* D            case ')':% n6 T: w2 u* ^* c0 e
                {nLevel = 0x100;}break;
8 Y" r8 C: j' \: @$ j$ M            case '+':case '-':case '*':case '/':
) k3 ]* i3 S" K0 k$ ^' x+ q" Y' _                {csym[nLevel++] = csym[2];}break;
9 {+ C6 m4 S' U, H7 h* o            case ' ':case '\r':case '\n':case '\t':continue;
' D% j! y. @! G            default:9 X/ E- e1 J% N& C& d1 F  p
                {nLevel=0x100; nERR=1;}' J' ^4 Z+ t1 ~+ M( `- k9 C) W
            }- y# x, }  L3 s0 n6 J
            if(nLevel==0x100)break;
* w5 Z; \4 k+ S9 b: V- R            if(nLevel&0x10 || istrin>>t[2]){$ Q$ V. d! I# S2 A
                nLevel &= 0xF;
5 b. [7 ~' ~, \" l% t                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! w# W5 j! l: j* e. D# H
                if(csym[1]=='*'||csym[1]=='/'){% k1 u) Y4 ~. Y- ~
                    GetExpValue(t+1, csym[1]);
' y3 Q9 K: G' J# F+ F                }
0 D9 z7 ^" M' Q+ m& o% a. J                else{7 |6 B% L2 I1 O9 W) o  v( N! Y
                    GetExpValue(t, csym[0]);
% D3 c# V% a4 i& `: [7 R6 S. e7 e                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
  n6 o2 @1 E$ n) j1 h3 w                }
- F& _7 m9 T8 c1 f1 y/ f                nLevel = 1;5 b$ n/ C- h  x$ x/ c
            }
, R; W$ T! U) }1 Y            else istrin.clear();6 u/ C" k) Q; L7 }
        }1 P) x. z3 g: o$ y- t
        else{nERR = -1; break;}
' N1 O2 o& v6 T8 \* G6 h. o* |5 R    }7 g1 y/ t( \; s1 F: ?
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);( X% L6 b. `. A8 P: f3 c+ \
    else nReturn=GetExpValue(t, csym[0]);
8 l3 m& q4 s( ^. W% r. {) Q    return nERR==-1?1:0;
: {( j+ _% ^' H# T2 m}}5 k3 \* {6 N/ Y$ h% `* d

/ l: G" V/ \) ]8 j. I3 q  \% `+ i# \) i
4 x' m& O* A0 A: u  _$ x, V# t0 D2 r3 \/ J
函数模板使用示例:( u0 |2 \- v& J' ^3 `# b0 Y3 S. y
在以上那段代码的后面加上以下代码:
. e2 F- x) q$ |% f8 W. Z$ W# K
  [7 |3 s) J& ^6 ^+ i$ ^8 x ) F5 O! G$ L+ l* S$ e1 E/ k
) G4 W# o0 i8 [: l6 h! S1 E
程序代码: # ?( J$ Y- v! `1 i  X( Z4 K

# s( m& F7 ?( z  y- e2 W' K# ?% }#include<strstream>( U5 y8 o! G/ c2 \
#include<iostream>
" X  I$ m* {2 I#include<string>
& x  t  h. i0 q' R. C7 cusing namespace std;
, k. q9 i. {: E/ ^9 Dint main(void)
" h4 v0 o9 w, z6 d{
/ N" L( L- [9 Z' \+ b    string s1;* ~- ~3 i6 Q- O) w
    while(cin>>s1)
1 o6 N3 D9 A7 c+ ?    {
* S( U/ |% G! `' U        istrstream isin(s1.data());
2 q8 y: t6 N/ G        double d;
% v: q9 h3 |4 Z7 D# M% i        if(fy_Exp::GetExpValue(isin, d))0 _7 c' k5 l. @
        {2 R- N- n$ c5 i6 f9 L& F9 [& D. R
            cout<<d<<endl;  U, X% D% k$ [3 H9 w2 j
        }! o+ W/ q1 ]0 s3 c5 K( C3 c
        else
: ]) t- ~, E+ `6 I        {' ], y: ^2 U1 D  O7 E3 }
            cout<<"ERROR"<<endl;! A/ {; d6 Z" k  P
        }
* b- g. j) L: B) M1 S9 `    }
5 L2 O0 c! G' q7 K    return 0;
/ s+ |9 a/ `6 q4 x- ]; S) H, l}& e  k0 \$ D$ D- P

% h3 y0 @7 M$ A0 @9 L3 N2 Q, v+ m) k$ m
然后编译执行就可以了(*^_^*)* C/ X( Z' G, E
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
* h: g, `9 l1 j2 \) {2 g$ D7 a! h/ M      建议使用VC7或VC更高版本,或者使用GNU C++编译

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