返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,1 S' `7 w6 F: t, z9 R
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
5 x* o, H& l- `9 b; p' Y只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)! @$ B6 g* k" r- s( G- W8 @6 C; L
参数解释:
# h5 i  i8 J4 K0 R7 p4 }) `8 q( H  yistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流2 X# J$ n( a9 Q, ^) c0 v1 S5 U
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定% p8 s8 X9 L: y
返回值:
/ e8 f) B8 E$ x% W  m* ^% P返回非0表示计算成功,0表示计算失败有错误
2 a$ ]$ G( U  N' e2 G: r# [
9 V7 F+ P- l+ R& O# S
3 s. K2 u$ Q5 ~3 C- j2 s, Z" x
8 R- W! V, |/ H" v7 e& p4 j( y程序代码: 7 Y0 H) f) W7 W' h( x$ h. a. |3 K

1 {1 N# p# j# s- r& N1 c& @& D6 I" ~namespace fy_Exp{4 ^3 O# X' ~# i% M: r+ P" ^4 Y
namespace {template <class _T>
0 g6 Z6 h& V+ N9 Ginline _T GetExpValue(_T t[], char& csym){. A5 h2 u3 `3 U3 X" s3 K1 b9 |
    char c=csym; csym=0;9 L, c' \" Y4 E& E& ?
    switch(c){
( \% H( h# m$ d# r" L' R    case '+':return t[0] += t[1];
. D: h4 `  c2 ^1 F* Y    case '-':return t[0] -= t[1];9 Q6 L- {6 n, J! S: f7 o8 u( ~
    case '*':return t[0] *= t[1];  l: |: x& h3 X: Z
    default: return t[0] /= t[1];//case '/':1 i2 ]! `1 P' L. s  l) I9 c4 Y
    }- u- k8 M; [$ e! R2 i. c; T& Y$ `% D
}}
4 S7 o; M2 s; M+ j5 d/ J  Qtemplate <class _T, class _Tstream>  V- N) d) d; Y1 s; x* B0 |7 L7 ^. Y
/* _Tstream: inputstream, _T: get return value+ G( z, b. E4 D; I- ^
* Return nonzero if get value successfully */
! ?' p' n9 N) E) B+ z3 a1 Oint GetExpValue(_Tstream& istrin, _T& nReturn){
' F7 ^2 o% O7 j3 A. I; [) N    _T t[3] = {0}; //雨中飞燕之作; J: ?, \( i+ Q2 ?% p
    char csym[3] = "++";
" p' y6 a! |1 C. v) S) ^8 l    int nLevel = 1, nERR = 0;7 u9 b' S' N: ~1 U% B7 S3 O# Z
    if(!(istrin>>t[1]))istrin.clear();
: {. A1 j$ M" e6 ^% S/ C( l    for(;;){7 m- z! \2 P" w' ~
        if(istrin>>csym[2]){
% V5 Q( l% D) ~- O8 u* c8 j            switch(csym[2]){  w% X$ c: [6 p  J. u  W1 d
            case '(':: y* e2 }5 V" X+ ?8 O- A8 S  S6 B% Y, v
                if(!csym[1]){nLevel=0x100; nERR=1;}else
9 |5 {- D5 D! e                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
7 G! \2 g4 @# T8 K4 j                else{nLevel=0x100; nERR=1;}6 z( K8 P1 X$ L
                break;% B6 h# F* y1 ~( Q' S7 ]
            case ')':
) b4 ?/ F9 J3 \" m  p6 a7 A& n                {nLevel = 0x100;}break;
  F2 T! @6 O/ a) Z0 K            case '+':case '-':case '*':case '/':
4 t+ O' w6 N3 W8 k& c                {csym[nLevel++] = csym[2];}break;
6 N3 F3 D3 q  R5 {% }            case ' ':case '\r':case '\n':case '\t':continue;( w' D: N. z2 r5 R+ J2 z
            default:9 c0 G" [5 j% \5 Y5 s
                {nLevel=0x100; nERR=1;}
3 E8 l0 ]1 |& w+ }1 Z$ R            }. S8 g) X, U" U
            if(nLevel==0x100)break;
. c' [- F, r3 G            if(nLevel&0x10 || istrin>>t[2]){9 g+ R% ]" \1 n) \
                nLevel &= 0xF;0 t2 ~- [2 }; A' B% R2 h
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 [( {" z5 J2 e/ j% o
                if(csym[1]=='*'||csym[1]=='/'){2 ?( F, s8 K+ K/ i! j8 e
                    GetExpValue(t+1, csym[1]);
& b& n( a7 Z& B                }- h4 ^) j8 V- v# d
                else{/ h2 T% T( E/ m
                    GetExpValue(t, csym[0]);7 _) I/ F0 P0 Z' f/ l# t6 ?
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;3 L* H* J  U1 Y! Y
                }( X3 N2 @9 h/ N4 X0 l% k
                nLevel = 1;, n8 E3 X% K, W5 W6 d* |
            }
* i: J- W) u8 W3 K5 q, s$ N            else istrin.clear();
' Z6 t( c! @  ~        }: U! j6 G! F$ R, l: r, r. J4 a' t% x! V
        else{nERR = -1; break;}4 L" X/ U5 D( M" P& D3 P0 f1 t) C: L
    }
- ^' `; E) I$ `6 m6 |8 y    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
6 w: \: n$ |' S& U    else nReturn=GetExpValue(t, csym[0]);
7 u& _' F! [9 }' S' G# U    return nERR==-1?1:0;
, v% o1 K2 R+ G}}
, x8 d" W% @$ s) T' s+ E" p. ]' ]: g
! g+ m1 N+ Z- Q
: |. P' k1 R2 c' P# _% e/ U) W
函数模板使用示例:% |, N1 e3 o8 v) S' U
在以上那段代码的后面加上以下代码:9 v# v" p/ h% T( C8 L

: Q/ r/ l2 t/ O* E! w; h $ X2 s. K' |: e8 K. v0 S4 ^

" H8 I2 L9 w" q程序代码:
) z2 X( V; @3 p/ h' I
( N  D5 W* s  r& R) h) d  U, r: R#include<strstream>
1 q( g2 M  o. X' w, t#include<iostream>
4 J) Y( M3 }8 j, A( m5 \0 M#include<string>
9 P" o; R: n) L! z$ Iusing namespace std;
& q; C" u1 c6 I! U! Sint main(void)* \! e) Q. C, A( F2 s; t
{) l. A' w+ Y" W
    string s1;
$ Q1 `; C. ]8 x) O( K    while(cin>>s1)! E' |" x- w) L. _8 w
    {' I0 I% E: K. a# {
        istrstream isin(s1.data());
; T( ^* E6 k6 W3 h        double d;
. T+ n8 E! Z& ~4 Z$ {        if(fy_Exp::GetExpValue(isin, d))
+ ?# V) F. S1 }$ N" E4 u        {
- `6 l& S" r6 t  H) W5 q            cout<<d<<endl;
$ k) R: n* K( Q8 N        }
, i3 A! Z) z8 ^& S8 h  b6 Y        else( A% N0 B8 B0 j1 S4 X+ L
        {
0 n& x* F3 ~8 R* R6 T! o2 r! q            cout<<"ERROR"<<endl;
; |" J; ~# h. W7 v        }
; g! e/ N2 n& N7 _9 ]    }
9 P* X5 P! \  D; T3 a2 H    return 0;" w; L! _# m% c0 d- E8 A
}9 ]; c" S( S4 Q. }7 a, X; k

' h' c1 `4 p4 b: v1 K; q/ Q0 U5 h0 X3 m- Q7 _% r  M4 H/ `* X
然后编译执行就可以了(*^_^*)
9 D' _. n! {4 @" |0 _7 u2 y其它:TC++上一定编译错误,不保证在VC6上也能通过编译; }0 d! i) u& n
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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