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

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

在9月8日那天我特意编写的,给大家分享的,
9 b. Z! M( \& L一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
" W0 [9 B* @4 T0 ~( k& t; }6 S只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" x. |& l0 {% n! C参数解释:
) O: a! Z  `0 L( X6 o& Fistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流) C0 {  P. E. j/ a) n" l* Q' f
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# Q. d1 \( e% w- Q4 C返回值:. Y2 i5 }; c$ Y$ p8 J3 z; U
返回非0表示计算成功,0表示计算失败有错误
* A1 e9 p6 v8 D1 ]' s/ q; ^" a7 {1 {" ^0 W+ Q; U" P- H) M

9 v8 l" v1 P1 ]9 p
: T0 S; M1 ~# C, P程序代码:
" Y; T4 b- C0 {  n" g4 O, h; T7 E/ F$ b. Z+ C: o9 l
namespace fy_Exp{- U: [* j0 ~" i( X
namespace {template <class _T>
) G* w- f) L% H" T5 R1 v) @inline _T GetExpValue(_T t[], char& csym){
0 Q1 U: O+ _$ c$ x2 Y9 e! J    char c=csym; csym=0;
- D, P! N. v" Z9 K* C, Y    switch(c){2 v4 k' [1 D- J) h: \, L% Y4 L
    case '+':return t[0] += t[1];5 B" I6 Y. H/ R- s2 ~! j9 I1 T' G
    case '-':return t[0] -= t[1];
! V; N! Z' {- v0 ^. N' T' J1 V    case '*':return t[0] *= t[1];
* O  T5 {1 \: q: Z    default: return t[0] /= t[1];//case '/':' g" I; I' P+ Y; A+ T# I3 h! d* [
    }
, X; t& G( k) b- p) H5 l, ^5 v}}" i' g) b5 }( C
template <class _T, class _Tstream>/ |: e6 l: W0 N1 a$ h: |
/* _Tstream: inputstream, _T: get return value
0 x( G7 k$ D) d2 e! m5 A* Return nonzero if get value successfully */
5 x( @) T/ I/ R- w' Mint GetExpValue(_Tstream& istrin, _T& nReturn){/ P$ |# j! V( l+ c
    _T t[3] = {0}; //雨中飞燕之作
, i! h$ x6 o" F+ ]" ^    char csym[3] = "++";$ G+ l* A6 R1 X" x
    int nLevel = 1, nERR = 0;
+ h- |- C! M' ^6 J7 x# A    if(!(istrin>>t[1]))istrin.clear();
- D' x! }8 ]( F  n5 j. |4 W! R    for(;;){
* H8 j* Q; t5 ^- U8 N5 I2 G        if(istrin>>csym[2]){
) @3 K3 U  B$ k9 c            switch(csym[2]){& |9 b  N( M  ^
            case '(':8 V, F" b& y# U) M! m8 |
                if(!csym[1]){nLevel=0x100; nERR=1;}else9 ?: d. ~! @# V6 u# {5 h5 m9 }
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;" P# O- e  Z$ ]& O& @/ X+ z
                else{nLevel=0x100; nERR=1;}( {4 s2 A+ s/ C( K/ E, B* ]! t
                break;
9 P2 R& v2 D/ w! |( Y4 H, ]            case ')':
- t* X  ~7 N1 u) j% h                {nLevel = 0x100;}break;- ^9 n5 x9 i8 E$ h+ N
            case '+':case '-':case '*':case '/':
! X0 r+ x& X8 C                {csym[nLevel++] = csym[2];}break;
/ M& F5 j6 L; c( i" A: d5 z            case ' ':case '\r':case '\n':case '\t':continue;0 D1 p9 ~: W, j( m, Z+ J, L
            default:1 ^. }9 b/ ]: B: ^: a
                {nLevel=0x100; nERR=1;}
9 f; c8 i5 O1 E* K            }) m1 t$ E% X- Z1 q4 L' p
            if(nLevel==0x100)break;1 D+ s8 ^. O/ Q3 o  ~9 i4 E! @
            if(nLevel&0x10 || istrin>>t[2]){
2 W1 M0 _! N  X                nLevel &= 0xF;' N8 _  \5 Y  z* t- u4 b9 O
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0 P! ]7 |& y" l4 m1 l7 Z                if(csym[1]=='*'||csym[1]=='/'){0 @0 G3 Z: v6 f$ X" D4 b7 ^
                    GetExpValue(t+1, csym[1]);
+ m& T* g4 M2 k, h+ j- C! K' _7 d                }
; F1 d7 m. W. J# N  m9 G, c                else{
# [2 y! ^0 ^5 a( ]2 P                    GetExpValue(t, csym[0]);
- m' |3 t! V" F/ ^3 \* k, A# S% t                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;1 [8 c# m' O/ w6 {
                }
& ?. q1 V( x" I& Q% {, y" V" q: V                nLevel = 1;
+ D+ ]8 {2 U$ Y8 p+ h            }
" }' Y3 x, J2 U/ z2 }$ B            else istrin.clear();
5 x! g5 S+ D7 ]' H) |        }
2 n( @9 I/ K- p+ n- ~. m# W        else{nERR = -1; break;}1 _, E7 [+ V. S/ Y9 P* f1 G
    }
% R6 H) I7 o- d5 ^% n! n# x    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);& j! ?$ D  F$ f
    else nReturn=GetExpValue(t, csym[0]);( _' B7 x* w8 S2 r" R7 I4 |2 Z. F2 p
    return nERR==-1?1:0;2 H* i$ X' H  r0 c* z# T: j! R
}}
  M6 n1 b1 g6 H" a+ N
% W/ h: k# I, j) D( X' o: K( X8 r  }- W, s2 H: a2 r, z$ p
; ]/ |! `7 l; b4 n6 v: ^
函数模板使用示例:7 W0 ^  {+ P6 Y$ D8 M, J
在以上那段代码的后面加上以下代码:1 {. E8 B% a" s5 r( v( ~2 e- a
) y, N+ ^1 y: q. c* J7 t+ v3 h

' Y( o: s$ |' q, A& F3 K5 b  U& r! M0 o3 ]9 t, z
程序代码:
0 c3 I+ u5 a; P4 F1 a/ c0 Z& ?: n& {+ S2 x0 h" e- j; z
#include<strstream>
7 X4 s6 Q2 y+ }1 n" j7 V* [1 I#include<iostream>
* Z7 [) ?; Y  i' U8 D% x) t#include<string>
& S& s# B6 _; R  D) e! ?8 L1 lusing namespace std;+ {; j5 \( e( K% Y, g! o# E' h) E
int main(void)
; [2 @/ K- i* ]6 W, G" m% J3 h6 V{, B2 p3 {/ s/ M$ |& s9 j, z
    string s1;
) ^; G3 @; K" ^! y( m8 C7 b+ a7 D    while(cin>>s1)
: V0 r5 l& c  b, u  e    {" G4 M/ @4 x" _; k7 d' [9 a
        istrstream isin(s1.data());  y3 a/ {8 Z: y1 U
        double d;
% z0 O! v- a% X3 X$ `        if(fy_Exp::GetExpValue(isin, d))
, I% B" Q4 B, n- S7 Z        {
- K2 J, i3 c) j            cout<<d<<endl;
2 W, n. b- n9 I) @, v" \0 Z, X5 R% l        }- V; V5 ]! L  r
        else$ `2 Z8 E5 c  i1 @% ?9 ^/ }
        {. l0 c. E: |$ f& I/ c0 a9 D
            cout<<"ERROR"<<endl;
7 C7 V  W5 {; O+ C, W1 Q! ^/ Y& H0 h: F        }
% b; k5 C4 h" U0 \: @( U( g1 t    }
) \5 y. w" M0 e! S    return 0;- B4 z0 |0 j, K
}
) P: q. b2 n8 t2 ]# D
8 d1 `# i8 i/ l# }
  Q1 a# z9 ]6 _5 T' X3 E然后编译执行就可以了(*^_^*). g5 N; I' [% b4 C. l1 I
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
6 S* _  S" e  d* E, B7 j4 n# p1 ]      建议使用VC7或VC更高版本,或者使用GNU C++编译

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