返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
6 ]& A( i: H) [( r" i一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
2 ^- R& o0 J4 n9 H4 Q: T' P" k# }只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
  K2 H8 `* G0 x6 ]0 ?/ H' _* L: S参数解释:0 |, l" v. t7 w! |* b' ?
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
- {% E* U# q: [# RnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
8 {2 I# b% w; ?9 F返回值:
  G2 H3 `- v9 [8 L. _返回非0表示计算成功,0表示计算失败有错误
4 @; N, L3 [( i1 h: C  O& N6 s; U1 E* [4 }! B6 B
, b2 T0 A: `9 z* o* d, i
$ G5 A4 f3 |1 T4 H# D1 F
程序代码: 3 N( w2 P. E& I% A2 J" L
# @( U7 V& U7 b8 r
namespace fy_Exp{
" G5 d, I  X, Mnamespace {template <class _T>
8 u% [2 I0 [, Y  tinline _T GetExpValue(_T t[], char& csym){! C9 P5 \' g( A( Y$ `
    char c=csym; csym=0;$ _* A/ y' K. @$ T
    switch(c){) j# }: X! r1 w3 U0 I' c8 R
    case '+':return t[0] += t[1];) v, n5 h1 |" W$ e% `4 {
    case '-':return t[0] -= t[1];- ]7 }# F3 u7 p. _
    case '*':return t[0] *= t[1];
4 s2 P+ I! M; ~7 G9 w    default: return t[0] /= t[1];//case '/':4 B( ~/ i/ Y$ K- `" z$ o
    }% c  ]; s1 \) _: J" R) O/ k
}}. o& o) g: h/ C$ p
template <class _T, class _Tstream>& v4 u% r! Q6 e+ f0 h" @
/* _Tstream: inputstream, _T: get return value0 E3 u5 Z2 G/ ^
* Return nonzero if get value successfully */3 K' _- C- m1 L* g1 M- |5 m5 E/ ~* z
int GetExpValue(_Tstream& istrin, _T& nReturn){
5 d9 N3 I, f3 b+ Y) ]! ~3 {3 j1 H    _T t[3] = {0}; //雨中飞燕之作
; L1 y9 \" J, z# T1 d3 O    char csym[3] = "++";
( @. u  a1 }" i8 X; X4 b    int nLevel = 1, nERR = 0;$ g- q1 r( |. l! D
    if(!(istrin>>t[1]))istrin.clear();8 Y) o8 ~7 o9 j
    for(;;){
' [$ n/ \& b$ Q+ z& M        if(istrin>>csym[2]){; @) U( ?& G7 U
            switch(csym[2]){- u9 G& e/ |/ v+ z/ d
            case '(':
! M0 b/ q8 G) _: ?- u* H0 X: D# A                if(!csym[1]){nLevel=0x100; nERR=1;}else
2 W1 D3 a* y  j3 L0 N                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
% Y1 I  |/ k* [- I- f                else{nLevel=0x100; nERR=1;}! ^% Y5 Z& V6 z% ^3 j
                break;
; n: \! Q3 m( K9 z" G1 E            case ')':1 M2 s: C- {$ x' y6 M, t, N8 @
                {nLevel = 0x100;}break;
/ m. |9 j) K% t% G            case '+':case '-':case '*':case '/':8 I2 s9 \5 m: d+ _5 r
                {csym[nLevel++] = csym[2];}break;
. e1 A+ Y) g9 W% S+ [$ R            case ' ':case '\r':case '\n':case '\t':continue;4 g$ `  r% C) C8 r% Q
            default:7 l" V0 g8 X/ `6 W) }& m, Z1 i, P; L
                {nLevel=0x100; nERR=1;}4 S, j4 M2 n& e( f- I! C9 H% n8 A
            }
0 R! p' p: [, y  u$ @# q& c            if(nLevel==0x100)break;2 S% ?2 J0 a/ P& m+ _
            if(nLevel&0x10 || istrin>>t[2]){6 l( U5 z1 @. E
                nLevel &= 0xF;
6 o) |% {0 J" z1 i) X) W                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
: M$ k- J( p4 i; {3 v5 W                if(csym[1]=='*'||csym[1]=='/'){; B& e, ?1 Z+ P: P) @8 o' s0 ^
                    GetExpValue(t+1, csym[1]);
+ N) @* E, Z  D1 s) P- u* m/ U# e                }! z5 l" g9 Q, o8 l! Y! B
                else{% {4 x$ S$ [' V( k
                    GetExpValue(t, csym[0]);( e- c* r* c) J! g
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;/ l$ U7 q8 B- Y$ g
                }
: d% t  F# e+ f0 t) V- `                nLevel = 1;& d  b6 G- {" b6 m) L
            }8 e+ d: M. {# j: X$ x" N* p* H4 m
            else istrin.clear();* ?; Q2 A0 i( V; _# e% ^
        }2 Z: e5 U& Q, _+ Z' l  g$ d3 K
        else{nERR = -1; break;}" J1 f( K' R2 f1 M( ]3 z
    }/ B; l( O1 T5 d3 u1 G. f6 S
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);% ]7 w+ T$ u* k8 u% ?. Z
    else nReturn=GetExpValue(t, csym[0]);. A, V$ l' t" y' O
    return nERR==-1?1:0;
. T" k* m  A+ U}}
$ n5 a$ ?, B2 L  P6 W% e0 e8 y
: y! A9 h4 b4 V, x& I
: _# _# Y1 y+ |& N
' e5 h1 O6 y8 X函数模板使用示例:" Z' e2 B3 ?& n
在以上那段代码的后面加上以下代码:7 H( [' t! C. ^6 ]( S, M
6 d  E' W3 ]. z2 |/ L% _) B
) e# k, e" s1 ]! J

; w0 l3 q# x0 t& o, L程序代码:
5 R4 ^' X. X9 ?0 r/ c& `
2 }6 C0 f; k/ k: E; w: G" }#include<strstream>
- |0 ]# ?" g. J( r; l% Z3 O#include<iostream># k! x' s. o% K+ x% ^4 O7 x# l( x
#include<string>
* V! e' q6 P! p6 S$ kusing namespace std;1 F" p* }# K  d; G$ R
int main(void)7 g9 T2 Y* A% |9 I/ v. U; I9 _
{& |! p$ H6 R; s( T
    string s1;* R. U, [* q7 l; d
    while(cin>>s1)
, A' S. q2 _3 L/ J% i" F    {
. O  g) u5 R2 p* M9 v* k! U        istrstream isin(s1.data());- g9 _; `' e9 L  `# l4 T6 t
        double d;  [' d3 N) z9 w, V1 n5 j
        if(fy_Exp::GetExpValue(isin, d)), Q) z0 c& f0 e  I, H  O" _' p+ p
        {
! Y0 L3 E) U6 I6 V% C4 M+ z            cout<<d<<endl;* Q- Q. A- o1 m  F) S: t: O' z
        }
1 V" D1 W; g/ l4 `9 f) \        else' t0 C4 D6 C8 F5 Q
        {1 \. Y% S, p) Z7 ~. @$ f
            cout<<"ERROR"<<endl;
" g0 I' t. B# u# [        }
  I' P1 k( E. E+ c  J! }    }
& X1 @# Q0 ]" E; [! u6 f+ X/ [    return 0;
9 a4 O; F% @" V! ]}
6 ]( ~# Y8 s- |) y- ^0 z
1 s4 p( _; [* t! R$ k" O  e% X9 x  B: y: K, Y
然后编译执行就可以了(*^_^*)
# I! T2 \' S* p4 |其它:TC++上一定编译错误,不保证在VC6上也能通过编译
) G6 L" Q7 D4 W+ @      建议使用VC7或VC更高版本,或者使用GNU C++编译

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