返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,! a7 z. S3 O2 b: P( f# X# H5 H
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
2 J! M+ v& J- c7 l: i: T只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
; r; Y( t; j, H) S参数解释:# U7 E3 n5 q0 x* h6 e. D  i* S
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流) K2 m9 ^( d9 H
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# W( V9 _  v+ v5 j8 D返回值:
: [$ f, L9 G. x; j) O4 S; b  n8 I返回非0表示计算成功,0表示计算失败有错误
' c  ~1 Q0 D+ j' Q1 q- S2 F
: U7 {& r* R1 g% x% h
8 k# g6 y, q& P# C* `/ [9 U# i( E5 I  u2 x- O
程序代码:
7 n! n6 F! i: f) F
" Z8 a; U5 @2 A; o, \namespace fy_Exp{
$ w* S2 q# Q3 H! ^namespace {template <class _T>) U! N# w0 R. x: G  P& {8 G4 l
inline _T GetExpValue(_T t[], char& csym){% g& [1 S6 u/ @* T' s
    char c=csym; csym=0;. L/ {: L: W4 g. v
    switch(c){
& |, ?8 z: G$ E7 V    case '+':return t[0] += t[1];
8 s2 C. _: z' {    case '-':return t[0] -= t[1];  V8 ^0 |5 p" V8 K
    case '*':return t[0] *= t[1];9 l$ h, }, L: j# `/ H0 B& n! u
    default: return t[0] /= t[1];//case '/':
# }3 h7 V! k) N3 {4 c' e5 ]    }
6 y8 P; y$ j! q6 e}}& M* I  {" t2 r) x
template <class _T, class _Tstream>
9 r, |/ a2 b1 n+ }! Z/* _Tstream: inputstream, _T: get return value2 \6 N/ W; `* n$ K' T5 M9 g
* Return nonzero if get value successfully */
' d9 z1 V% G4 X! m, lint GetExpValue(_Tstream& istrin, _T& nReturn){  `2 R( q. A  d9 {8 ~1 ~
    _T t[3] = {0}; //雨中飞燕之作& d# Z0 E- y7 o9 Z0 a
    char csym[3] = "++";. T8 R) c. l  \% z
    int nLevel = 1, nERR = 0;
- s$ J( q( g( \4 d" a; j    if(!(istrin>>t[1]))istrin.clear();
2 m* ~. n5 d$ H    for(;;){+ H5 G" w1 M- R) d
        if(istrin>>csym[2]){+ N. L0 r6 _8 T, p
            switch(csym[2]){0 ]& b: k0 `  M2 b0 u' d( H4 u" z- i
            case '(':( L  f" P8 ]$ r4 w
                if(!csym[1]){nLevel=0x100; nERR=1;}else. D8 w0 E' w7 |# i
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;& }' Q2 ^% T% D7 j  w& L* X% V
                else{nLevel=0x100; nERR=1;}
& B$ T+ ^) W$ q! W                break;% R: b$ J0 i! e5 d+ h( y5 C: d
            case ')':
" H- K+ _2 b1 ~                {nLevel = 0x100;}break;
, _, p" s/ E/ z: a: n: Q            case '+':case '-':case '*':case '/':: D% ^' U8 D7 o+ \9 t, _
                {csym[nLevel++] = csym[2];}break;
, l! s1 r" t. |            case ' ':case '\r':case '\n':case '\t':continue;
6 @' _" n8 v0 j! i+ [0 ^8 ?            default:
! n/ d8 \2 \) H                {nLevel=0x100; nERR=1;}3 O8 Q$ x0 u4 a$ z9 W
            }# e- K$ a+ [3 ?$ W2 v  p; b$ j6 L
            if(nLevel==0x100)break;
4 c) ~& V1 E* Q& j$ ?            if(nLevel&0x10 || istrin>>t[2]){6 N' \) E6 _- h
                nLevel &= 0xF;3 T# m) x# ]) r: p$ J6 c
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0 R' d) P4 P; X2 T4 L0 @( n- D                if(csym[1]=='*'||csym[1]=='/'){" g. z! K* K, Q# y
                    GetExpValue(t+1, csym[1]);
: l) m; |0 h; N                }
' f+ d; v  D* q, w/ Q7 e                else{5 x% l) s* O+ H2 C
                    GetExpValue(t, csym[0]);
! j7 S/ T' e2 W+ |                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;0 {) ~! ^* b/ A$ x8 k  u
                }0 V  h* o( \: x- v( K9 @. R2 }/ T* }! s
                nLevel = 1;/ q! c: _0 q* Z8 D* }0 \
            }. E6 X' s' F2 J  p
            else istrin.clear();$ T! ?# W2 f9 w! }0 R+ @
        }
' ]' t) \# Y! g0 m& ]- I6 \& M! L6 |        else{nERR = -1; break;}# P% C" E4 i; Z7 e2 A4 ], {
    }/ c# w) h% v4 F6 ~  J* u
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
% w& P9 y. t. c    else nReturn=GetExpValue(t, csym[0]);
9 _( z$ v( X4 m! c( r3 w. k    return nERR==-1?1:0;
: {' g1 ^/ n7 i$ W}}
2 h9 G$ b, w+ F- X; T+ \) O3 ~- v! e0 T9 N

( l* n# A0 \2 A7 h
" j- ~* B; m& V5 O函数模板使用示例:
- F7 Q/ s  c/ n" n2 B在以上那段代码的后面加上以下代码:
* h8 f6 v( g! U( m+ \' W9 E
2 t2 f4 B* q  s% R* c6 O - F; W& E8 \! C4 @; r
+ p# I1 S6 e9 R: D
程序代码:
& ^& z5 Z9 Z3 `, ^+ X( }
( w/ _# K" L% i4 z7 F0 @#include<strstream># g6 C0 m# G1 V$ N) E; e2 _
#include<iostream>
9 r1 w, F* |9 V0 x3 V! Z#include<string>  a8 X' X% ^1 k0 @+ x! |
using namespace std;
& [, |6 J7 ]- w2 _4 {! Cint main(void)
6 Q' [1 A& a: [2 j$ x{
5 m5 p7 Q  y6 d9 K+ S    string s1;
4 S. n) I+ D( \    while(cin>>s1)
- W9 O) `( K2 y$ w0 f& ?; \# u    {
4 V, N7 {/ n4 L2 r/ K" X& m" h        istrstream isin(s1.data());0 P, n/ E' M0 U% Z$ _
        double d;# z) Q* }2 z) h2 F. A" ]
        if(fy_Exp::GetExpValue(isin, d))
5 y1 E8 g4 J1 H: K* T        {
' i/ [& s5 Q: ^( u$ B; l            cout<<d<<endl;: l' ^" K. E" L, w: Q  _
        }" O8 c8 O5 P( X; V4 a
        else
* M6 u. d1 i& |) t8 G        {
* C% Q8 ]2 g  }% S+ N' j            cout<<"ERROR"<<endl;- w4 W& J2 c. M' p7 j3 f# A) e. |
        }
: i$ T' J  H, w    }6 {# j! G* Y: ^' W# e4 S* C+ n
    return 0;2 s- ^9 I& {2 m- i$ \9 T) Q$ h
}
- \0 L; b' [* Z' q3 V
* x& P% q7 Q3 r4 Y4 t2 I" n9 V: N& R- h
然后编译执行就可以了(*^_^*)
$ ~+ q  O/ P" X$ r9 O" W2 B其它:TC++上一定编译错误,不保证在VC6上也能通过编译8 z" f# {+ \$ N8 a2 E! `! i1 z+ ]
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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