返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
6 x: f0 O+ ?7 O$ S# f8 P一个很方便的函数模板,可以并且只可以计算含括号的四则表达式+ W# `% S7 a  E+ }7 x& E
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
2 h% {$ A9 s0 J- d; M2 G参数解释:
$ ?* K* l! z+ }0 u3 o& yistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流" w" z* K. l) m9 Y/ b0 H1 H
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定: q' ~/ t! |* _$ T
返回值:
8 O# T3 I* l! s1 _返回非0表示计算成功,0表示计算失败有错误* {' N' I: l1 \& K0 c) i
$ l& T6 v* E# q8 G. w# h

0 Y/ m. S( ~1 K
/ L) x' C4 ?' `: ~9 v程序代码:
% E2 p+ P/ \: T4 C3 |+ t. Q
4 I$ l5 v7 r" f% S, ]$ J) k$ \3 mnamespace fy_Exp{/ E( \5 w* E: C# u0 ]
namespace {template <class _T>
+ e" J6 u& Z- `" d) Xinline _T GetExpValue(_T t[], char& csym){
8 y3 x8 D4 \" `3 P- [) s) A) i3 u    char c=csym; csym=0;
& I+ L' i2 l: f' W$ a) M    switch(c){, k% ]2 w$ S3 h3 q3 ~- A
    case '+':return t[0] += t[1];4 M: J  U& Z# |5 O: S: a0 z5 w
    case '-':return t[0] -= t[1];+ ~2 h8 S1 F( Z2 l) w
    case '*':return t[0] *= t[1];
' y& B. V: X8 B7 |) S) P, L" ]' k    default: return t[0] /= t[1];//case '/':. h/ \) T  p7 N
    }8 l  w( o( H( v) v7 X
}}) c- A4 n# S! |' b1 K1 V' C) I+ o$ S
template <class _T, class _Tstream>" P) I" h# _8 d/ Y; M! |% m
/* _Tstream: inputstream, _T: get return value, C! }4 r& ~# m5 O: S) y, f
* Return nonzero if get value successfully */) p1 w: ~6 Q# W* o" `
int GetExpValue(_Tstream& istrin, _T& nReturn){
; S) l  _; ^$ A8 H' X    _T t[3] = {0}; //雨中飞燕之作
' [+ C* M; D- _% m6 p& }) a; z    char csym[3] = "++";
3 y5 g7 b1 f+ A: k/ p: z& c    int nLevel = 1, nERR = 0;
9 T2 {# c1 ]1 K# g! O# X. g    if(!(istrin>>t[1]))istrin.clear();
. w2 ?7 }% c, {. N1 P. q5 R$ t9 i: B    for(;;){  p, Q( U0 |7 Q  Q3 E, s
        if(istrin>>csym[2]){8 `7 q# w  G1 k" w- a5 o- Z2 _
            switch(csym[2]){) H8 `' U  w& `' D, B8 m
            case '(':' j9 \( m- h% a1 S( Z9 |
                if(!csym[1]){nLevel=0x100; nERR=1;}else
' e- \6 u$ n% g2 Y- x8 `. E$ i                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;: X4 i. q, `2 ]4 z
                else{nLevel=0x100; nERR=1;}
/ D. D+ H  V$ w+ ~+ D/ L% ?  u                break;$ h, S0 K. `4 |! [+ q4 }
            case ')':
& e8 W: Y/ v: w' B* p                {nLevel = 0x100;}break;
; V' X6 C$ ?( _# r" I1 g1 I& W            case '+':case '-':case '*':case '/':2 Y; g+ q8 V: J, M
                {csym[nLevel++] = csym[2];}break;
' t; o' H9 q) q0 r: T' J) N            case ' ':case '\r':case '\n':case '\t':continue;; H. S( U7 k2 i: p9 u
            default:
. e, M1 w; A5 C1 J- N& p* t                {nLevel=0x100; nERR=1;}' X; L7 e. |1 p2 \% c: D
            }
* F; L: u& \0 j+ y; z            if(nLevel==0x100)break;
; ~/ e3 x. h$ k, M8 |6 n; G- f            if(nLevel&0x10 || istrin>>t[2]){$ u6 @4 c  x/ o3 Q9 t7 e
                nLevel &= 0xF;6 U4 }6 r2 S" h$ r( Q2 ~
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
: z/ q$ X# @) B5 a6 c/ G                if(csym[1]=='*'||csym[1]=='/'){- A; n% M2 L5 v. P: p3 S$ Y
                    GetExpValue(t+1, csym[1]);
" c$ ?  t/ B- ~' n6 |( K                }* g: g' T+ S5 g
                else{
: c4 t2 f9 R3 i1 k$ Y& i4 I                    GetExpValue(t, csym[0]);' P" }  v  J7 j7 Q9 k
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;3 }( }& i, Q$ B% R
                }
" a- i) f) h& D                nLevel = 1;' D( ~( {4 a( R3 i: |. P, s1 M
            }
; U/ {6 I# G7 r            else istrin.clear();
+ C7 t0 ~* Y0 n6 K, s' n        }/ F/ {, j! ^; ]2 X2 g/ c+ }9 t
        else{nERR = -1; break;}
, F  X( g3 _& j5 i! `    }
0 T7 u( x- F$ {+ z5 J: w) p; J& c    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
; m6 j& o9 ]' w  E  j) k    else nReturn=GetExpValue(t, csym[0]);
4 p7 ~+ z0 p( m% e. Q! i% h    return nERR==-1?1:0;0 o! k* {6 |7 I' _" _% i- b- E
}}
3 Y1 ], _' P: @, X6 g3 q( E$ p) w. `

) D  |1 T: Q# B& x' W! d# i6 `! I  {! e+ A6 M) N8 M
函数模板使用示例:
3 H* L) C, x5 Y8 t! y: T. ~/ i在以上那段代码的后面加上以下代码:
2 A! K. i, ?2 w( [; Y, R. A8 n. F' x3 g, b1 r0 I
- m9 u9 ]: {+ B. \1 I" i' a

. k- G$ S4 w* k; |- x程序代码: , y: U( e% h3 t2 V  o1 d

* ]8 G( B1 N) L) c( o/ A#include<strstream>
( p* O# s' T1 Y" C3 O#include<iostream>4 ^" R& W# n* O1 K8 W( {# K) Z+ J
#include<string>
  r) t; e1 a8 \  A, R2 J# `using namespace std;
! N+ B- ]& x8 a1 w# @+ Fint main(void): Y* ?% y3 N' a# ?5 B
{
3 a* z, n; O. u# B    string s1;
9 _/ [$ z+ N; ~: p! v2 N+ A+ u    while(cin>>s1)
3 i/ H% j* B! k( m# I% A. q6 i    {$ v3 @3 J: c* j& M. F
        istrstream isin(s1.data());
* Y% P7 _1 t( d& E        double d;
8 ~8 m4 S! Q  m& i0 X! [" [        if(fy_Exp::GetExpValue(isin, d))# S: _$ r8 `8 F5 e8 O
        {
* _% n* J( U- o$ H. L# {            cout<<d<<endl;
# C- _8 T! s# N4 K        }
( e0 g: z) J' y- t( [4 N" O7 b) ^        else
; r6 p8 D' o0 q) I0 g        {
+ f+ @( ]5 o! W+ T            cout<<"ERROR"<<endl;  B$ A) @# ?) R
        }5 K; Q* f. X' }7 A$ B9 B
    }  ]- R/ m! M2 a% `' p' X
    return 0;- Y  t( o- G$ d
}. l; S6 c2 \$ B5 b/ L& ?

3 g; Q0 n# R/ A+ g
% G; J1 A  |/ r* e然后编译执行就可以了(*^_^*)
2 i" N* X$ y( v2 x$ e: W其它:TC++上一定编译错误,不保证在VC6上也能通过编译
# `: ?' I7 u6 ]; Y0 Y" B& p      建议使用VC7或VC更高版本,或者使用GNU C++编译

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