返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,3 V* l* e2 ?1 y9 `4 L
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式4 z4 W) ~8 a! |
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)+ E& O; ?+ s0 @& w- ?
参数解释:6 F# x1 ?5 l- o: F# c& y& R
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流" K' j: R5 t0 T4 I" ]- p1 U
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定4 C0 i4 z# I) G$ }" W0 g8 l8 W+ {
返回值:6 i* `' M: L9 r) g( X
返回非0表示计算成功,0表示计算失败有错误. m7 o7 }0 o" _/ s0 K: ^
8 W  b/ N1 z* t, |+ G- Z
# Y) a% g6 P0 z! s
  J8 s4 N4 a6 b$ \# k4 ?
程序代码: 1 t3 X" Z; b3 ~$ M; {& l! }) d5 L
5 v  M1 O2 N2 N+ s
namespace fy_Exp{0 ?" s9 r1 n: w. a) N
namespace {template <class _T>1 e$ y" j1 P! j& T/ D% d4 j) ^
inline _T GetExpValue(_T t[], char& csym){
1 o- [- p& D9 Z6 @    char c=csym; csym=0;
( B" n! O, i; x" l: [6 k    switch(c){
- ?$ w, D- U  U5 l& q0 e" y    case '+':return t[0] += t[1];
( @4 _( o3 N7 {; a9 R: w( ]# G/ H% j    case '-':return t[0] -= t[1];2 R/ t4 y4 o0 I! X, A! r
    case '*':return t[0] *= t[1];
) [4 r/ c8 X* x    default: return t[0] /= t[1];//case '/':
2 f* f& P: n+ m$ I+ U( Z& w9 k    }
* D- |% N$ ~" @* a& _0 l, t}}
3 X/ h* q' t7 v; o' N3 g  x5 ltemplate <class _T, class _Tstream>
! }# z, f  U. z5 ?5 `- p. v/ r) u/* _Tstream: inputstream, _T: get return value
' n8 B# _+ T' M! m) G* m* Return nonzero if get value successfully */
; S5 V# b1 [$ [: b: f% Gint GetExpValue(_Tstream& istrin, _T& nReturn){2 L3 B8 v0 A& A2 _4 ]- u
    _T t[3] = {0}; //雨中飞燕之作) S% u& s  t! |! Y' M5 r
    char csym[3] = "++";/ a$ ^8 I6 L5 W0 j
    int nLevel = 1, nERR = 0;& F, g0 v, r& d+ Q1 j- Z3 F
    if(!(istrin>>t[1]))istrin.clear();' g2 u& l: k) q8 ?/ b
    for(;;){
1 i: l' o. a- c( ]% z        if(istrin>>csym[2]){
5 P6 k* X- Y) n0 t: C1 Z3 T* F            switch(csym[2]){7 |3 H6 E' }8 i/ x, l  \
            case '(':
# ]# \9 I) [. ?9 c. X0 h                if(!csym[1]){nLevel=0x100; nERR=1;}else
; `, }& U/ h( R' m! X+ U                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;8 [6 F& `& R* O6 ?! d( v3 s. k
                else{nLevel=0x100; nERR=1;}
' N  k0 a  Y% N3 b                break;7 ~' h: ^& w0 t
            case ')':, v" Q8 F3 }3 z- C) R, g* |. G3 d
                {nLevel = 0x100;}break;
2 s4 [& F6 b2 c7 o; M' {            case '+':case '-':case '*':case '/':7 S+ f# {& ~6 J8 Y8 M( v
                {csym[nLevel++] = csym[2];}break;
* Z3 h) l) u  U1 J            case ' ':case '\r':case '\n':case '\t':continue;
8 ]% ?& r- w+ B" g& C            default:
1 M  Z- M7 B3 C( b5 F6 a+ `9 F                {nLevel=0x100; nERR=1;}
4 z* z# a* O, b1 W3 a( B            }8 }7 A( v! d# D% ?3 r7 _& U. I
            if(nLevel==0x100)break;
+ J- i' c5 [$ e/ R) c: P            if(nLevel&0x10 || istrin>>t[2]){" g8 K8 y# E2 z1 T7 Z
                nLevel &= 0xF;
: k+ g: f) n+ o2 |& ?* j                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
% M: x6 ]2 j; k( {2 T                if(csym[1]=='*'||csym[1]=='/'){
1 V5 h! |4 g) p1 K5 K  `* ~, a                    GetExpValue(t+1, csym[1]);
, A0 ~7 U+ k$ }" |/ D2 O: k1 y. c& ~                }, T! D* ~( t  P+ C# L- y
                else{# o7 N( d) m3 N& ^( w
                    GetExpValue(t, csym[0]);$ C( ], a: \1 S* N
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;* ]& Z0 @% T) D7 Q! ^
                }
: V" b" c: P, U8 `  f1 B                nLevel = 1;" [# ?. V" z, L- q" f: ], X6 z
            }' ]7 `: R- L! @8 Q
            else istrin.clear();
8 J8 o8 J% Y4 a% k0 Z6 I        }) t% Y6 K, w& t5 p. S" E! R; I* g
        else{nERR = -1; break;}
  n% z: Y. [1 ~5 ~    }
% S; S' m. E) x/ {  g. ^: |    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
1 }# u# N% @4 J' R% j$ b* [8 H, i8 V    else nReturn=GetExpValue(t, csym[0]);6 U. S! K7 p. x! m* ?4 S
    return nERR==-1?1:0;
  @2 U2 j; S8 x1 y  a! T}}2 D+ [1 q# l6 Q- Y# z& w& W0 n4 S+ D
* y3 ^  ^6 u* U3 F; q8 |
" r( R4 l# g- z0 y- A
( q. R( H/ }' C# i
函数模板使用示例:( p. B/ I7 l- r* \) A* m
在以上那段代码的后面加上以下代码:
3 |1 y& l. R8 V/ v$ Z, d0 W0 u5 A/ q1 ?7 q4 I# p4 K0 q4 Q* Q( C

/ F9 L* @$ [. i9 J. d: x
; b$ m1 |! m  k, E; k. R程序代码:
8 ^6 f' U9 g3 f5 A# h
; L% c/ e' A9 T; R8 G" Y) k" m8 |#include<strstream>
+ t0 ~6 {- T1 @# o#include<iostream>
2 M' H; s. \/ E#include<string>2 C5 G5 e* x* ^. s* Q
using namespace std;$ g* \5 |7 }1 {/ v1 j4 m0 N6 t
int main(void)" P* X; Z5 E1 @8 }! v
{0 s4 }( A5 h! k( V& M
    string s1;  o+ o% `; A# d! n/ r
    while(cin>>s1)! X. S5 F9 h; b, N. C& _. B* Y9 K3 _' G
    {* G( a9 P% H' E0 n: w, B
        istrstream isin(s1.data());
3 ]  a( z' I% B, }+ d# [0 e        double d;) m1 T% U7 j4 J
        if(fy_Exp::GetExpValue(isin, d))
: Q8 n- q' M4 j  m" W, H+ d% o, l        {
7 r- L4 f, }% C7 b4 [            cout<<d<<endl;
9 R2 ?7 ?6 e# b: Z' Q0 ]) b) A0 N        }
( N6 }0 u+ Q( h" K6 f3 k0 E        else* Q: @5 Y' N1 I4 w3 ~" J5 M
        {
9 e, \) ]( P3 D            cout<<"ERROR"<<endl;! d/ Y4 D; W1 m- ~" \& ^0 I
        }7 L5 _0 r* p: {' y/ h4 w0 i
    }
/ K* x0 Z6 l( ?" A7 v- l    return 0;
" {4 n, b: B9 T1 s' v& Y; L}
' y+ w3 S  i/ P. |" T
  [2 _8 |$ J5 O: e5 \: Y, @" c) y) p/ m+ W
然后编译执行就可以了(*^_^*)
0 R/ ?% Y/ j% u/ u7 d$ b& D其它:TC++上一定编译错误,不保证在VC6上也能通过编译
% w% m+ E  @* Z  \9 E: |0 A+ j      建议使用VC7或VC更高版本,或者使用GNU C++编译

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