返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,; h9 |3 I5 v# V( Y5 o" g
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
( o! d2 n, V3 S只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( ]* e8 E" P$ q) N! X5 r
参数解释:3 A4 K9 R' y8 F4 V% K
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
, D# W1 w' k8 u% BnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" _. J6 t/ o( h3 ^% A
返回值:
' y- ]+ D' q6 }$ f$ w6 E  D! \返回非0表示计算成功,0表示计算失败有错误
1 Y, Y6 z+ l  C$ g7 f
$ Y) ]6 \1 l& Z) c, B6 q' A5 b
9 I* O' j7 }' Z9 {' E9 c) m5 V
: n/ y2 e) @! E+ Y" F8 o& h程序代码:
+ v5 M% I$ Z" ?8 F! e; L$ b" T) P- c. J, p4 x. @' W/ G
namespace fy_Exp{/ a; W: |3 K5 |& X" G& Q
namespace {template <class _T>4 e! |9 _9 x# f% j- u
inline _T GetExpValue(_T t[], char& csym){
7 j2 O8 q* r- ^$ E    char c=csym; csym=0;4 n& G4 E9 x# `/ p! f5 m- z
    switch(c){; j, e% m1 ]$ x; v- r
    case '+':return t[0] += t[1];
  i; C/ d0 f$ q/ U    case '-':return t[0] -= t[1];
) N( A; g! j7 D) b' e8 ~% d    case '*':return t[0] *= t[1];# N5 v5 _6 ~# M7 M8 E
    default: return t[0] /= t[1];//case '/':% S5 z, J9 y: V& H' w( q9 {
    }
' ^2 a$ n1 E" C: }}}
6 w6 I6 p1 A8 f0 f/ I4 utemplate <class _T, class _Tstream>
" G# y# W. n  X( \9 _5 A/ \2 }; U/* _Tstream: inputstream, _T: get return value
$ c6 a; [4 @6 |4 |* Return nonzero if get value successfully */8 \% Z% M+ q. R4 H
int GetExpValue(_Tstream& istrin, _T& nReturn){: t. m5 K2 _# i* _; V. u
    _T t[3] = {0}; //雨中飞燕之作. q, l% w, v! V3 V
    char csym[3] = "++";
' p6 f; T0 X/ [6 ~$ f% [    int nLevel = 1, nERR = 0;& ?2 R9 Q; q) e6 A% Y
    if(!(istrin>>t[1]))istrin.clear();- `! P7 ?; q9 v
    for(;;){/ Q2 a* |! Y% }: r- ?) z1 f4 [
        if(istrin>>csym[2]){
8 g* `* v" H. C& q9 _# I6 T            switch(csym[2]){
0 R7 \  k5 ^/ e* O, S0 x+ R            case '(':
- D7 H# _1 ?, |+ e2 k/ _; u                if(!csym[1]){nLevel=0x100; nERR=1;}else
' v0 l8 Q  E! U, G6 K+ o/ ~                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;: J4 q8 V# ~; O) q7 o
                else{nLevel=0x100; nERR=1;}% ~' G2 n$ M+ ^  Y' M  o
                break;
) J2 S5 H! w' Z8 k            case ')':
/ W# o5 s0 E, o! k4 a6 p                {nLevel = 0x100;}break;
/ {* s; Z, m% f            case '+':case '-':case '*':case '/':
+ w' O8 |" v/ V! [$ k                {csym[nLevel++] = csym[2];}break;. n0 z$ X6 x; W0 i
            case ' ':case '\r':case '\n':case '\t':continue;
6 Q0 N: u7 _  y# W8 g- r            default:) W$ I# d5 s% Q6 [* D9 B# y5 N
                {nLevel=0x100; nERR=1;}
+ j. B8 V5 e  s5 a6 E            }1 c  L0 G! r. X  c$ H! P1 m
            if(nLevel==0x100)break;5 X! w$ h4 m+ _6 E- j
            if(nLevel&0x10 || istrin>>t[2]){
( E2 W) r. f5 \! K                nLevel &= 0xF;" D! ?8 ?* ]2 F- M& v
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
! L9 h! n4 o* W* l+ |. r                if(csym[1]=='*'||csym[1]=='/'){
. x3 H$ f% v* i: t                    GetExpValue(t+1, csym[1]);4 [6 F  P$ x6 z1 _  @0 a
                }
2 _7 q" y4 F( i$ E8 ], @" ^                else{
/ @6 G4 ]2 Z. |7 _8 Y" Y# |7 a5 \4 F                    GetExpValue(t, csym[0]);3 ?3 H; B$ }2 q5 y( k
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;( I* [/ O) A! Q: R! `& `# f
                }
$ `+ y" L6 r' ]& Z  B4 p2 Z                nLevel = 1;/ J+ u4 A& |( x* s8 B5 M
            }/ ?8 L7 X" G& Y0 H' T( A: p
            else istrin.clear();
" L5 G4 p9 A5 w. O- I        }! d2 b. [5 w0 M: p9 X# N3 n
        else{nERR = -1; break;}
" Y/ N1 q2 R: |( r2 o7 v    }
1 _" r) W; b" @+ d; C9 L- y    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 w( N9 e- q+ j! I4 ~/ X" L: \' |# z    else nReturn=GetExpValue(t, csym[0]);
1 `, N9 K; g% i; V+ I1 x  X" @! m    return nERR==-1?1:0;6 D" p3 v8 s( w
}}
2 u6 F1 s$ T8 Y! D2 |6 q$ B; Y2 t: c0 t0 l
, b+ a4 f" W* u

2 X; y( t9 E+ b8 E函数模板使用示例:9 R6 O9 i: [4 K3 j1 J4 A
在以上那段代码的后面加上以下代码:
# z, P! w. e; N6 J1 a/ X% q, ~) q: d0 j
8 K3 @. C7 [% \. h

: {8 N6 t' o- Z程序代码:
) D7 o0 `" U+ R. Q5 b5 v' C6 }) n2 l7 ^* j0 D; P
#include<strstream># o! |0 i+ P: c, F0 @
#include<iostream>' n4 p/ Q/ Y! H+ x( b# q
#include<string>* w# W; b5 G- p+ I
using namespace std;
2 H5 p4 v. _: i1 Tint main(void)
7 s: V  X$ i& B& |' \6 R. L- ?{( q3 Y  ^7 a# ~( [% y
    string s1;" M! p$ X2 }; s- }
    while(cin>>s1)
, O$ ?$ ]2 ^% ]% p    {
0 m' k& C  N7 g3 s        istrstream isin(s1.data());7 u! i. c4 f2 t& j% `8 g
        double d;
3 P1 u$ D! K' X% a. c- ~        if(fy_Exp::GetExpValue(isin, d))
$ h9 u2 d* z& A) w8 X$ }, q1 ~( Q        {# J. G1 i* G. y% F: J
            cout<<d<<endl;
9 G& ?% s" ]5 P! B        }
# ]8 X% |- |& s) M# I% v& ]& u        else9 \7 N) c; U  k# \
        {
: A1 Y1 F5 u; {) W            cout<<"ERROR"<<endl;
+ F: n; a! Q: A( Q) T        }
" h& X% Y3 P" c1 C9 {( k, L    }5 O* [- k1 c: T
    return 0;
; S  L/ i6 C9 y) `$ o" f}
, ?: A+ c6 t( u: ]+ [
: w9 e3 G7 }& |6 L; `# S* ?# F# n9 G" b# V% r
然后编译执行就可以了(*^_^*)
! [9 ~' r0 E: R/ n3 n% R6 R) p其它:TC++上一定编译错误,不保证在VC6上也能通过编译# w5 x' y) Q1 n& q6 m
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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