返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
8 i, s+ L2 H9 h) \3 X' q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
! }5 |1 q, l- C$ M6 |; j只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn); q+ ?5 j5 o, G7 P$ h% p3 u
参数解释:$ r# b9 M; L1 E  h
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流. K7 S! K& V' d# b, [
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定7 v7 g& [, h4 g8 }! f( U7 A$ ~3 \
返回值:. O: `* E9 e9 t4 [
返回非0表示计算成功,0表示计算失败有错误
% H3 a: ]2 D( n. _( F9 F$ H9 `; v" P6 `4 q. O5 F

8 u* k3 Q, @1 X; V/ W" D
5 m- t( [+ [" g" F, r, l; k程序代码: 9 Q9 X3 ^$ N6 s8 H7 e
  [& [5 d7 L& ^7 f! O2 g9 q4 ]
namespace fy_Exp{
. L9 @- @+ v5 O6 p; unamespace {template <class _T>2 w! _( M2 J3 ~0 E% j( n
inline _T GetExpValue(_T t[], char& csym){
7 Z& {. q6 W# u    char c=csym; csym=0;
: c2 U5 m4 C! s( J' S; |    switch(c){& }- R/ |0 M0 B7 X8 x# V
    case '+':return t[0] += t[1];/ N2 K. C! R9 |, o# h
    case '-':return t[0] -= t[1];; |: A% S$ g7 {2 `: J
    case '*':return t[0] *= t[1];% k2 X# {1 v8 ?6 Q) ?: y
    default: return t[0] /= t[1];//case '/':
2 s4 X% {! g$ W; e6 F, j    }
2 D7 s& W! u7 ]5 s7 J8 J}}+ w0 `) L0 m4 Q
template <class _T, class _Tstream>
2 G' a  i5 P" Y, M/ @2 |/* _Tstream: inputstream, _T: get return value- {" ^8 `3 |1 e# Q
* Return nonzero if get value successfully */
7 n  l8 I  X# w  c4 iint GetExpValue(_Tstream& istrin, _T& nReturn){" t9 c1 I% r& h' d* \+ N
    _T t[3] = {0}; //雨中飞燕之作
1 a1 ]/ D6 Q+ l1 J* M    char csym[3] = "++";, r: I4 X1 i7 p( _' ]1 k$ T6 k
    int nLevel = 1, nERR = 0;' Z% @2 K; r4 k
    if(!(istrin>>t[1]))istrin.clear();
% w( j* B- X) Y    for(;;){
1 ^, D! K  ~  m! A0 e8 Y        if(istrin>>csym[2]){
( X6 U$ g4 |& b4 y+ K            switch(csym[2]){
, U+ i+ ]8 Q; w1 ~            case '(':6 ^. c  j% N2 R* [7 v2 @8 W
                if(!csym[1]){nLevel=0x100; nERR=1;}else2 G4 Z3 o% }7 E
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;; ~$ h( w+ }- e0 O
                else{nLevel=0x100; nERR=1;}
6 K9 o2 a: r1 m7 ?8 A9 O  \$ B                break;2 a9 l0 P9 S' W
            case ')':; H. C2 N  v3 |* n7 q
                {nLevel = 0x100;}break;
5 H$ `& I9 k* U4 s$ ?1 c% F- K0 r            case '+':case '-':case '*':case '/':% ?% k2 L# J, v. p* n
                {csym[nLevel++] = csym[2];}break;
; ]% J* R, k( r! r            case ' ':case '\r':case '\n':case '\t':continue;2 d8 S9 S) y; K( K& j: H' o
            default:% \$ h  t' O2 P) C' P. r
                {nLevel=0x100; nERR=1;}( j6 l- x3 F0 N3 d, g, M
            }7 l2 _  y( _# W) ?
            if(nLevel==0x100)break;
2 N$ W& q& \2 y6 [) R5 X" U+ T            if(nLevel&0x10 || istrin>>t[2]){, D! ~" e8 ^# {$ p
                nLevel &= 0xF;
$ n8 k2 q0 |( X. L                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}5 E; m1 m- g* A9 N5 s* ?% G
                if(csym[1]=='*'||csym[1]=='/'){
3 P  M2 H9 N  t) C; M! w2 t                    GetExpValue(t+1, csym[1]);+ a) j, L: a! o0 H- ^# c
                }' N! {: C( b; Q( S
                else{
3 `  T, V& p8 e8 m( L0 j                    GetExpValue(t, csym[0]);
7 t9 G3 }1 _0 @! p2 z. r                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
$ s2 ^8 \" F" y8 d; e                }8 c9 d9 `( N5 o1 ]1 F; q
                nLevel = 1;% l& M; n* m2 e# A3 d+ a5 D5 r2 G# d
            }
6 I6 C$ K  @, G+ c  ^            else istrin.clear();/ P+ ^9 A* n* K+ v
        }) F- w0 z9 U3 m8 I* t, e
        else{nERR = -1; break;}
. j& e' Z- h) V+ N, E6 O    }# j' ]( p* y. M
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);4 E7 J) V! }4 F) ^3 q# M
    else nReturn=GetExpValue(t, csym[0]);$ Y, L- W" t$ `$ _
    return nERR==-1?1:0;
3 }8 |: b% x% k; B}}
0 f' H8 `! f7 F9 J3 q2 O2 h) v  t$ G$ y; ?2 \# b7 U" J7 B

- }  q* q* v2 `( E' Y+ C6 ^- W& S
: |- r7 |* X1 Y" T9 T函数模板使用示例:
' {& e3 Z/ y- v& s+ E( l在以上那段代码的后面加上以下代码:
, x0 Q; X0 |; H1 _
1 H1 o& b: @$ Y/ Y' ^1 l. v; w
" T! S9 e. |, b; x1 N4 q+ |& w0 e7 ]% b8 @8 G0 p
程序代码:
3 G9 p: y" H  n! T0 z: d! G; D1 y
#include<strstream>
* H, f$ Q* q& E9 U3 b#include<iostream>
1 R9 x' m3 D+ ]3 U. l8 x#include<string>
& e# ?9 {: V( l+ s2 Ousing namespace std;
- |: m' o1 B; j2 V# lint main(void)6 j1 D4 r+ M  S' ]5 e* U9 i( Z
{
7 f% {/ n% m8 R" \    string s1;% C1 b  _" X& B" p6 d# @) H/ D
    while(cin>>s1)
" k( ^: i2 }) m/ o    {4 g; y& S/ Z/ n8 x; Q7 A$ Q* q
        istrstream isin(s1.data());$ Q: k9 P; R0 r3 F0 T
        double d;
% n1 z7 Q0 i( r        if(fy_Exp::GetExpValue(isin, d))* Z) B( o# J& P. D. u; v
        {
3 o/ o0 V' @$ U) D4 b            cout<<d<<endl;
; F! _3 ~7 A8 [        }0 K0 H. n/ Q" ^- J  n% k0 k5 I- P
        else
& C# h2 @" O' n: N0 Q        {
) c$ W; i( K0 K5 g  e6 ^            cout<<"ERROR"<<endl;0 j6 [. p. k0 }" |1 R% e, B
        }, v% G. V& t6 K. n+ d% x
    }& p! |6 Z' |/ u$ u& K" p1 T
    return 0;, L: B* g$ o5 o  Q% E
}" [  D& S. ?+ Z) H( d; W/ [

6 d, x' U1 o* x, |8 L. @0 b( c7 g( r. z0 \) @( m* M5 g9 L
然后编译执行就可以了(*^_^*)
* F/ ?/ m1 x1 ?其它:TC++上一定编译错误,不保证在VC6上也能通过编译
+ T7 d' n2 O$ Q      建议使用VC7或VC更高版本,或者使用GNU C++编译

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