返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,$ A  @0 f! S# Q2 D8 K6 b
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
" z, ^  z7 w- l+ o6 X  Q只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)3 p/ o: r% ]$ W5 r" E
参数解释:7 J) F6 L. N! ?6 K  O* C; F6 o
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
# e$ p0 D! ?. K: W: S/ EnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定) _3 Y. Q( `  J+ H8 U1 Q: ~
返回值:# I1 X, [7 a, k) g5 V+ z: r
返回非0表示计算成功,0表示计算失败有错误
3 c3 ?5 a) I( N
5 L( J" G  `) Q% c- s) X7 Q
/ t' ~( t" w' F) [$ M2 {/ S/ a( J: L0 f) X! o* ^, {9 ?3 {; B  }9 ?
程序代码: 6 _/ _( W3 L* ]7 Y/ ?! r6 d2 {3 {

, T: O0 Y' @( P1 x  ]# [namespace fy_Exp{7 B! q$ r# A' K& T( I
namespace {template <class _T>$ c# a* }8 q7 ]' G
inline _T GetExpValue(_T t[], char& csym){
+ q( F, H/ C+ M    char c=csym; csym=0;
! W2 p% Z! ~: }7 Y    switch(c){
& d6 S6 |4 `0 u9 j    case '+':return t[0] += t[1];
/ z! V7 V, f. F0 w+ R! D* y7 A    case '-':return t[0] -= t[1];
( ]) r( o7 T) O4 D& p1 Y& s. _5 T    case '*':return t[0] *= t[1];* R0 T: k2 `% c# C' n
    default: return t[0] /= t[1];//case '/':
! y4 D! h& @  u. S    }- b" r1 a5 B/ W" E
}}
$ R: E  [! l1 T5 N4 E1 Q& ntemplate <class _T, class _Tstream>* {- L8 Q0 x# \# c  s9 I& h
/* _Tstream: inputstream, _T: get return value" `9 T1 {& U1 L  L- M' w
* Return nonzero if get value successfully */8 i$ P8 `& K' }4 f5 f5 ?* m3 \# |
int GetExpValue(_Tstream& istrin, _T& nReturn){
; }0 g& \: ]) }% O3 C/ i- [    _T t[3] = {0}; //雨中飞燕之作
7 i4 y8 e( T4 g    char csym[3] = "++";2 C9 v1 {- z' }4 p2 j% X1 z
    int nLevel = 1, nERR = 0;
& ]8 U% T  i! k    if(!(istrin>>t[1]))istrin.clear();5 G8 E* ?- O- w% @
    for(;;){
& j: C' }4 M; U3 b: {        if(istrin>>csym[2]){
) ~- c6 d3 s; L1 @            switch(csym[2]){6 v. @* G9 m2 N! w% K9 H
            case '(':2 v1 L4 C2 _  E1 Q& N; D, k
                if(!csym[1]){nLevel=0x100; nERR=1;}else5 ~) L3 `  P  ^2 r* j5 \0 ]
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- o7 l: O! d9 }* p- X; k
                else{nLevel=0x100; nERR=1;}
+ \! p& o9 a0 y2 A: |5 ]                break;
% }6 t/ M& l+ q/ Q2 Y8 m            case ')':
5 Y+ S* O/ b0 z+ o                {nLevel = 0x100;}break;
. \3 C3 D% E3 P, r( U1 C            case '+':case '-':case '*':case '/':# g; O- E6 C& y/ B4 x; T* R8 Q% Z" ^
                {csym[nLevel++] = csym[2];}break;- f! U( x- t$ A, S
            case ' ':case '\r':case '\n':case '\t':continue;
! S- h* j; G; g& t+ {            default:
+ U* P2 K+ p! [; D$ U                {nLevel=0x100; nERR=1;}
0 b. G7 t( h6 o$ M1 q            }4 d; j9 O0 I& ^0 x  A9 L
            if(nLevel==0x100)break;: Q6 W+ d. F3 _' C( {6 J
            if(nLevel&0x10 || istrin>>t[2]){
1 M% _; _4 F8 x' e- x2 Z. u                nLevel &= 0xF;  O3 h/ Y% o; d& b) e
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. m. u) `' N) U$ I, h& a                if(csym[1]=='*'||csym[1]=='/'){
# {$ P. B: R( ?3 a0 N                    GetExpValue(t+1, csym[1]);
9 o# e1 _# A+ @3 p, |                }) C( O* W( f- F
                else{% N; j; X' A9 b6 x* x4 G
                    GetExpValue(t, csym[0]);5 z+ t) j) E5 N! C5 U6 L
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;! \6 k' Z- @- u; f& j, D. r
                }
* t- e! ?7 o; Y7 H. R2 C                nLevel = 1;+ m: ?# t6 U; J& \7 ]. w
            }$ P& l: N& H& ~  N
            else istrin.clear();
: a6 q; D3 E3 o2 o/ I        }
/ x$ z0 I5 [. N1 e        else{nERR = -1; break;}, `# `- q! t: X) T# x6 }$ d
    }
$ |0 s3 i& S6 p) E. I) ]: X    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
# U" P1 z  M3 o! s7 i! x2 `    else nReturn=GetExpValue(t, csym[0]);* B) Q# V0 Y: C
    return nERR==-1?1:0;. w/ ~, R# }% e, J3 f
}}
5 F3 W- o" S& W! N6 p3 Y5 Y* C1 O/ [" Y0 Q, W0 h6 R9 e3 O
# U5 c# i: `) u( h- z3 G

0 V/ p, F5 P, ^函数模板使用示例:
, }! A  a' F7 M: _, |4 T. P在以上那段代码的后面加上以下代码:
4 m( s. |' @( ~  U0 J$ ?4 A3 M
1 ]5 H" x7 @+ U: {% [# x" x+ G6 F , a9 ?9 E- d8 V7 c# e

* j5 B0 _6 a' C6 H5 M* \2 T2 X5 t1 S程序代码:
- I  t/ Z: b: K" N7 d% o. r4 \% N" b% o5 F7 \  ^
#include<strstream>
5 U; i8 o# \# O: I2 W; M7 R#include<iostream>
8 K3 e: A+ G6 A: P, A2 y#include<string>8 ]3 f+ H9 j% }: G9 x1 b  Q
using namespace std;
8 c) o4 F% t; l, J' p! ^. K: bint main(void)0 a0 q9 ]* L6 v! j) n
{+ z/ p" ^0 u. O! c/ v- E
    string s1;
! _# M9 C" g: U$ c- t7 s    while(cin>>s1)
# G/ a, Y  O+ v3 z    {2 a1 C+ v5 {! W# z! ?
        istrstream isin(s1.data());
% |1 w, f1 f& d( L6 \        double d;5 O6 w! H" z, k: c/ `
        if(fy_Exp::GetExpValue(isin, d))' l7 l! w6 k* v+ V% v" i' Q' C6 M
        {( i2 [, ?% ?1 \2 o+ W! ~' I
            cout<<d<<endl;. t* h: [8 z& Q3 c; Y; q
        }
+ G, a" i) T% @: [" |9 h        else
7 c; ^7 ?1 Y& ^- o6 h5 H8 p        {
6 p/ B9 N4 t1 q8 o. H# G            cout<<"ERROR"<<endl;
& t1 ^# x& F" ]" |( |        }
! U( h: w( \! F" p* V; F    }% U5 h: V% E* s% b$ |$ L8 g/ a# ^
    return 0;
4 Z3 t: H$ i2 d}
* i7 q; M3 V, |3 ~- l7 t! u3 T1 f4 `# |$ }  w. n5 P
7 A( e2 p! h8 u1 ?# e, V1 g/ \# r" V
然后编译执行就可以了(*^_^*)
% d) P9 ?6 c# X) D: Q其它:TC++上一定编译错误,不保证在VC6上也能通过编译
/ a/ t; z* `3 Y& z9 B      建议使用VC7或VC更高版本,或者使用GNU C++编译

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