获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,1 O) B& o! Y, d' c: T% S
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
5 A  `! _6 u. y8 u# M: B- ^' b只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)3 e. G5 i( z; A- B3 Y4 _
参数解释:7 f. ]( [0 U( H) `5 {! d9 |* s
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流+ J: y2 m( v8 O0 ]+ a; M
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 F3 k6 D" y# Z. I
返回值:3 S) B4 }2 C+ b
返回非0表示计算成功,0表示计算失败有错误# ~& k% [3 t2 R/ o+ \. j
% I' o3 F( W7 X* \7 |- P

' B6 }3 h- P- ?- S9 p6 W8 k7 N. ?, E8 x+ c# S# P9 f/ N
程序代码:   b( R1 g0 |' }2 k, n! Q/ |
' P, E: J5 @1 J& z
namespace fy_Exp{* q) I7 c% ~8 D' _
namespace {template <class _T>
5 U! B: h5 A% winline _T GetExpValue(_T t[], char& csym){
$ p, |2 Z4 `6 q! _) X. k    char c=csym; csym=0;) E+ L9 L% H7 p' q
    switch(c){- K9 s* c4 @( W3 A
    case '+':return t[0] += t[1];* j7 `1 G. H. _* _. e
    case '-':return t[0] -= t[1];/ P; L8 L7 L$ ^0 b6 A6 `
    case '*':return t[0] *= t[1];
# d/ u; j4 }  Q# e- ?# d' A    default: return t[0] /= t[1];//case '/':
1 Z0 l# C2 _" x- J    }
7 u3 T9 Q7 w/ x& d/ Q/ ]}}
3 R, q( y4 }6 n2 u" u# l6 o* ttemplate <class _T, class _Tstream>
; `  s! s7 Z" U5 _8 X& J+ z/* _Tstream: inputstream, _T: get return value
1 ?5 u$ J( V6 d/ C6 P  Y* Return nonzero if get value successfully */
& G4 u" q# |: P/ p7 m  pint GetExpValue(_Tstream& istrin, _T& nReturn){9 V/ P+ x0 M3 v9 ?
    _T t[3] = {0}; //雨中飞燕之作
. q1 w  v3 O( y' K$ p0 @    char csym[3] = "++";
6 e" @; z9 U& ?" c  d. t' x    int nLevel = 1, nERR = 0;
) E6 b* _3 }3 h) A9 x- ?2 ^7 f5 `" a    if(!(istrin>>t[1]))istrin.clear();
1 U6 `5 Z7 r/ L    for(;;){
7 \3 t' n. r( z( ^* B4 Y: w        if(istrin>>csym[2]){, q1 c  d/ c+ w5 o# V
            switch(csym[2]){
+ |) s8 s! I& ~* j            case '(':
1 r  e: N& ~$ x7 Q3 X                if(!csym[1]){nLevel=0x100; nERR=1;}else9 L- m" h; r3 a% ~: U  j# r5 D
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
8 Q$ z+ M- r5 |$ e2 A' J# S. U                else{nLevel=0x100; nERR=1;}
* }( |- O& A3 B- \2 z                break;+ s+ c9 _$ e- z; z: m0 y. w; Z
            case ')':
4 k2 y! d% a( ?2 U+ I) ^$ H                {nLevel = 0x100;}break;
" G; d- F0 R5 k# p            case '+':case '-':case '*':case '/':
( f' S& B! [1 }- K1 E+ q; B                {csym[nLevel++] = csym[2];}break;
, r; I! {/ C: \8 B' @4 J            case ' ':case '\r':case '\n':case '\t':continue;5 p3 t+ Q2 u3 z! q1 K- v
            default:' k  b  L4 V, U
                {nLevel=0x100; nERR=1;}: J8 T; j8 R) H3 Q
            }
* Q& O2 b( }0 D& e, J8 x4 ~            if(nLevel==0x100)break;* I! [+ j! A% L2 r( p  \" ]
            if(nLevel&0x10 || istrin>>t[2]){! k6 h$ c+ t: H; h: w2 o' |2 b
                nLevel &= 0xF;" X9 A( l0 U: E+ c! ?# T  r
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! B' v( A; r( F2 K# f
                if(csym[1]=='*'||csym[1]=='/'){
; e* E% ]( [2 `. n7 U                    GetExpValue(t+1, csym[1]);( N' [  y$ T1 s5 L* s, ?7 W; i
                }  b) {% P2 f- z1 H# j9 E4 f* ^" O' h
                else{- E" l$ l6 A) \, Y: e- n) x
                    GetExpValue(t, csym[0]);/ l9 y5 u- ?2 A4 n' H; t$ j9 Z. [
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
* Y5 m3 q: U# |+ {1 f9 N6 b                }$ ~8 ?6 q' h# p$ e1 y
                nLevel = 1;
, |. \7 m: v" S) E8 d            }" p1 m6 J( E. z: Z! w1 u
            else istrin.clear();
! `" Q2 S* p" E3 @* H% C        }# K6 p3 K  z- X/ w* n% H
        else{nERR = -1; break;}
) ~! Y; s  [) ^% U# E5 T" R# N) A    }
5 f: @; P$ d$ _5 T3 {' c    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);! Y0 H$ _$ E% J- d' m* S1 g
    else nReturn=GetExpValue(t, csym[0]);  d. \" ~4 J  s, x, e( t
    return nERR==-1?1:0;. s3 l* o2 B3 Q6 c! ~5 ]- ^
}}
' m. J! ^3 l. h$ L7 S5 r
5 K0 A) |8 z6 w$ j8 d9 ^9 w
4 M& g1 z# W8 V" A
* V! \1 I4 ^( ^' O/ Q  [函数模板使用示例:$ v! B$ R  I) z; ~# S8 W
在以上那段代码的后面加上以下代码:' d  R( N5 S5 R

# I* E7 q- A- z& h+ V& h' b$ n+ \6 p . C9 o) Q& G7 v1 p* P3 [# g

) p. \( T7 g$ G  ]! ]# J; P程序代码:
) Q* I0 {8 p  \- ~+ z* e
: h# I. l2 O& d$ I$ T#include<strstream>
5 e% N5 U1 W3 }+ K0 J#include<iostream>
) [- F( _) T# J#include<string>
5 [, O& h# a0 ~; _using namespace std;" b6 e& z2 r+ N5 q" {; ]" ^
int main(void)
2 d; z3 \; ^8 `& b) }$ s+ M7 t{
6 M0 e8 ^" d' B/ ?. T& o    string s1;
* ]3 q# M( _; p' E8 v. p    while(cin>>s1)
  g3 F, e$ z1 b! u    {( k0 b4 ~; r: Z/ m: {# `4 Q; j. U
        istrstream isin(s1.data());
3 x" J  `% \$ k+ I9 K        double d;( h" |) O5 }: ^0 o- A) J6 K6 Q
        if(fy_Exp::GetExpValue(isin, d))$ H8 U% g. G1 R- j( n" \! i/ Z" p
        {
5 Y0 g" t" L4 ~  w6 v6 B            cout<<d<<endl;
) w% E  q1 `$ {& g        }! _8 S# H' ]! F  X# h
        else
8 |7 d% z% l* R: h+ B) v$ q$ y        {
% i5 Z# T' @9 o            cout<<"ERROR"<<endl;2 m( M2 |1 e' \5 E8 R8 C: K
        }  k& o7 z% a8 u3 g( u0 a( ]
    }$ O+ D  B# w' f+ ?& H
    return 0;( a- y8 h; ^$ F  y
}
4 h' x% ~8 r+ Z; F( h
3 G' H) k- @7 F) a2 g
: {4 o8 E& z; t然后编译执行就可以了(*^_^*)2 u8 J4 n# c1 L- U) h2 W
其它:TC++上一定编译错误,不保证在VC6上也能通过编译3 h; h! Z) H+ B4 j6 l. d
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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