返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,7 s$ @; O$ t5 F5 {: }
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
1 I9 P& Z5 J1 D" s只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
: y% @8 |' d2 _' d8 _0 ^8 B1 w参数解释:: I! v& [: {- K. I% I
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
! T' e2 _4 v/ d" T$ Y; }; S; o+ ?nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定3 ~( {9 x' Z) @0 F
返回值:. w% u- S' y, J1 p% Q/ j
返回非0表示计算成功,0表示计算失败有错误5 g0 m! O% ]+ C
" a' w' y% ~- @4 }' T; I) r

! D+ f+ B" f& R- i0 v' l5 \6 N' |: }" E
程序代码: 7 u/ Y5 i. Q, k- E- ~
( Z# g- o/ t  x1 A  d
namespace fy_Exp{+ Q* d$ N1 D$ ~3 A
namespace {template <class _T>
% _0 \- Z) b: w2 Jinline _T GetExpValue(_T t[], char& csym){0 ~8 ?$ t& |2 W( s, d. C  }7 \
    char c=csym; csym=0;5 W& n5 Z5 g& g0 E
    switch(c){
- f$ t3 x8 u4 M2 r) A7 v4 S    case '+':return t[0] += t[1];+ i% c4 V. S/ S  z5 A" c6 _
    case '-':return t[0] -= t[1];+ X, u8 G, R4 j! T! ?7 M
    case '*':return t[0] *= t[1];
. p( e' ^: j) r, I    default: return t[0] /= t[1];//case '/':8 h* e) H# {5 g- T: [( D5 x% s: k
    }0 L8 q# O7 O% z: v( B' N; i
}}
( `' {( P& \* b% R0 P  b* v/ Rtemplate <class _T, class _Tstream>
1 _; q/ T$ k- G. h- d/* _Tstream: inputstream, _T: get return value8 {! S3 G" c5 \" a5 B7 `
* Return nonzero if get value successfully */8 R. G) Z1 K) j/ g& D! Z
int GetExpValue(_Tstream& istrin, _T& nReturn){
4 z2 Y) g- g. |    _T t[3] = {0}; //雨中飞燕之作
5 Z4 u8 b4 \- N/ Q! [; r    char csym[3] = "++";9 |0 m+ y+ L9 b: E3 i
    int nLevel = 1, nERR = 0;$ L# G5 E9 U9 f% \
    if(!(istrin>>t[1]))istrin.clear();$ N9 U0 }6 \( L. L/ Q* [
    for(;;){' N! X* Z8 V5 _5 E0 q
        if(istrin>>csym[2]){5 B! d5 g' P7 U' ]/ l/ `
            switch(csym[2]){
' U' G" X$ y8 ^1 X1 k& x$ C* M            case '(':
7 c4 ]" q# K; C7 E( K                if(!csym[1]){nLevel=0x100; nERR=1;}else+ n; \7 r8 M9 A0 g  M
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;+ I* a3 r4 u1 n6 ~+ H
                else{nLevel=0x100; nERR=1;}4 Z5 [6 ^8 V3 @) z
                break;$ X* A& |/ U% D+ X7 E
            case ')':
. k' D- R" S( s" r8 r" L- \* l: L                {nLevel = 0x100;}break;, K$ {9 n4 ~8 x1 U; I7 F% y0 B
            case '+':case '-':case '*':case '/':
6 z, W& W4 k: e                {csym[nLevel++] = csym[2];}break;
9 W/ q- W' L2 e            case ' ':case '\r':case '\n':case '\t':continue;% V# j! C& ?* z; h+ }9 ^6 X
            default:
4 E/ g, t" G7 b( G: |' [8 R0 R                {nLevel=0x100; nERR=1;}
2 `2 a% B+ h# S5 Z6 O$ r! ]            }* c% Z; w  P9 l
            if(nLevel==0x100)break;
. X0 ^8 |) ^- y' u            if(nLevel&0x10 || istrin>>t[2]){
! I. I2 {( Z! ?, M- }                nLevel &= 0xF;4 h0 u6 h8 ^) t! Z3 C* R  p
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}' y2 W# P1 i. W
                if(csym[1]=='*'||csym[1]=='/'){
. |5 ]9 `% ~" c/ _6 d' D                    GetExpValue(t+1, csym[1]);
' |  m# j" i+ V, |  s                }! ?5 o' u' {6 R1 z9 z1 |% b
                else{' h( z4 O' V0 K$ n8 C
                    GetExpValue(t, csym[0]);
: h$ d( }" S8 R3 k! K                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;' g+ @8 E- j$ j& v
                }
, N3 T7 `- b( d0 {  K' ~' K  H% @                nLevel = 1;2 @3 R$ K4 x4 i: t3 K6 U
            }
8 ~. I9 B9 J% [. L" R9 h6 }; R: K            else istrin.clear();  ~! J; b7 @8 r, R( u( `2 h
        }/ g1 p: C! z9 g$ p1 t8 x4 ^$ h
        else{nERR = -1; break;}
) \6 |5 `* N4 t1 q. E8 E    }
" [# O. V6 h. @1 o- z    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 _# R- ]8 T$ k( K0 Z    else nReturn=GetExpValue(t, csym[0]);
0 i! f: F0 `" v) G    return nERR==-1?1:0;# R6 w  k: }$ U6 H. e0 U
}}
4 ]$ x8 o# D) h1 n
4 m6 Q. d$ Z7 u- ]0 @. O% A- O% B9 k0 |& x+ X- ?

; ^3 A4 {) U: q/ W6 A! J. w2 y函数模板使用示例:* s+ n3 I" Q1 I7 W0 p' ]
在以上那段代码的后面加上以下代码:
, `4 d3 I" ?, B6 u' c% |/ p5 I/ ?

( w* J6 N) Q. I
2 Q- T* ~2 D4 f程序代码:
$ k4 M& b4 a, D: x+ n6 M* H: m: X6 ?4 N' S" I/ O1 j9 t6 ^
#include<strstream>/ ]& s/ J) e0 S  x+ W3 M
#include<iostream>. P0 [; d, w: R: ]2 A
#include<string>
5 F7 T4 |3 X. \0 ^0 I; k: f. Y) rusing namespace std;- O  ?% h$ ]0 G1 P4 s+ a
int main(void)
2 @2 N  h' x6 w9 }4 D& @% @( a% @/ }{
9 O" N2 |  R) L0 v    string s1;
6 B$ z# d; k- k6 Z% ?( A/ u    while(cin>>s1)2 F0 x7 n  @0 }. F7 p
    {
) E' A0 b) y( X/ D: ?        istrstream isin(s1.data());
! p) W' p+ P. z        double d;, ]' P" \6 u0 z( O3 h; A4 J  g
        if(fy_Exp::GetExpValue(isin, d))0 T% L- p8 R+ o' s+ T  Q
        {, b, e9 |  O+ y  o+ e
            cout<<d<<endl;, B& R* b/ L8 Q  |0 J
        }8 F+ }& j2 ~- C5 [8 n6 Y
        else. @( D% S4 A& E& k; n5 H* s
        {
7 G5 L6 _- ~( q% h  s6 }            cout<<"ERROR"<<endl;
- C  ^, k1 Z, ^0 U* P        }+ l! D! k2 K  g- _" D9 o
    }; D  _/ p# o" C' `1 g6 {
    return 0;
; L% Z% N2 i4 D; Q5 c}: S9 d9 c4 l3 K; b
8 F) O0 ^) Q7 A  v- b/ f0 O  x  B
  n" n  K* d, a0 Q% M) m2 Y. v/ v
然后编译执行就可以了(*^_^*)
1 J! b8 q1 d) K0 d其它:TC++上一定编译错误,不保证在VC6上也能通过编译+ I% e$ L6 Q  t+ m9 f# [- l& I) N) k
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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