返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
8 U) V; Z" n1 _) |" l, `一个很方便的函数模板,可以并且只可以计算含括号的四则表达式1 o% F+ t. L4 N8 c3 p+ `( v4 N
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)7 I3 w: N4 `4 O7 `. }
参数解释:
% W2 d3 R/ ~4 h8 F; N; [istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流5 ]) H! n' I6 @/ R
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定( I% M  A) |5 I2 T( ~# ~
返回值:
9 D) A( h( V7 H1 |返回非0表示计算成功,0表示计算失败有错误: z9 L' Z- R+ _6 ~0 j3 Q& }* h
) r2 R$ `" Q8 M  f
: @- g1 `/ g8 z% l+ z
1 l0 Z0 R1 F# `7 F$ U6 n" v
程序代码: ; ^% a" w$ l4 Z0 z1 Q5 Q% I8 k

- Y! D* ~6 D) S' Xnamespace fy_Exp{  Y- z1 }: {; b8 P( D2 Z: ^! }/ y, h
namespace {template <class _T>' y% J( K7 d4 ]( `) n0 q' V
inline _T GetExpValue(_T t[], char& csym){6 X3 r  l1 i0 W; i4 ^5 U, a
    char c=csym; csym=0;. x1 t9 g6 y& @$ e/ B
    switch(c){+ u7 F# ]. M5 T1 b2 d) y4 r
    case '+':return t[0] += t[1];
: N7 x0 ]5 h; n6 N$ R5 E    case '-':return t[0] -= t[1];
/ U! d9 z2 N& c8 R2 g; l# Y9 ?    case '*':return t[0] *= t[1];
8 f$ M: s* q3 L: \. a    default: return t[0] /= t[1];//case '/':- F+ w" X" `9 E9 |* g1 N7 M7 i$ V
    }
3 e! W. f0 i" E" a6 Y}}* [' ^( }  f1 s) @% c' j7 r5 d, _
template <class _T, class _Tstream>: R  t+ y' w3 [
/* _Tstream: inputstream, _T: get return value
' R) Q4 }) Q' i9 e* Return nonzero if get value successfully */. H: |8 J  O- o* `" }, p: D
int GetExpValue(_Tstream& istrin, _T& nReturn){
4 ^' I# J3 }1 N- x; m3 V8 K0 r    _T t[3] = {0}; //雨中飞燕之作
& E- m- W; w3 j7 y    char csym[3] = "++";* A  N" ?. M9 D, f7 _, @. Q
    int nLevel = 1, nERR = 0;
, a' S5 A/ ]- `3 k, Z( T9 k    if(!(istrin>>t[1]))istrin.clear();) s4 f7 R9 E& k8 A& V
    for(;;){! Z" G- Q% B& S* w2 Y
        if(istrin>>csym[2]){
2 l1 X! ~" b$ W- o9 J# r) i            switch(csym[2]){0 }6 n& [: F) z; d2 F' n
            case '(':
4 l0 a! j. _) U% j, y7 F                if(!csym[1]){nLevel=0x100; nERR=1;}else
/ C7 G( f$ G, D+ H4 B0 U5 X                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
" ~: n9 c( F2 ]$ T( G* ?# l* m5 {3 O                else{nLevel=0x100; nERR=1;}# `7 n  f2 X7 K# T
                break;
5 T) K* n2 [3 V- ]9 D& ~            case ')':
: V5 ^( X8 w0 Z# K1 v; [                {nLevel = 0x100;}break;
0 f0 l; O  m$ f" Y5 A% Z            case '+':case '-':case '*':case '/':; V. ^* |2 |) O! ^
                {csym[nLevel++] = csym[2];}break;
  D) C4 o7 D  t2 o3 u# l4 M- E            case ' ':case '\r':case '\n':case '\t':continue;
+ \/ u/ G6 f( E5 ~            default:
3 W/ W2 r8 O1 o( W# f6 d- K                {nLevel=0x100; nERR=1;}7 v' X. ]! c: I8 X
            }7 Q% T; R) t6 ]& r/ ?9 V+ t
            if(nLevel==0x100)break;
: X- U) o  x" z            if(nLevel&0x10 || istrin>>t[2]){
# `5 D" i" }" U$ |1 i  y                nLevel &= 0xF;( U: d$ l4 w. @, ?* n& f
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
( ]+ B; @1 u+ L# ]+ g                if(csym[1]=='*'||csym[1]=='/'){- O% ?" Q% u$ Q% u2 s: Z/ e) o
                    GetExpValue(t+1, csym[1]);1 F2 a( ?5 U( R8 a! K+ M* V3 ?- x
                }
* v4 k6 q6 J" k  U5 K' |/ p4 V9 F                else{5 x- ?% G+ V6 g# b, f- [9 ^+ ?
                    GetExpValue(t, csym[0]);0 h$ }' b; g8 ~! k8 y
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;; w. v4 q0 \' s8 @, |& M+ k: `
                }9 Z+ G8 g; ^$ M2 ~8 c8 d
                nLevel = 1;1 ~$ _$ j" [. p' {, E& {
            }
% ~9 O  a' }$ S5 B7 V  V9 |            else istrin.clear();
9 _( C5 J  A0 ~2 J1 S3 c6 o- A        }
8 t6 E5 b9 ^6 H$ J- @/ X        else{nERR = -1; break;}3 U, P/ o: `  w8 u/ E
    }# H* W, f2 ?3 t( n& O: {
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
  G; Q% E. {1 T! Y& }6 n    else nReturn=GetExpValue(t, csym[0]);
0 v7 @- N7 y" \    return nERR==-1?1:0;# T% j; v6 o9 @
}}
% H; W- H, }& e2 k& ~4 B. z9 C6 _0 d5 y8 [* }# B2 m

: r8 J5 c* ^! e4 v" j- C/ p6 D
, I' Q! U1 {  u: {6 o函数模板使用示例:/ m' {) {' n) y! u) o8 b7 i
在以上那段代码的后面加上以下代码:
6 ~2 D2 b4 q+ b: X' ^4 s& B6 d
& y+ a" H3 f* b7 B$ T7 Z6 w( t% {% j : U1 b  u! \* T9 s' w  a

5 V, j8 R/ l& A0 `程序代码: 4 h% Z  G7 p$ y8 I2 o- w9 G
. G% ~4 d! N$ z) |
#include<strstream># i+ {! m) E+ s0 K1 w: {
#include<iostream>
( P1 `; K' U/ K: C#include<string>
8 |3 K: V. K! s. cusing namespace std;( }8 B2 T. q, v% ?* ~$ G8 u
int main(void): k- \7 J) |8 d1 h7 I' e% {' I$ A
{
# P; z$ _! k- f) z( j    string s1;
8 L+ o0 i6 }$ R6 \- F- ?    while(cin>>s1)! T. c! Z; ]$ N& Y( m: O1 d
    {
$ \7 x# K' b/ I% H5 s5 I- j        istrstream isin(s1.data());
& B. }' ?/ m* I/ `9 K; C        double d;- L/ ~* I. g8 w
        if(fy_Exp::GetExpValue(isin, d))
. j- K% q" n0 s' b1 K9 G; T        {
9 d' a1 U! E: ]- c: j/ i            cout<<d<<endl;
! S* o& d1 c% x7 s        }+ s* q8 F6 K; Z1 X) |6 u5 K! R4 F3 F
        else, D" }7 Z& i- V: G* U
        {
6 _- Z( Y) r- ?$ H2 _7 ^2 n, K  A+ c            cout<<"ERROR"<<endl;/ s! W. A0 S  r. a) j
        }
, D% s& R* M, |. W0 u    }, z" o; R& G& K% p5 ]! x  L5 S4 K
    return 0;
& q7 b8 {7 k5 x5 K9 Y4 G, `* r. Y}
( Q6 w0 ~+ \( c5 r
: e" X) X  x' u* ]# V; o1 H/ {3 @0 M: f9 l( [! g/ E
然后编译执行就可以了(*^_^*)5 \6 c5 g- p: d9 v
其它:TC++上一定编译错误,不保证在VC6上也能通过编译2 m1 x$ X+ L; J
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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