返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
$ z2 E% c' _; R8 [# S$ ]一个很方便的函数模板,可以并且只可以计算含括号的四则表达式6 R8 P2 ^9 O1 ?6 e7 Q7 b" z7 t
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
) J: d$ h0 K0 Y+ v. Q/ J参数解释:5 Z5 y, D/ W& d! ~- b7 y% Q
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流- x6 I& `8 B. f) y) }! V; T' |9 F2 A
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
4 e& j' I2 Y  R+ H* H1 V1 H返回值:3 }9 Y4 G; _9 f1 u/ m/ a
返回非0表示计算成功,0表示计算失败有错误
4 A3 S2 d4 K0 s, F# W  a, A
: Q/ ^' A1 u1 `/ m0 }6 D - @0 k4 G3 f: n5 q

, v2 s. a1 o$ x: l程序代码:
- z" g7 e. W8 ~
4 P1 v3 n; t9 A5 F% J$ E$ v% nnamespace fy_Exp{
1 f, W& T" T2 ~9 }namespace {template <class _T>, m9 f; k: u7 `5 Q
inline _T GetExpValue(_T t[], char& csym){
( f7 a! X% {6 P0 c6 ~+ }% \    char c=csym; csym=0;
& g) a; l& H$ h8 N( Z    switch(c){
' R& [0 L* A5 G5 S; y2 Y    case '+':return t[0] += t[1];
" f% _+ a+ }% |5 T    case '-':return t[0] -= t[1];! k$ S6 X% S0 y& l6 c
    case '*':return t[0] *= t[1];
* f$ D" e2 d/ b9 {; H* Q5 r1 D! u; H0 r    default: return t[0] /= t[1];//case '/':+ y. x. w; j# _4 O: G4 n
    }7 M0 [+ B4 D9 m8 P/ I
}}6 U$ ]8 e: \) b" X: S# G+ L4 o
template <class _T, class _Tstream>
9 D; O( N9 z- q  \9 N4 z; X: ~" x/* _Tstream: inputstream, _T: get return value7 F  M1 \0 G9 }+ a5 \
* Return nonzero if get value successfully */# g; R  j: @6 ^' W0 P- ~
int GetExpValue(_Tstream& istrin, _T& nReturn){
( E. e! ?0 Y- g; m    _T t[3] = {0}; //雨中飞燕之作
0 H: f$ n3 d' u0 j1 b3 B  \6 d    char csym[3] = "++";% r) U, B$ O, b+ u& q" @
    int nLevel = 1, nERR = 0;" R$ W) @* i+ e( ^
    if(!(istrin>>t[1]))istrin.clear();' u2 N$ I/ Y8 E" ?% X8 y
    for(;;){/ y% m% H& I/ l/ A
        if(istrin>>csym[2]){
' ?3 X) ^7 U% z$ N0 O* N            switch(csym[2]){
! q) v# v4 s( i/ l+ K$ g            case '(':& h. |9 ]* m4 q& f
                if(!csym[1]){nLevel=0x100; nERR=1;}else! z8 o0 w& J8 H; E4 t. D
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;2 U* D' g' Q: C
                else{nLevel=0x100; nERR=1;}
) }2 p( m3 b" C4 _: @                break;
, Z+ U2 k/ J4 C2 ~9 @$ P            case ')':- n5 W1 s+ H8 F3 ]2 q" e4 H
                {nLevel = 0x100;}break;
0 {3 o) n6 q! e* b& {/ ~: U( V; N: x            case '+':case '-':case '*':case '/':/ H( x2 Y, ^7 o; L* q; O2 l& C, a
                {csym[nLevel++] = csym[2];}break;
+ M8 r5 h% Y9 y. o$ x# S            case ' ':case '\r':case '\n':case '\t':continue;% Q5 ~6 C+ H0 `' y4 q+ z
            default:
8 i8 |' m) U5 G+ E1 d% R                {nLevel=0x100; nERR=1;}9 D& q( P/ S# e* U
            }3 Z: O( ^% J6 s
            if(nLevel==0x100)break;9 }! y4 \; e$ H
            if(nLevel&0x10 || istrin>>t[2]){
) q0 z3 u$ U. \2 Z                nLevel &= 0xF;
# D: J# {  {' M) @( _7 w3 J# N                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
2 u3 s4 w' g2 r8 W/ W3 S2 R                if(csym[1]=='*'||csym[1]=='/'){9 M* w9 Q# K5 |8 t6 k
                    GetExpValue(t+1, csym[1]);
3 d5 J: q; _7 p. }2 W' m                }
9 e6 l* L& R8 `6 V/ a# t' x                else{
; {0 @0 o! K# a! n! D                    GetExpValue(t, csym[0]);
" U& u9 ~# X9 ?4 \' m6 i                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;2 c' T+ A; `3 [5 N3 z9 N! T9 Q
                }- N# C, s0 y- I! V3 `2 ]3 a
                nLevel = 1;
6 Z& I* v! b/ ?* O            }$ e  n. k& i* J% I, G* @
            else istrin.clear();
) s3 ~+ m/ E$ d0 U. M5 v        }7 N, Q5 N# D) H* m8 D
        else{nERR = -1; break;}# w3 V4 i$ Z" b% i3 i) f& I
    }) [$ ^- |. H7 O7 V8 `9 r
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);% r# C! N! y  i2 S+ M
    else nReturn=GetExpValue(t, csym[0]);
  P6 b  M5 Z, x& Y' m; H    return nERR==-1?1:0;  L# z) g% B" Z
}}
2 Q  I) E' M. h6 }2 m- E% N# ^3 s6 ?( d; [4 r& W3 S8 S0 a9 @/ M& p
( J! P0 m+ ^4 ?, s
; }& {' R! d6 ~
函数模板使用示例:
. m/ F+ f) }/ a在以上那段代码的后面加上以下代码:: C, k; e2 H; E& L7 z0 Q  w& ~

# C4 k( R" C+ ?* p$ E* B8 y1 j, { * O  Z" T8 V( o% r' n% P+ O  o

3 F( R7 u. d( c, ]: x2 n+ ?+ d, i程序代码:
9 n8 e$ _3 Z* M+ \/ A% ?
3 V- w" }' o4 b! Z9 r6 `/ v4 b: {7 W#include<strstream>2 b! j, W3 F: @' u" k
#include<iostream>
) ?) X4 p! k3 @  ^0 M/ v  w4 y, g#include<string>6 \( O5 i  y7 o" Q3 o
using namespace std;
: S2 N* I! J+ j9 P0 lint main(void)" ]) J9 S: i7 N) X3 K/ V
{8 A3 w9 n. r( @' i- X! k6 L8 {
    string s1;
( `9 _! L) c  r    while(cin>>s1). T* H% z: S$ f3 K
    {" V5 }+ Z* F3 L" a) p0 n
        istrstream isin(s1.data());% V/ K5 t7 I/ L' D
        double d;
- t1 z! U* X- s( {        if(fy_Exp::GetExpValue(isin, d))9 H0 N8 m% z1 z$ }0 f
        {
5 W9 u2 c5 X1 N6 q0 f6 q            cout<<d<<endl;* R8 r6 u# ?& h: T3 i3 E1 R/ y
        }  g: y9 g5 a; r* N3 ^# P
        else1 Y! x# L- Q' y. o- x
        {0 L. L. W& m" X" [8 L
            cout<<"ERROR"<<endl;; S' K2 N0 H2 }( r
        }
+ }5 i# n  c1 Z; h8 v1 o4 X+ }    }
; ^" ]" F( W3 N8 Z    return 0;0 X  }4 |& m; _! P
}
% K/ h" o0 ?2 k  p2 A4 V
% l3 w. M0 o9 f% u" {
6 \: v& E1 \% r) r' ]" {# r  m% u然后编译执行就可以了(*^_^*)
6 o3 r. X) ~; _8 W3 ?其它:TC++上一定编译错误,不保证在VC6上也能通过编译. ?( o) K! Z- ?/ P
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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