返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,$ l* B/ w( n+ @$ S7 i
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式; Y! X8 _- O. S; `  `( z( f$ ]
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)1 s/ R/ J6 I" ]6 }
参数解释:5 v6 f; s$ Q" {6 {4 h3 G, I$ _
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
* N& p2 l0 A; X& J  D- TnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
; s( U( N" p! U3 f; J+ j3 e7 ^返回值:
; b' K7 l1 i! q: Y# W% Y. M: V返回非0表示计算成功,0表示计算失败有错误
' S) o" C, Z, B1 e6 E# w/ U1 U# N" N' H* m* n; l& ?; `; x
5 Y) d* U# G6 J! }: _

3 Y9 {/ p- Z6 ?& J6 D3 ~) B程序代码:
- K; Q; A, P4 S1 c/ p0 S; o; @: z, T# n$ a5 z# c6 O! x& u$ N
namespace fy_Exp{6 ~1 k  {7 M. @. i8 \
namespace {template <class _T>
5 J" a2 w9 J" O2 B+ ?inline _T GetExpValue(_T t[], char& csym){5 ?1 @" e' B. A: ^
    char c=csym; csym=0;
" U+ i+ Y) k$ X, w8 X, e    switch(c){8 q1 _5 H, T- q+ z9 u9 P
    case '+':return t[0] += t[1];# ^" P7 `6 o/ f
    case '-':return t[0] -= t[1];. }& b2 F0 F$ m
    case '*':return t[0] *= t[1];
9 Q3 x' R% y5 j    default: return t[0] /= t[1];//case '/':
* [% a! ?. T: a+ i4 l2 {5 U8 s, U8 D    }- g; d6 y# b' I/ ^
}}7 x( s/ l/ [* |9 {- G2 E! Z* F
template <class _T, class _Tstream>  G$ c7 p9 P( j' E" k" y
/* _Tstream: inputstream, _T: get return value
0 Y( h" V2 ?* d5 @. B7 l- R7 F* Return nonzero if get value successfully */
& B2 W! g' L& Y6 _& }0 _7 Vint GetExpValue(_Tstream& istrin, _T& nReturn){! |9 o6 \' G: x  K
    _T t[3] = {0}; //雨中飞燕之作
7 b5 r3 R8 C: W5 K3 z9 E3 G    char csym[3] = "++";
$ a: L& v3 r8 W9 C5 ?/ y7 Q0 _    int nLevel = 1, nERR = 0;/ ^" m! I* z+ x
    if(!(istrin>>t[1]))istrin.clear();" B( E) F: e6 }9 E2 d
    for(;;){& {: D. S; ~0 ]
        if(istrin>>csym[2]){
7 d& z1 ]; x1 s7 B0 {( H            switch(csym[2]){
0 U, y, z  _  i0 J            case '(':5 Q  ^. U" t( {2 {8 _! |( Q
                if(!csym[1]){nLevel=0x100; nERR=1;}else
6 C2 u) D& P  s7 E- \- F9 E6 L                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;! |  w* b& s6 [
                else{nLevel=0x100; nERR=1;}
& N" H+ v$ T" S0 M. l                break;& j" L, F0 h3 I) z
            case ')':) Y, }4 z; D9 W5 ~
                {nLevel = 0x100;}break;: d9 S. m* d8 g
            case '+':case '-':case '*':case '/':
( f( k! ~9 D- t6 p9 v, n                {csym[nLevel++] = csym[2];}break;0 r8 F1 H* c* g. x) g( s
            case ' ':case '\r':case '\n':case '\t':continue;
% f, E7 {5 Y! |            default:7 @9 {9 T. t  A8 L, s
                {nLevel=0x100; nERR=1;}
* I# G/ ?) ]1 }$ Z- s            }
4 Q1 o2 f. h, V            if(nLevel==0x100)break;
* j7 V8 g2 p" U            if(nLevel&0x10 || istrin>>t[2]){0 I8 @5 P7 u2 ]3 L
                nLevel &= 0xF;
- ]' c& F- K8 w# O/ ?1 S8 i% G% G* H( Q                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
% `$ E! L" _) e3 q+ u* n                if(csym[1]=='*'||csym[1]=='/'){
: g& l1 S4 r; ?' Z! }) v                    GetExpValue(t+1, csym[1]);/ A" T) I  E9 N+ m! O7 P
                }
9 Z; B  _# ~/ d- K' g$ c" c7 ^4 i4 o                else{
$ @# [  w7 }- n* d, P6 _8 r9 }                    GetExpValue(t, csym[0]);$ C1 [" T( j1 p0 F- c, ?) q1 [
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;+ h: P  K+ n  J% A" m
                }3 f3 f! B$ }2 Z  v8 [
                nLevel = 1;
9 L0 ~( G* v( p' q# f& g, `            }
3 a' A5 k, L$ L1 p            else istrin.clear();, S  h; J# q2 L; C7 o) G/ L
        }
& B9 L& F3 l4 |        else{nERR = -1; break;}: m4 E( M7 j; V6 S
    }4 ?$ J2 ]% j+ j! }6 {7 \  U
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
* o+ x  t0 N9 f; s7 v    else nReturn=GetExpValue(t, csym[0]);
+ W% I( L0 }1 Z8 @    return nERR==-1?1:0;0 G$ U( ~' A6 Z5 w! W
}}5 {  [9 d& D2 u6 Y2 N; E

) R3 w, u4 ~$ }$ l
0 V/ t; x3 G/ p6 J4 h6 [+ `7 l# ]% M  T& Y% k7 {! g
函数模板使用示例:4 }3 R* @( c' O
在以上那段代码的后面加上以下代码:% M+ b: ?' U4 l5 D
) b1 ^! g; M( t) j. e& A2 Q
" }! c0 w& f! i
/ L- n2 F# u- t" e3 m. {8 ?
程序代码: : S) \  t! i: h# P) y  V
2 O1 b+ \& q. u. v
#include<strstream>
/ x1 I# S: i5 m! v' F$ O7 B5 j#include<iostream>7 J+ m& l! C( l* v( L
#include<string>6 l: O0 ^/ s" g: q7 E1 e# ^. U
using namespace std;
, N4 @* K4 V5 N4 N9 E% m" R! Iint main(void); L3 z* u. }+ m
{$ `+ S. d, r1 l& z" J, K& E
    string s1;7 y; z9 ]$ E7 V+ C" s# K3 K
    while(cin>>s1)
' N5 a- |5 Y* a: o5 e3 P    {
1 p+ i1 T! ]- V* N9 ]- d0 A        istrstream isin(s1.data());
1 K5 B9 t7 ]: u( g; ^2 U( T4 m        double d;
- d7 ?4 R+ N. i3 n8 z& c        if(fy_Exp::GetExpValue(isin, d))
+ @; j( T6 F& }* G( [        {
& ~5 i% B- I- R. P1 v7 U; k            cout<<d<<endl;1 |3 J* g/ ^* m- r8 z6 \
        }
) m# S: t; C- j" L" J3 I3 {        else
! n- m. F1 x7 `0 L# |4 r' Z        {: D1 R4 o7 v) U
            cout<<"ERROR"<<endl;
8 Y1 h' R7 N' O        }9 r0 P" b8 u) V/ z- G4 y0 e
    }
3 K0 W- k1 g. t* K( p    return 0;
, ^5 m$ ~* t; i7 k- f; d}9 {& F$ @$ y- |# m3 f7 }/ }
. r; W$ k( t; _5 @- ?' [# K, M

' P6 D! M9 \3 Y3 x然后编译执行就可以了(*^_^*)
4 N9 j; T" z1 e8 z( k其它:TC++上一定编译错误,不保证在VC6上也能通过编译
  C  U6 K2 }2 O$ ~      建议使用VC7或VC更高版本,或者使用GNU C++编译

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