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

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

在9月8日那天我特意编写的,给大家分享的,
' ?" }8 p4 B0 n6 o3 u- O6 E1 |5 g一个很方便的函数模板,可以并且只可以计算含括号的四则表达式) Y( z+ m& b2 Y' m+ d# E/ B/ M
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
/ {) c+ S, P# J$ A$ E! i参数解释:) `; b& U: s2 Y! G
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流0 `/ ~- Y0 ^) m% K; Z
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定7 o3 \0 N( C$ v' }& H$ E
返回值:1 n- v, T. T8 _$ ^
返回非0表示计算成功,0表示计算失败有错误
0 @- ^- X* i( g! J9 ?+ ~$ i: D9 W, S4 J' k& F! I5 R
4 I; @; m8 ?' ^1 F4 R: m
. Q/ W- Y0 ]( r4 B2 A
程序代码:
) ^, e6 F' j$ _
$ s. x; b1 [- @, O# jnamespace fy_Exp{* T5 E) I/ y% ~3 @; v  a
namespace {template <class _T>
, Y5 z2 ~# f/ ?9 e6 D2 Einline _T GetExpValue(_T t[], char& csym){+ }' g+ V. a; Z* m( }
    char c=csym; csym=0;6 [& Q$ ~3 E$ u
    switch(c){
4 s* `2 Z; z! x# |: s    case '+':return t[0] += t[1];5 K% ^' R& @. T3 s
    case '-':return t[0] -= t[1];
+ D) e4 Q8 N) y8 y+ i: d    case '*':return t[0] *= t[1];
! Y0 P7 m+ |+ [5 E! O" Z2 G! p    default: return t[0] /= t[1];//case '/':
& o4 q& C9 D" G    }
6 T: A& p% h4 ^5 }. Q}}" v/ u/ s. A0 Z: K# q: G, _
template <class _T, class _Tstream>
, {$ S' J; K; [! K/* _Tstream: inputstream, _T: get return value
+ P4 {2 |$ A' g2 a* Return nonzero if get value successfully */5 E+ t  t9 w: A5 `+ z) x
int GetExpValue(_Tstream& istrin, _T& nReturn){3 Y! T2 d  H8 o. c/ I
    _T t[3] = {0}; //雨中飞燕之作
/ J6 ~% j( h2 T2 O& E& ?( Y% c    char csym[3] = "++";
. f$ [* S6 ~/ ^' [    int nLevel = 1, nERR = 0;
4 v& e  K6 R0 Q    if(!(istrin>>t[1]))istrin.clear();$ `9 d9 i3 w0 s$ c' T. S/ p# x0 h% @
    for(;;){1 C+ m/ a/ C5 q! D0 n9 Z
        if(istrin>>csym[2]){3 Y1 y6 ]% ~: N9 N
            switch(csym[2]){* U& W. Q$ \/ |! p
            case '(':
0 V0 D# ]+ V* m  _4 W% B                if(!csym[1]){nLevel=0x100; nERR=1;}else
6 l0 W9 s3 \2 w" P9 n' m3 r2 f                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;0 G- _' |/ k  B) {6 A# j
                else{nLevel=0x100; nERR=1;}
" _* d. D/ ]9 [) R0 }- \1 j                break;+ c% U9 C7 h+ k/ Q5 P/ t
            case ')':- k" ~. s; p# k, e  t" ^! S
                {nLevel = 0x100;}break;. K9 a: I3 |+ v6 t- v& f
            case '+':case '-':case '*':case '/':
4 k1 p+ ?& j* N/ V7 _/ r                {csym[nLevel++] = csym[2];}break;
& Y, N# L* q* ?9 M% R            case ' ':case '\r':case '\n':case '\t':continue;0 A4 g. M/ f3 [7 i7 q7 u
            default:
. v9 o0 t- l: h+ _) @9 m                {nLevel=0x100; nERR=1;}
( c6 z) _$ v$ U, F& }            }$ N) P. x, R$ [5 U* e4 ^+ |8 A: X
            if(nLevel==0x100)break;
& q! d5 H# h" h* Z9 C            if(nLevel&0x10 || istrin>>t[2]){
- a& @2 I+ s! f' ]5 a. b4 @                nLevel &= 0xF;
3 U# |5 u" Q  m2 z. S' O5 J( a, ?                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. S% d& X9 k  c1 r' g& u                if(csym[1]=='*'||csym[1]=='/'){7 r' s4 T) e( g' ^& G- ~
                    GetExpValue(t+1, csym[1]);7 L; f* Z) O+ R3 \- D+ v& y. [
                }% a- x5 ?  I* Z0 ^( w8 y
                else{
2 a: M& k- v' k- i* k                    GetExpValue(t, csym[0]);5 H/ M, |$ w2 a* u, v
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
1 Y5 [; J2 z, {7 O$ l) ?                }
3 ]9 [! n3 L* C2 n- Q2 b9 {                nLevel = 1;+ @; d7 D6 k6 @  r3 q3 i
            }
9 x4 b6 _, D, m+ D- Q* r' E            else istrin.clear();0 Q' B/ s. f, F4 H8 F9 i* o4 q7 d
        }
( w) W4 G2 N( R8 j' h- I' F        else{nERR = -1; break;}1 H6 N" v, N8 b  {9 [
    }9 H4 |% a! W$ L3 }9 B6 s3 h
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);# m5 p4 Q! j, W- p2 B! z" L
    else nReturn=GetExpValue(t, csym[0]);
7 y# g1 _3 f7 q5 R* p2 l    return nERR==-1?1:0;
7 O' a( }- y: e0 V* g}}
6 V' |9 m/ F+ d2 W5 k3 H* g; V% |! Y4 D" }/ u

3 ~, k% r& y' l8 D# B! J9 z0 A# A8 |! s
函数模板使用示例:
! Z) h; N$ ?4 I+ h- c在以上那段代码的后面加上以下代码:5 X9 w8 R8 L- L/ [4 p9 B8 ?( Y2 |
3 H$ b9 ?: P/ q$ _( h

: ^6 c4 p1 w: R1 Y3 |1 d- x( E" b. p5 D9 [3 O6 @
程序代码:
# O- v! S7 t# P
' o  s" |, a0 S0 }* a+ o#include<strstream>
9 v) H$ ]  b4 {#include<iostream>
. M3 _# W  H; y+ j* u8 s#include<string>
! w8 w# v) v* u4 K; r+ P. i, pusing namespace std;
2 B+ m% x# ~3 q7 u- Dint main(void)
+ A2 p$ M, E9 M{1 Z! d$ F$ ?6 h- v
    string s1;# w- i3 a2 K# `! ?' G  ], X
    while(cin>>s1)" z( C3 H! u5 Q. f
    {
. ], ]- [; i0 T) f        istrstream isin(s1.data());
6 F$ x! t' w( c( Y: S/ Y; Y( p        double d;
# @: ^& z5 G! v- B        if(fy_Exp::GetExpValue(isin, d)), I1 O5 t- ~4 |" Y7 D& K
        {& ]/ c  @2 `3 H2 T$ a" U  Q0 [
            cout<<d<<endl;
$ S$ ~6 ^* {. h5 [8 P        }" x, }, u6 N: f1 w1 P  \
        else: Z, P' i! y! l; ^1 N+ K
        {
, p, z+ ]: i1 Y% ?8 L            cout<<"ERROR"<<endl;' f) E; H& P9 k0 u! a$ x
        }# }% O$ O( M" ?* V
    }9 N8 z: {3 q, T( m
    return 0;
3 Z7 M, I/ f$ b1 c( J}
0 d& k, }7 g" e) u  q/ i  F/ v9 r9 `. H, m

3 ~% k3 s) h: ?( W4 ~然后编译执行就可以了(*^_^*)
8 f2 b' ]) J# i( O0 [3 O6 H其它:TC++上一定编译错误,不保证在VC6上也能通过编译& L8 [7 {7 x- m: F+ j
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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