返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,/ Z% u, i  D; P. [# L! J4 h8 e
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
- F$ u4 J% v$ j3 ?8 ]  x只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
# t- {6 a. T4 ?7 a) T' _参数解释:) z" r$ s* H8 A% D& b
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流  E+ E  w0 F, L
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
+ d* O% Z! h) ?  N% p. e9 l1 {返回值:- n5 x8 _7 o* |7 ^" c5 ~8 M
返回非0表示计算成功,0表示计算失败有错误& D$ \$ E2 Z$ Q7 j  T. w2 ]

$ a+ S- ]6 \$ {( a , ^% T1 |0 k% I* J
6 p& C" t& @1 D- E- ~
程序代码: - n2 B& v) ]) q: U
- D7 \; b! O* p: e  A( ?5 Q
namespace fy_Exp{" F1 f1 w- O( B5 x" S4 z7 d
namespace {template <class _T>" ^1 ^: E! k& a# N7 Z6 ~
inline _T GetExpValue(_T t[], char& csym){+ @; i6 h& f! u9 _  H3 M
    char c=csym; csym=0;
5 m/ ]% C' r8 @; x7 V# u    switch(c){
( ^! z$ l. y3 `, V9 n    case '+':return t[0] += t[1];# s7 z; T! x3 ]" x& R6 U% g
    case '-':return t[0] -= t[1];
. Z8 c" q" c# J6 @    case '*':return t[0] *= t[1];
$ `$ \2 S6 Z) [9 L% v' [    default: return t[0] /= t[1];//case '/':6 ~0 k+ |6 z) }
    }
( t8 P: l4 [  a6 H0 [  I}}! r4 Z& b: ^: c$ c. Y2 i
template <class _T, class _Tstream>: h* T# e6 h+ Z  L* t
/* _Tstream: inputstream, _T: get return value
2 O* R0 `3 [; R, I4 A* Return nonzero if get value successfully */$ v; f9 q! ^% @5 M1 ~
int GetExpValue(_Tstream& istrin, _T& nReturn){
8 ^6 i0 l$ q, T  t5 [( l: a    _T t[3] = {0}; //雨中飞燕之作
# G4 w$ z6 D: G; \7 n# R    char csym[3] = "++";) d4 `+ w3 [% F
    int nLevel = 1, nERR = 0;' v) i0 e: j- M7 [: p. r
    if(!(istrin>>t[1]))istrin.clear();
/ O8 T# t8 }$ i: M! v1 o/ `    for(;;){
) K1 {+ L$ V% O& V        if(istrin>>csym[2]){
9 ?( h# D! P1 b" w: m# P            switch(csym[2]){
1 R8 R+ a5 R( S* l            case '(':( b1 \3 r7 U& |) j
                if(!csym[1]){nLevel=0x100; nERR=1;}else
6 H0 D  i* Q0 |                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
7 x% o# U$ t" s) ]& C  }                else{nLevel=0x100; nERR=1;}
7 ^# i6 Z+ X8 g; e  j                break;2 J9 h. R% B7 }
            case ')':3 n1 Q/ L& w  ?- B' V( B
                {nLevel = 0x100;}break;
- W6 ~  ]5 ~- Y0 b, ~* q/ r5 b. d            case '+':case '-':case '*':case '/':
; C) ]& o: M5 s" X9 F& E/ T5 Y                {csym[nLevel++] = csym[2];}break;( J% u$ u3 r8 d: G- T
            case ' ':case '\r':case '\n':case '\t':continue;+ N4 N0 _; |5 c* Q! j, t; S( x
            default:
  `! g# |& x: s                {nLevel=0x100; nERR=1;}0 n& k) g  ~' W4 G# l. |
            }! W, F# e$ h# u3 M
            if(nLevel==0x100)break;! W6 c& ^7 R* x1 G" P' U: q
            if(nLevel&0x10 || istrin>>t[2]){: t1 P& P. A4 R; z
                nLevel &= 0xF;
9 y% t! o/ c* I& ^- v2 k                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 O$ z2 t* E$ T2 r- }0 O/ L
                if(csym[1]=='*'||csym[1]=='/'){% [9 R6 a  _1 C$ x. w3 _
                    GetExpValue(t+1, csym[1]);
" s: Y1 q" I, c! C9 T/ Y                }
; S. a. n. o0 b2 J, u+ `8 T, E                else{) K! M6 a- }/ J9 Q
                    GetExpValue(t, csym[0]);2 `, h/ @) H$ p% H2 E
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;' z. Y+ G1 |. W+ @$ q2 i' g8 z
                }
9 U2 w5 C; t/ U/ Z( o. G                nLevel = 1;# c# Q% z- Q' O6 W: r; d2 Q
            }* J/ O0 g2 z( P) |, c+ s, i
            else istrin.clear();# @! I, l5 d* d* V
        }
, I3 q% J( Q% `" r0 P        else{nERR = -1; break;}% [1 |1 m, G$ ]: ~. W
    }
2 [; J2 m0 Z& j    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);  E$ Z5 x) a' B3 N
    else nReturn=GetExpValue(t, csym[0]);* o5 ?2 C, z' K7 z4 A. ^9 A
    return nERR==-1?1:0;# J/ P# h" ^+ E1 I* ]6 p" F* c8 @
}}
' P9 Z6 R7 ?% F+ J: x/ R& J5 u* S2 J& S/ d7 k  |. {

' R2 Z. `- ?8 J9 V
& |# T) ]5 f" g' P  h函数模板使用示例:
* S6 B; _$ b2 {- Y/ o& K8 Z1 {  r在以上那段代码的后面加上以下代码:( W% M" T- z5 H  k( a+ P0 B
! P: m5 z7 @+ A: [* u
! r" n) w( }+ h" K) M

' ^# x0 [; |- g& ^程序代码:
- V- z9 f# ~' P) N; k/ v* y* w2 p( b5 u7 p
#include<strstream>0 u8 y& N9 h1 r/ j9 q
#include<iostream>
' f4 K  {5 z$ N% t9 x% d#include<string>& V4 s3 u+ Y+ {" s# E
using namespace std;
0 M) X; `  j, J7 B  z$ mint main(void)2 k  P; c7 R* {1 |' ^
{
# G3 }) Z9 C% r5 e! i1 h    string s1;
  R  Y9 D9 m7 t  M4 V3 ~7 K    while(cin>>s1)
& Z5 Z6 h3 T- K( T2 `    {
% g5 `  H5 s2 n- t) r        istrstream isin(s1.data());  f6 O& K# R( ]) J
        double d;
, g! Q7 v1 h! L+ t$ ^        if(fy_Exp::GetExpValue(isin, d)): i' [( j: ?! b0 {. r/ \2 Q) j7 ]
        {7 g5 n/ R, N: X* p1 @+ C; `, s2 z: L
            cout<<d<<endl;! ^& ?, N7 Z& @% y
        }5 N8 J' u% d: Z' b
        else9 R- ~1 l- x# a
        {
  \  }# T3 O; s) E7 i) w5 F. g            cout<<"ERROR"<<endl;
2 _% g& p! p3 D+ O$ Z4 W        }9 a' H7 }! a& Y$ t# o2 n4 t( O8 X0 }
    }; x5 o: w2 R3 f
    return 0;
; a7 `5 _/ |$ o! b}
+ _; Y. p' D/ ^0 g2 Q' I- p% C3 r$ S

! z% `. r6 u+ f% O9 \& H然后编译执行就可以了(*^_^*)0 ~/ @( J* q+ a: m/ |5 K! B% k
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
% M4 p: W0 q: h4 |- V" r$ F      建议使用VC7或VC更高版本,或者使用GNU C++编译

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