返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,9 s4 |' R5 x3 ?2 O2 _' `3 P
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
) c0 E: |/ G$ T. |只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)) x5 p/ _8 J* [0 E! _5 m
参数解释:8 E+ v: D8 M4 f8 u/ w
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 Y) z! Q3 ^7 ]% F& J( \  enReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
) A" n1 ]: K: r/ q返回值:+ n0 \" k1 H8 N" j8 l
返回非0表示计算成功,0表示计算失败有错误. i  f+ ]: f) ~! y

0 k' I" B( f7 G9 ^+ ~3 k
/ o1 M4 A! |6 `
7 S1 t" @' h9 w, A8 c程序代码: 1 ], P1 E2 r8 b4 S

2 ~1 V5 G6 H# A/ N0 A5 |" A& Qnamespace fy_Exp{
3 l; ]* ~0 e9 `9 ?: xnamespace {template <class _T>
& A) x* w( C) M+ X- i& Dinline _T GetExpValue(_T t[], char& csym){
3 j/ q  h7 S0 n    char c=csym; csym=0;% P$ n5 H1 I$ s3 w1 `! {" R
    switch(c){
0 H$ [: f7 s  N. z6 ]9 b& B    case '+':return t[0] += t[1];2 y* I- z* r. ^7 T, Q
    case '-':return t[0] -= t[1];
! g; z3 m/ n) t9 K/ k    case '*':return t[0] *= t[1];
& n3 u# z% S/ e- i! Z% B5 U8 r1 x    default: return t[0] /= t[1];//case '/':
# e0 Y% h- [5 [0 K) B. g    }
0 x" a, b' j) h0 Q}}
3 ^* [6 g8 T- N% X2 x( ^3 k- etemplate <class _T, class _Tstream>* a" R5 I' U" I5 M7 T& _% v" j
/* _Tstream: inputstream, _T: get return value* E9 `5 |5 b/ r5 m7 l
* Return nonzero if get value successfully */
8 P' M% W3 E" i& t( [; s7 Yint GetExpValue(_Tstream& istrin, _T& nReturn){
" M  U0 y  Z8 R0 J2 b" C    _T t[3] = {0}; //雨中飞燕之作
" C, n" q. \4 Q9 Y6 ]! Y    char csym[3] = "++";- j8 P! {6 y+ u, E
    int nLevel = 1, nERR = 0;! o1 x# I, J0 J( E( I/ O; u
    if(!(istrin>>t[1]))istrin.clear();) e. S; H2 |' k% U& A
    for(;;){
, Z! F9 a) s+ F1 M- s        if(istrin>>csym[2]){
( @" H' x+ @6 a4 A1 v# u6 m  U            switch(csym[2]){
# c3 u: m. b2 ^) d" m; R3 R6 b            case '(':$ a% p9 X6 u7 Z* }% w
                if(!csym[1]){nLevel=0x100; nERR=1;}else
3 G% W( c- w* f; \# e% c                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;. j1 L+ ]4 T) p  L$ y
                else{nLevel=0x100; nERR=1;}( {& x) s6 e. ~* Y% a" r
                break;
1 j9 ~' m5 Z4 H: x1 ]' L            case ')':! ?0 X, ~! Y6 z
                {nLevel = 0x100;}break;
+ _  o$ E) }0 t, U0 o) T            case '+':case '-':case '*':case '/':- g: J7 v( X. [0 Z$ P( p7 J2 W
                {csym[nLevel++] = csym[2];}break;4 v- R$ P% h' t, j
            case ' ':case '\r':case '\n':case '\t':continue;
/ X" u0 ]8 o5 w6 c2 q% k* ~            default:
% @$ G0 b* m7 }7 K                {nLevel=0x100; nERR=1;}
+ h( ^0 w+ l7 E# d            }
  A; B2 l% B$ w9 g' B            if(nLevel==0x100)break;0 M1 F, ^; j9 k* D) ]- a" J6 D
            if(nLevel&0x10 || istrin>>t[2]){* @0 \' U* G% Q, E8 F* J/ r
                nLevel &= 0xF;
# p5 ^4 Q$ N( L0 ?                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}) p, V; K, g) g
                if(csym[1]=='*'||csym[1]=='/'){
9 P; ^% S7 W) U4 I                    GetExpValue(t+1, csym[1]);0 z4 Y8 O- _) W$ u# U' ^! _
                }' K5 ^" |! Z5 W( C! X) v0 T4 \
                else{4 H' o0 u9 L9 ~& R. o
                    GetExpValue(t, csym[0]);. I% M* \, d' o7 J
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
* g! Y8 [% H' Y6 W( T                }
1 w2 @* G+ l0 A" Z. w                nLevel = 1;. o# C! s6 r$ Y1 z5 z9 G. o4 [
            }! b& v# h! V1 ^( U
            else istrin.clear();, j2 v  Y8 W$ @# W
        }
& x) C+ R3 h# v        else{nERR = -1; break;}
7 J/ ~! `0 ?6 G- K1 b9 u( q    }* i. n9 s( {1 U3 N
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" V' ]1 c9 Z: _5 n2 y7 T4 O1 D    else nReturn=GetExpValue(t, csym[0]);) @8 ]5 |9 A/ @) s& u
    return nERR==-1?1:0;8 y1 w2 [/ }1 m  k; }
}}3 W3 n0 ^+ L0 y: |2 x8 S9 ^

  U9 O6 A. e2 v- V- O5 t8 {8 e+ D( A1 _/ y7 C3 J
& Y+ Y! F3 j% a' y3 }% n: l4 \
函数模板使用示例:9 q' T( K* i. J5 o# M9 _9 g9 G
在以上那段代码的后面加上以下代码:% `6 M- ^$ U. J( S9 I( y

1 a) g( R% d1 v' b7 ` . O: R1 T( s6 d
7 [* w; l+ ]4 {& b- E" g2 i
程序代码: " M3 x8 m# n8 H: ^& E- p0 q
. H8 s, o' _. j3 \' S
#include<strstream># |3 V% l8 h% h, P
#include<iostream>1 M( Y! \. d& c9 B' L( j
#include<string>2 u" v) @* i7 O+ `3 F
using namespace std;8 H. w$ u5 u9 i$ M
int main(void)8 H& O* L# I0 ^1 d
{. s* }, Y! Q9 u
    string s1;  r! M9 [& d7 V* m
    while(cin>>s1)0 x8 |0 @& T$ d# |) C% Y
    {5 w. X. J$ y. x7 m/ G
        istrstream isin(s1.data());! M" S+ C3 m/ ~- b. k, u
        double d;
# a7 n7 y) U+ z        if(fy_Exp::GetExpValue(isin, d))
' k0 B2 O4 m# n        {; q# n5 |$ r2 z. D  J4 E
            cout<<d<<endl;
+ y+ |! z! F# K6 M" B; l, O$ n        }
) @- f- G, {9 V& [9 v3 ^% }        else4 G8 Q. l* X( c- b9 N% j
        {
7 o4 P6 V( F1 ^            cout<<"ERROR"<<endl;( T+ A% Z# v: M3 c% ]8 Q" a
        }8 b) K* ^  s! e  a& i" M$ x7 E( y
    }9 c2 d0 h- r( q9 @3 j
    return 0;
8 y/ T( Y& r! ^}4 i. s& ?; X% M/ M% i+ g' x

# L* C9 ~0 n3 N& @' _& f  Z1 u
+ H  r& F' E4 E然后编译执行就可以了(*^_^*)! W4 N! {$ U: J; c" M% ?
其它:TC++上一定编译错误,不保证在VC6上也能通过编译& O( w4 ]  S3 @& R$ N/ {* o2 d
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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