返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
( p: `2 @& D* s4 R% P- F一个很方便的函数模板,可以并且只可以计算含括号的四则表达式; v7 m1 h% B$ N8 c- p
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 X. j: \5 o: U0 R6 i7 t( _参数解释:5 p( F( I# ]9 z. l  p) ^
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流9 J& T: ]2 a- w' y% s
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定  p8 H& z! B1 _0 V) C* F, e% }
返回值:: p, _+ T* R$ x9 X
返回非0表示计算成功,0表示计算失败有错误
7 n7 R0 H  K" ^6 ]1 \* b. v8 Q; ?/ _7 J& S) |

4 Q8 L( R( f6 J% D4 i4 }  m+ P1 L; [7 W! D$ b  I- [
程序代码:
' x" d. v3 B: l2 S' Z8 Z( a, `
' D& ^1 O6 a; {5 o: ynamespace fy_Exp{
! z% k* d6 f( n' e, J$ ^namespace {template <class _T>
. c- i7 a; r7 @4 N2 N, vinline _T GetExpValue(_T t[], char& csym){
: n, {: L. V# H* N4 A3 G- l    char c=csym; csym=0;
4 r3 h4 ~& z) p  V! l" e' K    switch(c){
0 H( J: E3 T4 ^    case '+':return t[0] += t[1];, I: ^, }7 v' f- e
    case '-':return t[0] -= t[1];
: K* ?9 f2 x( v5 f    case '*':return t[0] *= t[1];
. j' S& @. \0 x. A' z# ]* M0 H    default: return t[0] /= t[1];//case '/':) B0 p' `( ~- }# H- q9 w5 K
    }
& V8 Y* A: ^* h- t}}
. m0 F% [8 m  R: e3 Z" Z2 ztemplate <class _T, class _Tstream>- G, ]4 U' V# j% U
/* _Tstream: inputstream, _T: get return value
# N  u5 o2 G) u/ B  F  c3 N* Return nonzero if get value successfully */* G! m+ j3 n0 P0 J
int GetExpValue(_Tstream& istrin, _T& nReturn){+ t0 f& Y+ i8 o: Y
    _T t[3] = {0}; //雨中飞燕之作
+ ~  @, X+ {; b1 C    char csym[3] = "++";" ?+ w! {3 L1 f3 M8 \7 _7 u, K
    int nLevel = 1, nERR = 0;
$ _7 o( L/ |- t! j' E3 C    if(!(istrin>>t[1]))istrin.clear();
  X4 a6 Q- e/ E9 I) B# K7 E1 ?    for(;;){+ U5 ^" h" }0 x% Q2 q3 Y
        if(istrin>>csym[2]){; r3 R* o" T; k! s% {" H
            switch(csym[2]){
2 E3 N# M5 H9 m) A            case '(':( k, O, j# i+ J+ {2 }8 M5 c  A- Q
                if(!csym[1]){nLevel=0x100; nERR=1;}else
' C7 U1 e. `4 `                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;( d) O8 h- ?+ A3 I! M' T9 Z! T
                else{nLevel=0x100; nERR=1;}
, f$ h  L" q# J5 v6 U3 t                break;$ W+ R( t$ _; p
            case ')':2 Y" I9 M+ z% y9 M6 H8 Y' X2 k( r  G* U
                {nLevel = 0x100;}break;$ r( d8 u4 m7 B( X1 m
            case '+':case '-':case '*':case '/':; b) }; ~: B! Q  T) m/ s
                {csym[nLevel++] = csym[2];}break;
0 R$ T- j& e6 J" P" n            case ' ':case '\r':case '\n':case '\t':continue;% P; o2 J$ p8 y
            default:
% x4 |  V# A# H& d6 x                {nLevel=0x100; nERR=1;}1 _$ h5 h9 L% H: [. K
            }
# r4 w5 Z8 ~, r( M0 e0 K$ W            if(nLevel==0x100)break;
0 G2 P/ E3 g' f            if(nLevel&0x10 || istrin>>t[2]){
7 m/ _- h/ H2 X* R8 y- P; Y                nLevel &= 0xF;' Y# ~$ j# ]" L2 b# h
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
! Z2 ~- p  Z- T- f, z$ X5 v                if(csym[1]=='*'||csym[1]=='/'){
  E2 E% b- x$ w/ a/ d, I! U: j                    GetExpValue(t+1, csym[1]);$ S0 |' |& }  t9 L) i& n8 ~: g9 I
                }
- T7 r8 _0 J3 @  I: q# `2 _                else{
+ n/ I4 y9 g# M3 d3 K                    GetExpValue(t, csym[0]);. y& v. ^2 [1 f
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;" w& m- d! o7 B7 f
                }9 r/ k% u2 K: Z/ ^4 n4 ^8 h: \
                nLevel = 1;
/ P2 d- h/ \) h! f% A8 H            }
; @1 i$ S3 a8 X* s# L            else istrin.clear();
1 ?3 l. ~4 N4 ?        }3 s; S3 y8 j: k# n
        else{nERR = -1; break;}
+ g( B1 m' L) [: h( _    }7 Q, y& |2 `9 g7 K; o0 N: M
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
. o% c. B( ?- u3 W    else nReturn=GetExpValue(t, csym[0]);! w' J( F9 j( |
    return nERR==-1?1:0;
: \7 }" Y3 @* R+ M/ J2 b6 J}}% p! I% R8 t$ M8 O7 w0 k
8 f: v$ a  w" I5 ~0 H- O: }

, ^; ?+ K/ l0 |; K: B2 b/ \2 @/ R' h7 Y6 n
函数模板使用示例:* I- o* [; L4 E& g
在以上那段代码的后面加上以下代码:
! v* Y" a" H* w& ?, b, @# @" K$ W8 y4 ]- ]
) v2 R$ M! l/ O' n3 d- Q8 T- t; G

5 a% @5 O" q6 _程序代码: ) K6 ]3 @- k# i7 x! f( t
% I, Z* l) O, [0 H3 y- g" u
#include<strstream>- Q% }  a8 t3 X' X9 C0 n
#include<iostream>
9 |8 i* u5 j2 c% z+ ~6 _#include<string>6 q, t8 x3 S8 o$ C( d: J& G) B# j& J
using namespace std;
* ]' D8 f+ z& v6 d* C: t* Q, tint main(void). l; q( s0 v! |% i7 ~. G1 F
{
; D% R1 ~0 V$ c, v8 F4 B! n    string s1;- S' R0 X  F% Y" `; Z' C
    while(cin>>s1)& ~) j! c4 \2 C, U3 ]( u  s
    {5 Z/ K3 f3 x. M" J. u
        istrstream isin(s1.data());
4 U7 k% c% U1 R, @        double d;
" q$ ~& h4 i5 G        if(fy_Exp::GetExpValue(isin, d))5 ~  m& l5 g$ p
        {& e& y$ k2 r) ^. y" x
            cout<<d<<endl;+ u& V$ r, L, ]7 H; [5 K
        }! A# |  o& y. [! O. b3 ]" Z2 ?
        else
3 I4 h! I; i4 c  v        {
. r2 p) H8 f, i% I3 p            cout<<"ERROR"<<endl;
) u& y* H# b8 h" S; e8 W        }
3 G( f  g$ ^3 Y7 d0 V$ W1 n5 E    }
( @) d% x3 V- `! D$ C: b+ h    return 0;
* I/ Y3 ^+ e( D! _6 x) m}0 r: m% G( k( t

+ e: k7 n3 k: u% t) e) ]1 l) `% d  H6 ~! j  Q' r
然后编译执行就可以了(*^_^*)4 L2 j7 z+ u+ m! B' j$ ~0 _
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
& k2 d& ^9 x: j, a2 H3 ?: p+ \      建议使用VC7或VC更高版本,或者使用GNU C++编译

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