返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
9 ?5 \# v# Z+ l- X9 T) I! W3 q5 e一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
9 l* p2 h) S" P5 M9 k只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
' J4 @, R; W. M9 D' x' M参数解释:0 z  Z  a$ `$ u8 |( v( z
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流6 p( N/ S' ~6 X5 E/ ?
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
+ [, _- P( N) A返回值:
, t6 `0 V) a# ?& ]' a返回非0表示计算成功,0表示计算失败有错误
7 B. s. X1 B6 S* \! }2 [  U: `! O
3 S4 p$ o, w2 L, s6 O6 p) ~6 @- F
( |) W" P2 [/ |, n6 N2 _" a$ y8 h$ z# L3 e1 w( V
程序代码:
( o5 z3 c3 a2 P4 E- c( I  k% V# q2 E$ \# q- P% x4 W, T- G7 {
namespace fy_Exp{! [. d! k# W+ S8 K+ w6 S9 N7 A5 i
namespace {template <class _T>
( b& O) M# T6 ^9 n$ O$ Dinline _T GetExpValue(_T t[], char& csym){
& l, @+ d! x) u# S! H* o    char c=csym; csym=0;
# H' V/ q" W8 V* g1 i    switch(c){/ v! S, H: t: @$ u3 b
    case '+':return t[0] += t[1];
0 `) [% ^$ ?% F; }- {    case '-':return t[0] -= t[1];0 Z4 T5 q& B( j* d, x1 L7 R
    case '*':return t[0] *= t[1];1 x! C3 F6 t, I' T
    default: return t[0] /= t[1];//case '/':
7 I1 N6 L; Q9 T    }
: ~1 C; m& h0 k3 @  z+ S; o) V4 \4 K}}
5 d: n2 i- p  U9 [' d0 T" btemplate <class _T, class _Tstream>
6 G  D) P9 I7 C" W/* _Tstream: inputstream, _T: get return value
# \8 L5 P) w) e( M$ s* k" Z* Return nonzero if get value successfully */7 p( t: k  }  n  _0 a
int GetExpValue(_Tstream& istrin, _T& nReturn){0 m8 A* g7 ^4 g& b: H# N, M' g7 H# f
    _T t[3] = {0}; //雨中飞燕之作
3 h0 C. B4 \% N0 Y6 c; K# {    char csym[3] = "++";
& c5 Y* z/ z6 L% l) r! A7 t    int nLevel = 1, nERR = 0;3 B) U; Y- n! l5 Y* t
    if(!(istrin>>t[1]))istrin.clear();
5 o: p. T7 V: n; N+ O  i    for(;;){' g) {% |0 f' ?- j- D" d7 V
        if(istrin>>csym[2]){3 x% D; q1 Z  }7 U4 C  [7 a  y
            switch(csym[2]){
4 ?" O# r/ S6 d( F. \% h            case '(':
4 w3 D, I; y) v0 d                if(!csym[1]){nLevel=0x100; nERR=1;}else
4 k7 x9 D& e. X, F  ~, z6 Z# A  n% A& P                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
$ S$ c6 \/ d* ^% G/ [                else{nLevel=0x100; nERR=1;}
0 |* c. t! @0 ?0 i  X                break;
2 g- k( U. v7 _( ?/ G. r            case ')':
; A9 Z- S, f5 ]- k                {nLevel = 0x100;}break;
0 Z; h1 _1 D4 T/ w/ B' K            case '+':case '-':case '*':case '/':' u2 w8 U8 h* f" Y- c
                {csym[nLevel++] = csym[2];}break;
5 O8 w6 W+ c. z' n  M( v2 D5 v            case ' ':case '\r':case '\n':case '\t':continue;
8 n5 w9 _- S% h5 Y( U$ B            default:
9 |8 ]6 d5 h, H6 n) n# k8 X                {nLevel=0x100; nERR=1;}
. U  Y7 h6 m2 Z& ]$ K            }" |& Z9 }  @: f/ a- x6 X) K5 L" @
            if(nLevel==0x100)break;7 i2 w8 [# |# C6 k- V# f
            if(nLevel&0x10 || istrin>>t[2]){3 e: u& Y$ i4 J: W$ n: k( I
                nLevel &= 0xF;+ g. M5 y: d! N: a- k3 g
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
: E  y( ]% l' v7 \) I: C                if(csym[1]=='*'||csym[1]=='/'){- R  c- s8 ]3 W$ s$ J/ C
                    GetExpValue(t+1, csym[1]);
# [. n" V  m6 `) T! |/ X  h                }& z+ X$ i+ Z0 `. N5 b1 w  m
                else{' |3 o; v$ r$ J: i+ u  W' K% K
                    GetExpValue(t, csym[0]);
1 X2 U& a5 v4 `8 t, m) |0 x0 t                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;/ v9 I" }* {! E4 Q' _+ r6 F, j2 V
                }: {2 q8 T0 q& h
                nLevel = 1;( A. L' z6 ?6 \1 ?* R0 e3 }
            }3 Z7 a: V7 S( }; v9 {7 k
            else istrin.clear();
4 C  j3 E5 t3 p, o  \7 M' J        }
; b: I, i4 k5 G        else{nERR = -1; break;}
6 t3 U! a2 w% ?- l- h/ l: N    }/ Z0 l! O. \& [
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);+ m: G' u) Z" y1 y' O1 p4 ^
    else nReturn=GetExpValue(t, csym[0]);  p! |, |, E7 Y/ W) r6 I  n% {* p0 ]
    return nERR==-1?1:0;
& j) W- ]+ ^6 h# f}}
' O4 J% ^# h: s3 R2 {# ?# U& R6 e; r3 y1 |
  z0 o1 t* t" M7 L* \* h: @5 F: S1 {; X% [: g1 F

5 O1 l" r: r9 s$ c7 @函数模板使用示例:
( r' b3 H& ]2 W7 ], P" @; ]在以上那段代码的后面加上以下代码:, k2 Y3 c; T  X- r& h

0 m  [( L8 U- H% P- K3 ^  @; W  Q & }& s; Z9 ~) r5 u+ s2 d! Y2 `

6 K- X0 D# i: X/ G( X1 z- }程序代码:
' `, @- F1 k- f" \' w; x0 f2 A1 l; l: n
#include<strstream>1 y, ]7 r3 H& j9 l
#include<iostream>( _7 Q! o3 @( R1 O) C  A
#include<string>
: I3 A, ~/ `, L! z/ \( dusing namespace std;& T* U; ~2 T( A
int main(void)
: B- M3 z( L  e2 S{
$ ?# W4 s7 n7 A) ]$ ?' G& e! [3 r    string s1;4 @5 F/ f: w/ |$ I5 N' l
    while(cin>>s1)
9 ?5 n  Q- G9 @8 M; k    {* ^( o& Y  m! w- Y$ t- ], h8 Z7 z
        istrstream isin(s1.data());+ l2 S% D( b. Z# [0 o
        double d;
' c1 |# C9 Y) @9 i# @        if(fy_Exp::GetExpValue(isin, d))4 ]; H7 A4 `% u
        {
2 z3 ^  ?8 B( h( ?% A            cout<<d<<endl;
" ~) M6 J' t- M        }5 Y  s2 S' _6 U2 c+ s
        else$ u% @( A+ r: A
        {: t8 n0 k% ?3 ~; {6 b& P
            cout<<"ERROR"<<endl;
- |3 W! s) ?: y$ B. ~8 X        }$ V/ [' i9 B8 t, E
    }
. ^# [1 c- \* J, [7 l% Y  U    return 0;
! f. j( m' A, E5 U5 I9 i0 V}. \( u8 h3 N" x3 c

; E# O2 K; ?) N9 ~: q( ]' T
" |3 y# i3 q* M/ l4 u) \然后编译执行就可以了(*^_^*)
4 g% v+ q" Y2 ?! Z6 t其它:TC++上一定编译错误,不保证在VC6上也能通过编译
3 H' d( o# Q+ b6 Z      建议使用VC7或VC更高版本,或者使用GNU C++编译

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