返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,8 H) W3 g( b6 `* h" g4 s3 {# V2 Y* R
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式- _3 U$ S. O& n  P
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
' r+ D. {: Y' g1 a- t参数解释:$ ^$ I9 a; p$ I4 i8 v! U4 h
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流( Q5 I# I. `+ J9 M7 {. v1 W, K
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
2 k! D% V: P# t% }$ E6 \1 b: \: G返回值:
% y1 y; Q5 ?) {返回非0表示计算成功,0表示计算失败有错误7 x5 V) f( A: d/ D0 N
- d0 J  C9 G5 Z" l, i
/ Q2 L7 C. v% q5 ]7 t
) m8 o  Y! q* H$ P
程序代码:
( H6 o% U: s3 y+ F( b4 y0 {1 n* n5 }2 @0 `, G0 z- e- J
namespace fy_Exp{+ S1 p$ ?" u, x9 q1 ^# k7 S5 W
namespace {template <class _T># }! ~) A. Q- V8 u" H/ v: u
inline _T GetExpValue(_T t[], char& csym){6 \& R0 p5 R. G( I' A- U+ i8 U
    char c=csym; csym=0;- y& P- D+ l3 h
    switch(c){
7 k; I* t( F5 Q! [, n5 P1 G1 I    case '+':return t[0] += t[1];
5 Z, i! ~  ~0 v, v4 A1 R3 Z    case '-':return t[0] -= t[1];
+ O+ \4 L( A9 y4 D    case '*':return t[0] *= t[1];
5 Q: b% H" {( h# s9 Q    default: return t[0] /= t[1];//case '/':
) g/ F1 s/ X. n7 G0 D. m3 G7 T    }2 J- B( X  h0 p) H: ^
}}
; l7 b8 e* n5 _) f0 Ntemplate <class _T, class _Tstream>
- {! z$ N* q5 x/* _Tstream: inputstream, _T: get return value
/ k( L4 R- O4 m! [6 e  T* Return nonzero if get value successfully */+ i% N8 O( P% k; u; C
int GetExpValue(_Tstream& istrin, _T& nReturn){
: T, H& b! V3 k* u9 w- k/ M    _T t[3] = {0}; //雨中飞燕之作) I/ v, ?* ^% @1 ~: ~4 J
    char csym[3] = "++";, b: a, L4 Q1 {
    int nLevel = 1, nERR = 0;
7 @% t* H" e$ L/ ^+ ?0 Y    if(!(istrin>>t[1]))istrin.clear();  o+ @& d$ ^: |6 y( P
    for(;;){
: Y/ ]8 a; Z: `* J        if(istrin>>csym[2]){$ T1 d  |6 y& K! A
            switch(csym[2]){0 W8 P8 e! n( |& @. s& I3 k
            case '(':
# n2 T: p3 z* }+ n" Y  H                if(!csym[1]){nLevel=0x100; nERR=1;}else" u; _; J% c8 l6 j- A
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
8 R3 N0 r/ Z+ I5 G/ x5 ]  P( Q                else{nLevel=0x100; nERR=1;}0 |# M* G1 Y6 t6 K
                break;
/ t5 z- Q% p% A/ b' Y            case ')':" T$ \, T  P$ v4 n
                {nLevel = 0x100;}break;
/ L. L1 z7 C) U            case '+':case '-':case '*':case '/':1 J+ O; f: l. m
                {csym[nLevel++] = csym[2];}break;
9 t* \- m9 Z; u3 p            case ' ':case '\r':case '\n':case '\t':continue;
# n* R; O4 ?) c. C            default:
+ s* C" G7 o2 G: ~  z- k  _                {nLevel=0x100; nERR=1;}
$ d) |; o2 H3 q$ M            }
' {+ ~' W4 q3 q# Y            if(nLevel==0x100)break;
; s# k3 t0 @: k! Q, d$ y9 y& |3 Y            if(nLevel&0x10 || istrin>>t[2]){
# y8 |. V8 J! L+ {" q+ ~                nLevel &= 0xF;/ o4 C0 Q% Q7 {8 |3 G( ~0 ?
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
' f3 f+ ?" w: @. |4 i0 r/ e4 `                if(csym[1]=='*'||csym[1]=='/'){
% [! r+ X7 R" _) |2 Q                    GetExpValue(t+1, csym[1]);
1 z( q( `: u1 j% M: p) A                }
: ~6 U0 z( K2 k& N9 U                else{
2 R' g1 |0 `3 X, k                    GetExpValue(t, csym[0]);3 f& R% @3 [" _3 W+ u7 l
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;- R2 [2 `7 _3 _5 D% L9 P
                }
2 S7 M; g. o" J7 ]$ B4 ~: T                nLevel = 1;
4 Y" R6 e6 l$ s5 n- V( Z7 [1 A- R            }
( }, X" ?8 x3 }; j9 N4 V            else istrin.clear();
- t% S" }7 R+ z4 C1 M9 _, z' v7 D        }  |/ }6 Q$ `' f0 f  d% @. \3 x
        else{nERR = -1; break;}
7 h* |* F9 K' e" r6 e2 u    }
0 H$ r6 B/ W/ g9 L" d    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
; ]+ K8 I3 Y8 U: r/ l1 x    else nReturn=GetExpValue(t, csym[0]);+ g  L1 n; E- S9 G9 }# w
    return nERR==-1?1:0;
  V1 H; {: ~* }, w6 b}}& r. T2 s$ H0 b2 W$ l' q% W# R

" Y# ?) h2 A0 P1 N5 T0 Y$ h- q3 N: D) \; A9 ?. y7 Q

% v: i+ n/ }7 P! @  P函数模板使用示例:/ G3 }/ e; y' |$ C: j# B3 u
在以上那段代码的后面加上以下代码:. z: T" F' T& M( H& U4 C" L( j
8 Q( \9 K( v! m2 h
$ h% a: j. L/ O( b  [  p3 c) p
# ]5 D  c! \+ k9 W6 r
程序代码:
* s% ^8 E* J9 |* t- u% O2 x+ ]/ P
#include<strstream>7 H, O" \5 ?$ s: n/ j
#include<iostream># w5 Y( _, H1 @
#include<string>& R2 `8 i' e+ w! l5 R/ w( w; \
using namespace std;
7 B' `8 T" N) l* g0 ?int main(void)
2 ?8 ]. S7 a4 {# K. g' N; m. w{
# j$ q, A2 l$ I    string s1;; e+ N: s9 a' `5 w. w
    while(cin>>s1)$ a! O0 ~  C% d% P- R5 G
    {7 S: ^& D+ k6 C  d1 ^
        istrstream isin(s1.data());4 W1 ]. v* |  c
        double d;
+ [' a% l- D2 f4 w2 ^. T- E        if(fy_Exp::GetExpValue(isin, d))
8 L* Y, ~, d$ O. c+ L0 p        {
+ h6 i  T$ a5 c            cout<<d<<endl;% N- }- b: V; ^4 ]5 D- b: j" b
        }$ `0 N" L/ V  p% f4 h) ~
        else
3 {" C5 z* M; J' b        {
' n# A% j: k) u2 J* ]1 x+ I! l, e            cout<<"ERROR"<<endl;
$ I- x3 ]. ?6 t        }
3 @8 X; l4 l# g, n0 h# `    }
: j1 v( n1 t9 u5 z) ^4 W- J; Q/ ?    return 0;
* K, U! h' V" @! F0 ^- V' N+ [}: R5 I3 c6 e9 j

5 f5 B; c0 z8 Z
6 ]0 l1 e  @9 d% B- P) F3 b0 {然后编译执行就可以了(*^_^*)/ f  N# i# h5 W0 @  Q6 J' f6 U
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
7 P9 I' G0 x0 r( Z: h6 s0 Y      建议使用VC7或VC更高版本,或者使用GNU C++编译

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