返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,) H/ I3 _  P' i* s3 y! s
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式5 ~( t  _9 P9 V! C% k6 ~1 X5 s
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)) s4 b( a% G& s8 ?( N# ~
参数解释:0 l8 }) H; r7 D
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
* i( J4 L, j- MnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# k  \2 W" p, g返回值:+ ]! s! Z+ m  Z
返回非0表示计算成功,0表示计算失败有错误
  \; i, B4 K9 M
; d3 j1 n& x8 I% X# i; V
1 ~3 F" Z0 l9 M0 d8 T3 r, }# v- q1 E  L# L
程序代码: ( Q7 [6 ?5 W' D

) v% y2 Q7 q& C2 I6 anamespace fy_Exp{9 D+ m( m2 N3 y6 X4 t
namespace {template <class _T>
6 V' N9 z% y7 v+ Dinline _T GetExpValue(_T t[], char& csym){
& x9 q, e# ?" K% Q+ ^    char c=csym; csym=0;. R5 }3 S7 C6 C- ^" {
    switch(c){& z* z' a0 F! B7 m+ d5 u
    case '+':return t[0] += t[1];. o/ W, f# d8 M- z& [8 S
    case '-':return t[0] -= t[1];
% T4 y/ W6 O# i, R( l. f$ j    case '*':return t[0] *= t[1];
- @/ N# |# A( N# _    default: return t[0] /= t[1];//case '/':3 x0 o& O# n3 |4 R: b7 F
    }
1 `! A7 B& |0 @& V* [/ V0 z}}/ y/ c. q+ E, I0 q5 i
template <class _T, class _Tstream>  @4 z( W  \7 q' x4 b+ q
/* _Tstream: inputstream, _T: get return value( e1 x& L' D' @& p% r
* Return nonzero if get value successfully */2 T% Y: E5 j! v+ m" \' L
int GetExpValue(_Tstream& istrin, _T& nReturn){
( d) N9 E, l+ h7 l    _T t[3] = {0}; //雨中飞燕之作1 a; k1 S7 Q5 v  U2 o6 f$ y  ~
    char csym[3] = "++";
% O. p) N2 J8 A3 Q, C    int nLevel = 1, nERR = 0;
/ n! |0 c5 ^# x$ F. ^3 N& {2 W; H    if(!(istrin>>t[1]))istrin.clear();
. |" `  a+ d3 @& Y' T6 H$ L    for(;;){
) q$ `) _7 B& R9 [" T# x% G        if(istrin>>csym[2]){
2 s! z7 h0 x7 _7 [9 k            switch(csym[2]){
& \, Y' j( T/ c1 t            case '(':7 w- N& M! n1 L& M2 W7 L7 t$ K
                if(!csym[1]){nLevel=0x100; nERR=1;}else
' J7 C8 R6 o! o$ N  q                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;" D) h+ w; P( O. B' J
                else{nLevel=0x100; nERR=1;}
" C+ L0 m; D) H# y# m% ~                break;
& b- |3 \" N/ `# L1 ], L0 }            case ')':' M4 C# v( O  s  A! _6 h  D) l
                {nLevel = 0x100;}break;  d" c4 N. l( h2 W9 O
            case '+':case '-':case '*':case '/':7 ^1 {0 O5 q' N( }  z
                {csym[nLevel++] = csym[2];}break;" V8 F  e. q! J: s  Q; ?
            case ' ':case '\r':case '\n':case '\t':continue;
+ V9 k4 T7 g3 Q' w+ e            default:( _$ [7 a; q% Z3 A3 j6 x
                {nLevel=0x100; nERR=1;}
$ V' O* s% K# N% G! F1 w+ d, ^            }
3 R2 U9 S7 f$ r' S            if(nLevel==0x100)break;
: R1 `( W, S9 L$ A* ?            if(nLevel&0x10 || istrin>>t[2]){
3 C3 L, E/ N) }. s' o                nLevel &= 0xF;
# d4 a7 T  m( D4 t# C3 }                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}* B' k7 p) p3 t( K6 v6 j% S
                if(csym[1]=='*'||csym[1]=='/'){, V0 R6 P( Y0 p1 q8 O- y
                    GetExpValue(t+1, csym[1]);
& V. a% Q/ [$ R$ ~0 q                }
6 @6 P7 v5 ?/ Y6 O& t                else{. [+ L! R, a1 M& w8 o* _. e+ h- @+ r
                    GetExpValue(t, csym[0]);
* Z* o) ?) H+ z, T( d                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;' E2 |. J8 p' u; K. D5 _+ t  a
                }
  X9 w( u( P/ }: j2 ?( h                nLevel = 1;1 a9 c7 \, {" |4 u! _% m# }/ i
            }9 z1 ^: B. Q9 C/ g/ U# H
            else istrin.clear();: V! O% f& g4 Q2 P5 |' J. _0 t& g1 ~
        }
$ g* H8 h/ o) w2 G$ j        else{nERR = -1; break;}
/ o" e* ?4 f% l    }
% v! J2 Z& G- h' v    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
0 `: }! g+ v5 N( U! C  [    else nReturn=GetExpValue(t, csym[0]);
: W% |1 z, t% U; |7 T; l/ n; N2 }    return nERR==-1?1:0;( u) O' W' y/ k7 G0 N. t* s2 \' h
}}
. d3 P2 X( a" v" V9 F, ]1 Y
* B7 D' E+ w2 N; Z; |, o
! H; ~  o3 R1 I3 e
, A& y& ~8 w# V* [函数模板使用示例:- ]" t- M% r2 r# }
在以上那段代码的后面加上以下代码:
" q$ u# m6 e& ]9 z$ g, m7 o' Z8 f# c0 R$ L4 D

* q1 N4 }" A/ F0 p: J7 U# }0 V& j: o4 N7 _, ]+ A7 _' R9 o
程序代码:
5 t8 {" W2 Q1 e8 l# F+ j( {9 Q2 N, e6 D; j# ^
#include<strstream>
; G' N3 P" G2 A- @$ ?8 `#include<iostream>
' v3 |7 u; K$ T' x# e& i  T  l#include<string>* A" h4 a& ~/ h4 n
using namespace std;0 [% ], I. ]) B" Y" J( G" E2 T
int main(void); I8 `9 c) L0 i. H5 b* v
{
5 X# H& u+ V3 K& f$ d/ @    string s1;
7 R# g+ E* D+ h: _# ?0 N    while(cin>>s1)/ i0 ]6 X+ G# V3 E
    {
+ e0 v( Q1 A8 O. m$ d        istrstream isin(s1.data());
( S8 d: ]8 z; m+ i0 g5 T        double d;
! Y% b( T) B) n% t$ [* v9 M        if(fy_Exp::GetExpValue(isin, d))5 R' S+ O0 q2 i3 O* `% Q
        {
' `3 M# t) T/ a4 l9 i' E            cout<<d<<endl;
+ @% W& n$ ]# |8 q& g+ A0 P        }
: ]% F. t/ V  e/ n: [        else
. }: h9 A- ]" Z4 z, `. R* s, l        {% E  `' P+ h# t' O3 F- s
            cout<<"ERROR"<<endl;+ u/ E+ b5 N4 h" u: V" g% _: y
        }
2 R7 v/ }& }3 i7 [    }
5 n2 [3 `7 U# ]" o, h8 @) M! \2 V9 D, M    return 0;) h% v5 t: j$ I* k' @* {) J
}
% a0 A( O4 ~- c9 [! W2 @1 H6 h9 z4 E$ K8 e
* Q& r9 N* X4 ], \, s
然后编译执行就可以了(*^_^*)
, s' a% G6 x( S4 _0 X其它:TC++上一定编译错误,不保证在VC6上也能通过编译4 G, a" q) a- P9 }3 j) U, b0 ]2 h
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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