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

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

在9月8日那天我特意编写的,给大家分享的,
4 L  g* a* z* O% Q! |7 S一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
, T" I/ P; Q$ o: U7 F: x只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)3 n0 W5 a% U" O, c
参数解释:
; }# X: A1 \/ R- }; ]istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
; s* B1 `& V/ Z$ h  P6 B) `8 p: inReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
8 i6 `' u6 B0 r9 F& r返回值:0 d* {! r8 m4 ~3 L* j
返回非0表示计算成功,0表示计算失败有错误0 Z' B+ m, j( p2 ?- b
; r5 P. P8 o' H/ p/ [0 s
$ R1 g" ^  [: E. R! m0 E

0 F$ A/ M$ z- b  l; O. G程序代码: 0 f& a+ R! k4 C- `3 s

- o  r6 S( H4 |6 \) [9 W. t& t2 @namespace fy_Exp{8 a( H7 ^' j# r$ p7 W5 }, T' Y
namespace {template <class _T>2 ?. Z( T6 V( U0 \* K
inline _T GetExpValue(_T t[], char& csym){
5 J" f" \" q- d, [$ P    char c=csym; csym=0;
$ R6 E5 D- f: ?( g    switch(c){
2 c: S- A; ?  X1 `. X( d' W- f. Q    case '+':return t[0] += t[1];
" _+ ~. n# S$ @; _1 i  y# o    case '-':return t[0] -= t[1];2 I2 C; ^5 H- ?1 A
    case '*':return t[0] *= t[1];
0 ]# E$ I  J: M( k$ O( q" @2 u    default: return t[0] /= t[1];//case '/':2 [# P0 s( o$ f  B
    }( u3 c9 X3 `  a% C
}}
. z0 f' X) q4 h3 O% jtemplate <class _T, class _Tstream>
& H: N2 U3 T& C9 B4 \  y/* _Tstream: inputstream, _T: get return value$ [4 z& I2 g& t3 K# q) f
* Return nonzero if get value successfully */
7 s' [+ [) C. Aint GetExpValue(_Tstream& istrin, _T& nReturn){8 x- U; ]2 d% z% P8 p  J8 Z
    _T t[3] = {0}; //雨中飞燕之作- b9 J9 T7 O8 q% I
    char csym[3] = "++";! ?7 q8 O/ X' \, {7 r8 j
    int nLevel = 1, nERR = 0;
3 t1 D' R1 r" E( H    if(!(istrin>>t[1]))istrin.clear();! ?) X( {4 o3 g/ M% u; i* N- `
    for(;;){, Z7 U0 @  g0 L. T4 \
        if(istrin>>csym[2]){8 c5 [2 z/ I" u$ K3 o- a
            switch(csym[2]){) [; W, U1 F& p, S% K
            case '(':6 ?6 [6 c. S3 E) @1 ^
                if(!csym[1]){nLevel=0x100; nERR=1;}else4 u3 j& p7 M+ G$ W6 H5 t
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;/ }2 `: v) z! C& J
                else{nLevel=0x100; nERR=1;}- z2 l2 _2 |0 {8 F6 ?  `
                break;
5 Q; a# n& T: @1 a' F' T( r2 x            case ')':
1 A+ y4 K- n$ N8 b% p/ C                {nLevel = 0x100;}break;
) n/ Z3 m. X) v. [; Y            case '+':case '-':case '*':case '/':
, m& m1 h5 p9 V1 w: N$ o                {csym[nLevel++] = csym[2];}break;
! Y1 D: }3 r8 h6 N. z# O3 K& ~! k; l            case ' ':case '\r':case '\n':case '\t':continue;
; W( W6 E) a) ?, F: J. W            default:
. w  S9 h$ u/ `( X0 ^, I! B                {nLevel=0x100; nERR=1;}7 g8 u  f8 y4 j' \
            }7 n8 l' D2 S% Q+ X
            if(nLevel==0x100)break;
; w5 E! d  V4 I$ i3 b0 |            if(nLevel&0x10 || istrin>>t[2]){4 \1 N8 l" ?: }: O4 Q2 P
                nLevel &= 0xF;
; Z5 \1 l( m/ h# ~0 ]2 E4 q                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}; x4 ]) t- T0 i* j/ \, U8 C$ W' w
                if(csym[1]=='*'||csym[1]=='/'){
( p$ |  O( U5 T% J7 J                    GetExpValue(t+1, csym[1]);5 P" B; M* ]) p9 p8 }4 ~0 |
                }) i1 a, D" F9 R* E: O9 j
                else{" g; N! ]- P9 u% ~6 p9 k, H
                    GetExpValue(t, csym[0]);- t( u7 I3 ]- ?! p
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
% K1 a4 Y, M4 K. |$ }                }
( n& Y% x% ]% y3 @                nLevel = 1;
, V* N* M, Z& z. {, Y  H            }
1 R! a, N6 Q: x) T            else istrin.clear();
: v2 c, _: J2 u5 t# s        }
! ]( b8 T5 J8 ]% K( D. }, z        else{nERR = -1; break;}
, b, M& T. r2 l. `% h# C7 a    }
6 H/ s3 [# m# m. B& A8 n5 B    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);$ F, w! e3 Q) z' H4 j
    else nReturn=GetExpValue(t, csym[0]);/ M( S3 D! k* J
    return nERR==-1?1:0;
  C: }, l0 L2 S" x( n}}  W" o4 e0 C& ?& v  O+ `+ P
+ D  ?# m3 S6 _- l: @# e$ ]
$ S7 ]* v: K- a9 x/ x

# w& p6 O: U5 I函数模板使用示例:
+ Z* g) {! }1 ?. Y! ^& L/ L% _0 I在以上那段代码的后面加上以下代码:: J  v( P5 s- J8 p
# B9 z$ s1 Q: v  w
( f0 F  I; \: b3 z+ q
6 D7 _) d) Q# f
程序代码:
) M( q$ M/ t" X9 p/ x# b
: `: u- ~) g  E: \1 i; _4 q! e, ?. g#include<strstream>
" p' ~) R! m' Y+ ?$ \, j+ H#include<iostream>& [$ N$ u5 d$ c8 _- u
#include<string>4 x% J4 T7 e8 Q  Z8 W  q
using namespace std;- L: H. g. C2 J7 L: \$ F, e
int main(void)  T  L# M# p; I% k/ g
{: Y( j4 q; p% X1 A! @
    string s1;& y; G( K7 [$ p5 a
    while(cin>>s1)7 W! {/ _0 ~9 R4 F; f
    {
9 |% ]- c2 a, C( E        istrstream isin(s1.data());5 L6 p, i3 @' [4 p! s
        double d;
0 K; V5 X+ L& d$ |        if(fy_Exp::GetExpValue(isin, d))
9 T7 }+ p; p, E3 T$ X        {9 V& K1 {3 Q" @5 `! q4 \
            cout<<d<<endl;" F  d4 S, l0 I! o
        }
- v$ {  A, ~1 |! K, i        else
7 g1 G" z1 o: O4 K% D        {
; z5 q* n3 Q( O+ o/ G* y            cout<<"ERROR"<<endl;
6 ^/ v6 N# m( [# B        }
, H. z0 f) b* p: d* E! n7 q    }* a5 J5 a. T$ |0 t9 c( T7 q
    return 0;
1 j; U7 k0 v3 L; i1 Q+ c6 k0 n}! N+ K( h/ D4 I! P8 d4 e$ D/ n
/ f7 D5 V$ f2 L# ]
- w- B) ~# j1 U! z, Q# K) z1 P& M
然后编译执行就可以了(*^_^*)* [1 B* D% h3 }3 I
其它:TC++上一定编译错误,不保证在VC6上也能通过编译8 K4 P; S: Z& A' r6 \& g3 V
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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