返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,+ y6 ]& {! }8 v2 j8 R6 N0 I* ]" d
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式1 @, P! }3 d/ ~  R$ P
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)" f$ t0 C3 y- H; |. }8 u# @
参数解释:
8 p3 R1 ^5 `+ Eistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流/ d# v! k1 ~6 i8 g, C
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定* o+ Q" C5 ^' G( \' N
返回值:
& S% g+ r& L& f返回非0表示计算成功,0表示计算失败有错误
+ z0 i) p/ m% D
" p9 i/ p# C: C- ^7 b
3 A5 _# A3 Y6 g% }5 z6 k
1 x4 H" e6 M% E, X, Q程序代码: % t6 t# O! G# g' P# c  P
# H) |) A1 G/ z$ n$ q
namespace fy_Exp{5 g5 M) d1 B3 Y8 Z; s# E/ p7 Q
namespace {template <class _T>
0 a1 G! r; B  y1 k( a* O8 B; Oinline _T GetExpValue(_T t[], char& csym){) |) S* ]5 u1 s8 @( O. b
    char c=csym; csym=0;
7 @9 P& [9 |2 J    switch(c){3 z) f' `3 A* z' Y1 G! r
    case '+':return t[0] += t[1];& [+ Z+ F0 u$ B- K3 l6 r% E4 H3 D% c; J
    case '-':return t[0] -= t[1];
: I  X% o7 B. ?( a% |6 B# |- x    case '*':return t[0] *= t[1];( B1 X  y$ y3 u" h1 u9 x
    default: return t[0] /= t[1];//case '/':! N3 ]# B& J# {/ X7 x) X) x% Z1 ^
    }4 i* T+ Y( p+ j8 z3 G4 p% _% f
}}# S3 G" q5 Y( S
template <class _T, class _Tstream>6 B$ \. W9 X( W- B' v, Y3 B
/* _Tstream: inputstream, _T: get return value$ b' N: ?# S7 `# k# H) k8 V- N2 v- O
* Return nonzero if get value successfully */
) ~1 |; x. K( j; ^% Q# }7 Hint GetExpValue(_Tstream& istrin, _T& nReturn){
; K$ m& ^& y# D+ R+ X: k    _T t[3] = {0}; //雨中飞燕之作
9 {! k. J( s8 S& h2 g8 d    char csym[3] = "++";
/ ?$ g4 t0 o6 z4 W! ~    int nLevel = 1, nERR = 0;
) a$ e( f: W: l% `5 [( c    if(!(istrin>>t[1]))istrin.clear();
* t9 K2 k5 T) f  `. W6 l# u4 L! g    for(;;){5 a' P$ |' ^& L. v6 W1 J# e' Q3 C: b
        if(istrin>>csym[2]){3 _5 V5 i# _5 p
            switch(csym[2]){
. V+ E0 G0 H& f/ b            case '(':
# J$ f4 E3 V: B- m' a) r/ v                if(!csym[1]){nLevel=0x100; nERR=1;}else
$ F# C$ S& ]2 J                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% q2 G4 t7 P" [  ]( O
                else{nLevel=0x100; nERR=1;}
' y# j' U6 W9 h+ W2 Q3 j* |                break;8 ^/ f8 e2 P5 b) M
            case ')':
: I  i& s. k6 p* |                {nLevel = 0x100;}break;
; |2 T& n+ u  N. Z5 n( C            case '+':case '-':case '*':case '/':6 \. z; k9 A8 ^% h
                {csym[nLevel++] = csym[2];}break;! [4 g% s- b& J  x$ [
            case ' ':case '\r':case '\n':case '\t':continue;) W- U; O) {8 Q; u: x
            default:. i' d' J' ], k7 R/ y( }
                {nLevel=0x100; nERR=1;}) |5 j/ d1 e2 i9 G' i
            }
. y' E) w% M3 i8 y' c4 e            if(nLevel==0x100)break;
4 ]" l5 d( I$ O- Y' R+ V            if(nLevel&0x10 || istrin>>t[2]){$ B7 d) L8 D' |+ d; P7 @
                nLevel &= 0xF;
1 _5 P) F$ d6 d# F: q                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. N  D6 |3 x1 @2 o) f
                if(csym[1]=='*'||csym[1]=='/'){
( V5 P! E, I7 U  Y% d# ]                    GetExpValue(t+1, csym[1]);
; h/ ?! P* Y' V2 m9 w) T                }
" F- L7 F6 ]3 o9 V. f( B                else{
0 r  g( P. p: l  X* c2 \                    GetExpValue(t, csym[0]);$ ]5 E) u+ l' e# b, F% W0 g
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
/ x/ K. C, j. v0 }& ~- @. J                }( C  U! G& h2 {; e! k- r& x
                nLevel = 1;/ C- P) S3 Y6 g* c) V$ N
            }- G0 b+ `/ E! O: z2 h- r
            else istrin.clear();  n/ U, P3 V+ U  R  Y8 G
        }; ]9 k* y$ E, m! O1 i7 i+ J
        else{nERR = -1; break;}6 _/ C+ t! z$ a, p# z
    }
! w0 A; t0 q% k/ r* `4 L$ S) J    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);' P$ ?2 N! J+ E( ?( V. f1 n
    else nReturn=GetExpValue(t, csym[0]);1 O' H* c3 r1 n
    return nERR==-1?1:0;
- Z8 x' w7 x$ {7 S}}
0 {" i0 a9 H* q, i  ~. X/ h& u; m+ M
1 _2 m$ \, u9 J4 o
9 \8 j1 g5 d6 R: V
函数模板使用示例:
( \8 Z8 l& p7 t7 t  k0 C% t在以上那段代码的后面加上以下代码:4 q8 ]/ C) i% }6 s8 r4 M- \/ w
6 X9 [& t* O7 I8 a

+ t1 Q: K5 D: t" I  o, H$ _4 D' r: |; S! }7 b' m
程序代码: % N( C  v, A( D4 c7 q6 ~
) p. C. {: d, y, L$ t' S  H
#include<strstream>
3 D) c( m! P4 [& I4 _. V+ n5 R& u#include<iostream>
$ n* y# J# Q# q' r! u. P2 x) H. {#include<string>
  K1 s3 N* u' i( _1 ~; @! tusing namespace std;; a3 `# y; N* M- p' F6 y! h. q
int main(void)- [3 q) c, ~, V
{) d" n5 v" w9 G
    string s1;7 Q, [& n! k. b# g5 g3 q6 N
    while(cin>>s1)' F$ J% Y: d4 q8 V; J
    {2 Q+ K1 `5 u; u, p, d9 G9 `
        istrstream isin(s1.data());
' z. [& L& J; K" h! }0 c4 m        double d;+ D% m, A8 f( J# w
        if(fy_Exp::GetExpValue(isin, d))$ d" J0 v9 g% x- ^( [
        {
3 D& C) [& X9 {2 X( O2 V            cout<<d<<endl;
% m9 `7 y7 c0 A4 s. T9 F4 `        }8 F$ V" U* [( B& c8 h* k. Q
        else7 z+ k4 I4 O- J6 y6 A
        {
0 Z/ Q: \6 B1 ]# K            cout<<"ERROR"<<endl;
6 Y1 n# E# u; _8 P' c2 y        }
8 N; I: Y1 v9 G3 t    }2 R9 K7 h  o6 j# j) x) {
    return 0;
% P9 G( e5 H+ _6 T}
7 \4 J" b+ \  i& A% ~' E6 S  N
- o0 o: }$ l  a1 y/ {. T
; i( H5 J8 n* n8 v+ m0 E1 l然后编译执行就可以了(*^_^*)
8 _. W- e- [% x& a* k其它:TC++上一定编译错误,不保证在VC6上也能通过编译
& ]9 Q) e0 s) v/ {7 w      建议使用VC7或VC更高版本,或者使用GNU C++编译

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