返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
2 e; f( H/ \' ^+ X( ^一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' D* M2 e2 b& i2 \8 O- u
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn): W* t2 A) w/ x; b1 S
参数解释:  l" [* V, j' T4 a5 _. b
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流# a0 n6 O+ r+ x) x: e
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
, v+ `2 |  ^! N; L0 ]2 G* G返回值:; U+ I; q- S1 B
返回非0表示计算成功,0表示计算失败有错误
. V6 M) n# S) Z) ?$ i3 q6 H' {
% a3 J7 Z2 w7 i* T! z+ ` 1 o" g" ^0 C  f) C. T

7 R( t) z3 G# N0 ^3 N& s1 _程序代码: 0 Z7 H% R. s- `# p- Y, G/ _. Z: {

, {/ H1 g8 E9 o- Z7 c3 vnamespace fy_Exp{: P1 Y$ a: g+ ^0 |5 `1 V( t& J& _5 g
namespace {template <class _T>7 ?- @" [$ x* @! N6 G# H3 d
inline _T GetExpValue(_T t[], char& csym){( h+ o* n( O/ D1 |( q! K- P. g/ L
    char c=csym; csym=0;
! Z, P- B; X0 y+ Z    switch(c){
$ X; h# t  q# Z" h    case '+':return t[0] += t[1];0 e5 h- w) J+ [9 h* c2 n/ ?
    case '-':return t[0] -= t[1];
. P- R' C9 j2 G, X7 ]    case '*':return t[0] *= t[1];* X' J5 ^2 x# J3 O0 Y# n8 G
    default: return t[0] /= t[1];//case '/':' @* L! G, Z6 O5 A0 d2 h
    }* L3 }' {; z: y4 Y
}}' `: C, e+ V" z! c
template <class _T, class _Tstream>5 G6 }) |) `. \
/* _Tstream: inputstream, _T: get return value% E! v: c6 Z/ ]) {. r% r
* Return nonzero if get value successfully */1 X3 Y2 N! g: ~8 k" z! M
int GetExpValue(_Tstream& istrin, _T& nReturn){! g4 b0 u# D7 ?
    _T t[3] = {0}; //雨中飞燕之作, w7 m6 v  y  e4 ]5 x: @1 S9 b6 q& ?* B
    char csym[3] = "++";
% u! p# _0 E& v/ N8 t2 u# t4 [    int nLevel = 1, nERR = 0;- n4 ], w; q  T
    if(!(istrin>>t[1]))istrin.clear();( |9 R. n3 B( ?2 J2 S; H4 Z) a0 U
    for(;;){5 E% m& r; y) }/ ]) ~
        if(istrin>>csym[2]){
3 p' k  N% H5 w4 d7 \1 a6 }( R            switch(csym[2]){
; e0 ^: U) n. _2 j$ U% Z            case '(':
% |- Q4 K7 c7 D6 S0 }9 h$ l$ W+ K                if(!csym[1]){nLevel=0x100; nERR=1;}else
! L: u: o+ r: F) _& G                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;1 \$ C7 r9 d" w) k- N( X) r  Q0 H
                else{nLevel=0x100; nERR=1;}
4 s; |+ c$ y  V& Y6 w) V                break;
7 O+ F+ K/ u% M7 ?9 F            case ')':7 l# T$ f0 I8 z* ^- z
                {nLevel = 0x100;}break;6 C0 E' [: n9 i4 h0 t
            case '+':case '-':case '*':case '/':9 u; {9 a$ W0 |" o
                {csym[nLevel++] = csym[2];}break;
. G, W2 L2 c  @! N: p- N            case ' ':case '\r':case '\n':case '\t':continue;
8 l. W' J) y# Q- x7 n            default:
. |) m* I; e7 t9 {. S. L+ S                {nLevel=0x100; nERR=1;}
2 J& ^# I5 r$ j$ F            }$ {: H( [. I( Y. E0 C
            if(nLevel==0x100)break;
6 N- @( O% E5 ^: `" ^            if(nLevel&0x10 || istrin>>t[2]){
$ F; N# |" Z  G$ w: c                nLevel &= 0xF;
/ G; T& i. V+ N/ W2 g* A4 C                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}- Q2 b- R9 c4 j- {$ O) u
                if(csym[1]=='*'||csym[1]=='/'){
) s- N) H" C3 G& ^                    GetExpValue(t+1, csym[1]);* D9 m' Q$ S# j+ K; b
                }3 n& L; w' L7 J
                else{; x# `/ Z" d% g: q3 E. i
                    GetExpValue(t, csym[0]);  h3 @$ U' E6 B+ W
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
1 U2 l. u# C/ l9 Q' i3 Q# y& j$ _                }# j% c" N4 D7 I! a  f
                nLevel = 1;
/ c5 G7 _4 ?7 ^* c            }* b/ z3 T- B; n+ ^0 i% q( i
            else istrin.clear();8 c* ]4 D8 |- ]* x* x* x! W
        }
: U6 s: o+ a9 j5 b        else{nERR = -1; break;}
! B7 ~( q6 R7 N  e' F! e0 p3 a    }* L0 k& L4 Q7 U8 V9 g
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);% V/ G' M8 A" O4 h. F0 _
    else nReturn=GetExpValue(t, csym[0]);  S; j. m; b. Q2 i3 {
    return nERR==-1?1:0;
; n) ?/ E' N4 Q, S8 C2 \}}6 f" a* G- t. Y# Q1 z* t
9 R5 `1 I* x; U4 c
4 x" B5 C: n5 x5 c" E5 ^
# r  C# g/ c. B, w9 d
函数模板使用示例:
0 f7 ]! }4 E/ m5 [在以上那段代码的后面加上以下代码:3 s& q8 P2 N; G  U9 A

% Q( @- g2 b- l, {! i' L8 b1 M
; p4 R# v' L# N' t7 `4 c8 Q7 U, K* |( ^: s: y2 d& ^
程序代码: ! g3 R9 w  e5 g

4 a3 I! u6 @" t# D#include<strstream>8 ^- |3 V1 B' b/ e
#include<iostream>! y/ F' R$ y; F0 D
#include<string>' N' H- R( b* x& g
using namespace std;
; G' c0 B, l& b# ~8 O' h9 Eint main(void)
$ D" ]6 ?' h) l0 a& F{& z* g4 U; E9 [) ^2 p3 ]1 |$ P
    string s1;0 ]/ u' W% D, j; J" c6 D
    while(cin>>s1)  X3 x# c1 S* ~, |
    {
* T  z8 I$ g1 x7 Y        istrstream isin(s1.data());3 h6 G( ?2 {( R2 [2 w
        double d;
; Q" H6 ]4 U! A( D( r! n3 K        if(fy_Exp::GetExpValue(isin, d))7 l' A& {/ l5 s) x5 q
        {
4 C: _, U) O8 P$ @2 B; V: U            cout<<d<<endl;
0 j9 n+ h2 T: q9 x# e- ]) u% j        }
% Q; a8 A2 G; G- Y, e        else
3 D  o  h1 K1 R        {* T% W- M/ v$ ~+ y' R( Q3 Q
            cout<<"ERROR"<<endl;
% c- \+ R5 |. Y: {6 z4 v. l2 Z        }  i3 y6 w# x5 r5 W0 E9 e, s2 u
    }
5 }" Q7 k; |! l8 Y3 ?6 C    return 0;
: _, j) H: B8 ~' S4 _- Q* l}- V8 A2 k% @; |8 u  \: Q

* ]3 p  }) H* ]! c( v
# ?/ @% l% s" p5 Y6 }: W4 Y# u, q( f' G然后编译执行就可以了(*^_^*)  A9 r" s6 e# r0 V8 C: t: |
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
9 P" X) D/ m  S& x# M" K      建议使用VC7或VC更高版本,或者使用GNU C++编译

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