返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
" J9 H- s6 g* e6 ]% k3 h1 b) i! s一个很方便的函数模板,可以并且只可以计算含括号的四则表达式9 b! |# \, S3 v5 b
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)9 _! T( B& f. }2 k  |: P' b- j
参数解释:5 K: n+ @) ~/ x& F5 H( F  t9 U
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流& S( W5 M' R; l
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
. z, f& O4 S# q+ q# {, h7 @返回值:2 S6 C! T" K0 e. g8 |' H
返回非0表示计算成功,0表示计算失败有错误6 U' ]* o* k. p/ Q* K- G

0 H+ g5 f  E% W, d, |& n
. h4 I# x9 u! f& \3 n$ i) g; G# G. G6 o' O# @0 [6 E
程序代码: ) k3 |3 c  W$ c% M; V
3 A& W" A: |4 s  M8 }' ?
namespace fy_Exp{
2 [' J$ N! a( p2 h: N/ @namespace {template <class _T>
- s+ u4 G1 U8 ]7 M' S" |) w, @+ B- Sinline _T GetExpValue(_T t[], char& csym){
) h5 Y/ u! T7 S0 H) U0 P    char c=csym; csym=0;, }- u( f4 W; j( l* u5 p
    switch(c){
. C6 D  Q9 {6 v    case '+':return t[0] += t[1];( h- }9 C5 m" V- Y8 }1 f
    case '-':return t[0] -= t[1];
+ n! ^3 n, J3 t6 J" s& g    case '*':return t[0] *= t[1];
+ V; t4 e  k# i    default: return t[0] /= t[1];//case '/':
/ W) x# x: G. Z- Q5 V    }
3 e8 ^0 B  R" p; H0 {2 {6 r) E: C}}
. T7 k* B- R3 k3 c% Ltemplate <class _T, class _Tstream>& U  a6 @8 G5 i* @* B5 C  h
/* _Tstream: inputstream, _T: get return value2 I7 x3 U6 u8 n# R9 ?  g/ g7 [
* Return nonzero if get value successfully */
  b0 u+ V4 B# [( Q6 Rint GetExpValue(_Tstream& istrin, _T& nReturn){
/ h" I4 D5 D  ^% {; \! S" e    _T t[3] = {0}; //雨中飞燕之作
( Q" ^1 f: v% u! H2 l, U+ V' z    char csym[3] = "++";$ U9 \; Q3 f6 ~$ F1 I! k1 X1 G" x9 t
    int nLevel = 1, nERR = 0;( U% n3 L5 c$ Y. R! X9 G
    if(!(istrin>>t[1]))istrin.clear();
8 |5 C% y( ]8 t) e; o' w. w    for(;;){
7 U9 {' T0 s' S2 r        if(istrin>>csym[2]){
$ F9 t& E% l: f0 b" U/ v            switch(csym[2]){2 O/ d+ \! w* h  b0 Q% ?
            case '(':
* |1 B9 s. r+ l5 L                if(!csym[1]){nLevel=0x100; nERR=1;}else. P8 O- `8 {+ v% P7 D0 ]" w0 o
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ a2 u0 _# n# j" O5 P7 R8 ]# D0 a                else{nLevel=0x100; nERR=1;}
# {+ x  j- w3 O                break;
' Q# o1 r& O7 D            case ')':
4 \2 Z( @+ x' B; ?8 r8 v+ [                {nLevel = 0x100;}break;0 w2 B0 M) J* b) l* q
            case '+':case '-':case '*':case '/':5 L" u6 B' l' C0 Q
                {csym[nLevel++] = csym[2];}break;
( D1 D2 {8 W4 T            case ' ':case '\r':case '\n':case '\t':continue;& J/ h, {$ q/ C: a8 H% h  G5 f
            default:; K& v; X( [/ R6 `5 h. Z2 n
                {nLevel=0x100; nERR=1;}, i2 x; M* n9 T# J* n3 W0 |- }
            }& H5 `/ [' q) Z2 X* U6 _5 s
            if(nLevel==0x100)break;
# ^+ b3 _* p% y9 q( Y3 w            if(nLevel&0x10 || istrin>>t[2]){$ q% [; p- t5 x: {8 x
                nLevel &= 0xF;6 s7 y1 {! Y3 b+ _9 G
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0 {9 F2 b$ b" g                if(csym[1]=='*'||csym[1]=='/'){. l6 w  K  U# ^1 z- k
                    GetExpValue(t+1, csym[1]);
, ~1 T1 K/ G" ?3 [, a4 i                }) ]. z# |+ W  o" J" }
                else{0 r& \) t7 D3 r/ c! `) e" d
                    GetExpValue(t, csym[0]);% N: B# z/ h# N. ]* S
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;4 H- e" A6 Z- v5 n
                }+ S6 p7 P. ?6 M2 i1 u1 K
                nLevel = 1;
  U  n$ A8 \. P7 i; `            }
$ p3 T# B( w0 _! X. X            else istrin.clear();
: q0 d7 M/ C1 p6 _- E; s, G7 Y        }
0 H; z, G5 C  \, i* Z+ G        else{nERR = -1; break;}
- p3 f2 A4 Y0 A# ?% B# h    }6 ?( W2 O1 E8 V- Q; o- Q) e2 s
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 P) N8 E/ c+ `/ w    else nReturn=GetExpValue(t, csym[0]);  k6 q9 @4 g# R7 X& B* v
    return nERR==-1?1:0;
( Y) [+ D! o7 L2 A, ?}}
* L$ Y/ h$ ?; [; y5 R4 i; O1 j9 {% \* ^& H) e7 N$ [2 b# f

* P# Z) [# T! r) [
5 g# x% @/ k7 G) I$ k函数模板使用示例:" x  q) `! T# {1 ^% P  Y# }6 h
在以上那段代码的后面加上以下代码:
. \) W( U5 f7 B* H8 d& M8 h' Y% r5 ]  H* j9 H: K$ {1 g$ }
' @: c8 F( g. H3 x) }- M
' O- k9 A3 I6 @: y3 |0 Z4 q
程序代码:   r* u4 A, P# t! s/ q, y

6 M0 n& N2 F( D0 r; s4 P% G6 x; U2 J#include<strstream>
* @0 x3 C4 C7 T8 o  ?$ ^#include<iostream>* `% S6 v" r. d( @) k$ k
#include<string>- P2 ^6 J/ X3 D: F5 m! C; s: K
using namespace std;6 l9 U  r/ O% n  ^( e+ m
int main(void)
$ G( m! w1 Y% @% ^" A& Q{
) A, n, B! H% A+ V    string s1;
# R: v% P& }: i$ X    while(cin>>s1)
8 q: Y2 B( C8 N' ?) J    {7 ^9 s9 O& r% ^4 m
        istrstream isin(s1.data());
! L/ G* {% W3 v! Q2 B0 l        double d;6 N( f. I) M& M8 N& W/ g
        if(fy_Exp::GetExpValue(isin, d))
( Z8 r. ~# o' O$ n( a! L) ?        {
- i1 t3 y1 k  u0 M) O6 u6 T, q            cout<<d<<endl;
4 A( X* m* y3 @* F: N7 v        }9 W1 K0 R) [  n  n  c
        else
& P4 N7 q0 t( R        {" e+ I8 g$ `1 q
            cout<<"ERROR"<<endl;, ~: s  g" D' |7 K8 z3 \
        }
8 I; N# [- D" }& C    }
& V" j, b; h0 Z( G- H! o    return 0;
1 d3 A( I2 @. N- ~4 Z}
" X& a. r' F1 u9 P5 T
& y0 b8 o7 e0 z$ E, {( h
8 m7 C/ h6 k9 X, n然后编译执行就可以了(*^_^*), e  X5 r! J! y* m: {. f
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
) {, J/ s) o1 e/ O& [; H% J      建议使用VC7或VC更高版本,或者使用GNU C++编译

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