返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,/ B: g; c# _$ Z' X4 J, H1 m
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式- b! m' e( ]# O  k
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)1 f: }* K9 p+ V' c+ h
参数解释:" o; @' Y7 S4 N0 Z" k
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流" R  b# l, d/ r
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
& F. K9 Z2 R4 n返回值:9 Z' W( t& H& K- D# V
返回非0表示计算成功,0表示计算失败有错误& V- x$ S" V5 H
- h4 L6 D" e5 N

3 h3 x8 W7 ]% U* V  s
3 k% v( B+ y/ R( R程序代码: 9 I- @3 L6 P0 Z8 R# `+ O$ H
2 g/ Z+ G0 [: K" s5 `* ~
namespace fy_Exp{8 m! r) @8 _& {8 K3 L
namespace {template <class _T>. m! T2 ~( t, Y
inline _T GetExpValue(_T t[], char& csym){; `& F" z5 {1 h) a3 q, J4 a: t
    char c=csym; csym=0;1 w! {5 i' I5 {
    switch(c){* M( ^$ n' Q9 p) S( j' p
    case '+':return t[0] += t[1];
5 P9 B1 U6 {' ], A! c    case '-':return t[0] -= t[1];
: H5 x1 k' ?# V" g0 ]+ P    case '*':return t[0] *= t[1];( x" f& R1 b2 d% {: j3 z! [
    default: return t[0] /= t[1];//case '/':
# Z; |5 R5 W7 O5 m2 E7 r, S; \    }% ^% q, C1 x' S/ }/ s
}}$ B0 h9 V1 ~4 w. F: f  E
template <class _T, class _Tstream>, a$ V& p* ?! O+ ]; \
/* _Tstream: inputstream, _T: get return value* o7 a) j) J9 U. [
* Return nonzero if get value successfully */
, Q( W1 g" \9 a# ?0 Z$ \int GetExpValue(_Tstream& istrin, _T& nReturn){
6 }$ j" ]1 g* M    _T t[3] = {0}; //雨中飞燕之作
. ~% E7 F% c, l    char csym[3] = "++";) q- B' g5 Z# e" S. ?# @
    int nLevel = 1, nERR = 0;/ G. m& o( m* v2 o: w1 e, W) I5 K" h
    if(!(istrin>>t[1]))istrin.clear();5 |' B' A8 q0 @. ^) t
    for(;;){
, F$ F( a$ l  X( Q6 b( n        if(istrin>>csym[2]){) ^4 i# H+ f0 u& c4 P
            switch(csym[2]){
/ c8 l0 k0 A1 x, _2 t            case '(':! F  A* ~  P6 w" `' o. x. X
                if(!csym[1]){nLevel=0x100; nERR=1;}else
' V0 w0 d* f* h; x8 Y( v                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
! e8 m$ Q  A& N$ S8 `2 h7 a                else{nLevel=0x100; nERR=1;}
: l+ ?# L- |: o, H8 S9 ?+ C% c                break;
5 _. n" e( S* X# o3 j8 z$ ]            case ')':( l& C! T+ k' P' e
                {nLevel = 0x100;}break;, {$ `# l" p! L8 l
            case '+':case '-':case '*':case '/':
0 r2 ~- X/ \! v: e9 E2 d  y5 K                {csym[nLevel++] = csym[2];}break;& w) F+ C' t- h% W, I* U& s; T# U
            case ' ':case '\r':case '\n':case '\t':continue;8 f+ ]# b: S- q" p* Q% [# h4 c8 m0 \1 T
            default:- |2 T8 K7 T  w% E' k
                {nLevel=0x100; nERR=1;}
$ t  d& U2 t- ]# i* U            }* {4 u* R$ p& @. ~3 N
            if(nLevel==0x100)break;
% j# {6 C+ T0 E" f+ R  t            if(nLevel&0x10 || istrin>>t[2]){
8 r6 w. X1 G( F  F: j                nLevel &= 0xF;7 ?: R* y7 V$ f; ~7 e# X
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
7 ?5 m$ u; S4 l                if(csym[1]=='*'||csym[1]=='/'){6 u! `5 f3 ?# p3 r: ^0 x2 B9 ~
                    GetExpValue(t+1, csym[1]);9 @  q  }1 K6 f# c3 W
                }* u* r2 A6 E% p, n+ p# F
                else{; o8 N, z; x8 l" L
                    GetExpValue(t, csym[0]);
8 k( A. ~" W( E: I0 r                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;! N  O, p4 B/ T( J
                }8 _7 F3 c6 V1 S' u
                nLevel = 1;, M3 c& [, u$ t
            }
8 G4 N5 j7 J0 R$ p+ u: J            else istrin.clear();
! z# o$ _7 y6 U& n8 ^) w& N        }) W3 ~% m% F4 M
        else{nERR = -1; break;}% @" R0 K7 y& |2 ~0 S$ T$ p
    }
  P5 }& |7 i  T8 x    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
2 H( x1 y3 Q. @- g: e9 D: d- ?# {    else nReturn=GetExpValue(t, csym[0]);5 `  q- s( ~. ]# s
    return nERR==-1?1:0;* I' j/ T! z9 R& K1 p
}}
8 t0 U6 D3 F& B$ L* X
' G2 V( [5 \: @0 @! T# b) t- W! D+ v1 ~8 K4 g  S
3 g7 y! F( H- E& r% o1 {+ N
函数模板使用示例:
7 s, }( F( ?% u( W8 v' B( A9 u3 L在以上那段代码的后面加上以下代码:
1 u* F* ~' r- R$ {/ `: V- N) }2 o8 @( S% f8 y

. f( ^. e3 }9 d( A9 n
- ^: n$ J) w6 |/ a9 x# X程序代码:
. ~" P& J/ N6 r% k1 e3 u' g& d5 W! U, l  s4 [4 R
#include<strstream>& e2 }; o* F" ]; a
#include<iostream>
  X# \6 r* D* q#include<string>9 G' s; W/ \7 A
using namespace std;
6 {) D- H' G$ l0 r. }/ Gint main(void)1 T& {' ?) x+ l1 e3 r
{6 }9 v+ {3 c) X( q3 D/ z  Y% @
    string s1;
0 b. q* `# K* ]    while(cin>>s1)
7 V; v8 S/ g' Z    {: |7 T0 t: P7 ~* n) Q
        istrstream isin(s1.data());
! r+ K- @& x  u/ d# v3 w        double d;/ R1 W: e; A. F3 X3 l0 t
        if(fy_Exp::GetExpValue(isin, d)). ]2 l/ \6 v, M7 l: l+ U2 O0 C
        {" A4 S$ _7 ]+ g2 a+ o! p
            cout<<d<<endl;
3 c4 N: U& _  s$ d  w        }7 a0 y3 P/ o/ N3 I
        else5 ?3 K! e5 s- }/ ?+ A: b/ t
        {& I3 M  b! l2 m' `8 Y
            cout<<"ERROR"<<endl;1 s3 X1 w8 {2 ^2 x$ U
        }
0 v' L* c( Z6 C* `    }+ \4 Q/ ?+ w: K/ i4 i2 R" g% H8 M- X$ @2 L
    return 0;
7 S3 q! p! B+ z" s' I: T' J4 g}0 P8 E1 J* Z& C  {: t& @

! |" L: l. _' P
0 h: e, ]" K: J- r, J然后编译执行就可以了(*^_^*)
  I. d  C* ^4 O. W) Y. o其它:TC++上一定编译错误,不保证在VC6上也能通过编译
4 Y  x/ `  p+ A; u% B      建议使用VC7或VC更高版本,或者使用GNU C++编译

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