返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
2 I0 R0 }+ @: ^+ C; T1 o一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
9 y" v: r, l) G/ I- G) K只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)$ a) O: e5 j9 z. J
参数解释:
$ h! U3 l) p: a7 a' histrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
1 H* S6 v) c. R2 M2 |# b: q5 ]* gnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定* c6 B7 X# F4 U: N# ]+ \) k: z
返回值:5 K; o* I+ j1 o$ d
返回非0表示计算成功,0表示计算失败有错误5 ~! ~# o+ V  i* f0 b

, l1 u1 c! G8 d4 S9 S$ m( k
: R% R/ C, g" k- I: m" G! m1 ^5 [: g( n8 F) g1 {" e- H6 g/ k
程序代码: ) B% [# ?8 C. ?2 ~( [

& R$ m! G' j2 c. _" S7 A/ x2 G+ tnamespace fy_Exp{
$ b4 i" _1 d" B7 p" P: G% tnamespace {template <class _T>  c/ E0 q+ f' E/ s  u
inline _T GetExpValue(_T t[], char& csym){* ]; h5 B3 s3 y- R3 B- K, t
    char c=csym; csym=0;( \8 n0 G! y) T2 K5 E7 N
    switch(c){
9 H1 u( [% W2 c# i% X    case '+':return t[0] += t[1];
( s, l' s: E8 _, @5 S    case '-':return t[0] -= t[1];
5 T; |  I3 r4 @8 p. ~' @0 o    case '*':return t[0] *= t[1];/ @' L+ |3 u+ ^: q
    default: return t[0] /= t[1];//case '/':
* K* P2 x' h% y: g    }
0 L( _& N  W# P% q2 H6 b}}" B7 ~2 c3 M, f6 C  f# y* O
template <class _T, class _Tstream>
" i# O( I, A. M! H/* _Tstream: inputstream, _T: get return value. b; w9 \& K" G/ J! X1 @/ [
* Return nonzero if get value successfully */& x$ k! O' [, P# \
int GetExpValue(_Tstream& istrin, _T& nReturn){
  i- D% U) v; X& z2 d" e8 w    _T t[3] = {0}; //雨中飞燕之作& {. e" u& w! u5 p+ x$ M6 ]
    char csym[3] = "++";
; R# ]/ k8 r& p/ @$ g2 \( X; T    int nLevel = 1, nERR = 0;
6 ]$ z- S: d; b. D8 C! H    if(!(istrin>>t[1]))istrin.clear();
5 I4 n5 Q# [! c, ^/ S# n& A    for(;;){
# [7 w2 X6 a$ `4 f" m        if(istrin>>csym[2]){1 C' L2 Z5 L) |% u
            switch(csym[2]){+ B/ E8 M5 J* B  _4 J) s
            case '(':
( G. o( R2 g7 r6 s- D; Y) a" c3 o) w                if(!csym[1]){nLevel=0x100; nERR=1;}else( G8 e7 c: ^9 k! o
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
0 C# E* L7 w; y$ O                else{nLevel=0x100; nERR=1;}
. y% [2 |+ b  C1 @- Q  D0 U2 z: z) u                break;- a! K$ ^) m( l- o" c
            case ')':
5 O, `# e( T+ m# u2 M                {nLevel = 0x100;}break;1 r# d; g" d/ B6 U( x/ h! j
            case '+':case '-':case '*':case '/':* H# t$ T( r* e" z, X# O3 H
                {csym[nLevel++] = csym[2];}break;
2 Z+ ^5 U: \* X- ]9 s            case ' ':case '\r':case '\n':case '\t':continue;
, P3 G7 x. g$ O. |( u            default:
' @3 x/ o% l) U' [6 W: r3 x* l                {nLevel=0x100; nERR=1;}
3 J  N& ~& t$ }  r            }
& K; K9 ^$ K3 M; O1 |3 ]; j            if(nLevel==0x100)break;
6 r3 x) d/ E2 f( S            if(nLevel&0x10 || istrin>>t[2]){& n6 I  `* W2 y; E8 ]& I
                nLevel &= 0xF;
# a' P$ A* o9 m1 J                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}- m+ p  t# b$ p
                if(csym[1]=='*'||csym[1]=='/'){
% V  L! f. e5 l* K+ `/ z                    GetExpValue(t+1, csym[1]);
& L1 S; Z0 m- s' C                }
5 I3 n' R. ]$ i1 f7 ?; Z                else{
$ ~5 _) v2 C/ i1 l                    GetExpValue(t, csym[0]);- [) f- ~' Q; `3 I) }: l3 K* w5 q
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;  H6 h6 H- D1 q8 I
                }
! n" x+ d4 h1 X                nLevel = 1;
+ |3 a- R; ^" _: L& r            }
9 s* D" t/ c( U+ Q: K9 u            else istrin.clear();
+ L: A8 a- p& ?' X% Y) y        }% l0 \( k5 R: q
        else{nERR = -1; break;}- t! F, O- h8 B3 F' N5 L6 U5 U
    }
5 z& u: u7 ?9 C0 i% V0 \. T8 ^2 N    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" I. W( X& G1 Z    else nReturn=GetExpValue(t, csym[0]);# s1 R6 m1 @% I; W# w: F- n6 q9 g
    return nERR==-1?1:0;
, e3 w: s, h( k}}/ R; D/ P* n; G; E$ e" Y0 A1 b

9 Y' ^$ S# U! h; Q( r/ _: r' B* `( C: x3 P. {: l, ]

& T! n2 o8 [* ^2 c  o函数模板使用示例:6 b% s' m* j. o. v+ e% p4 W
在以上那段代码的后面加上以下代码:( Y- m% K& U& C$ k$ G
2 T2 Z6 r, n) j/ Q) D

+ [. A+ w5 s' a. a# o' l7 d4 \% b1 `. Z% D6 k. o
程序代码: ' m0 s3 m9 S$ c3 C2 E) Z+ C

7 s. r! n$ a; v1 z' J#include<strstream>4 R% u( L3 L5 b$ r6 m; G7 ^
#include<iostream>
5 v& b( r/ k+ g9 z. `, r* r#include<string>! j: O5 v$ |+ M3 d2 q* v0 A
using namespace std;) _! A3 f  R9 g* g3 g
int main(void)8 c- t) r* v9 s0 q2 M. T( x
{
1 V1 i! ~! R( F6 j    string s1;
2 [8 R, Q0 n9 v7 W: L    while(cin>>s1)7 U0 x+ H& m, V6 g$ {
    {
) C3 X0 p: C% c# w# c9 q) [6 p        istrstream isin(s1.data());
  w, a1 `: r/ {, g- @& T        double d;; a- A# t" k1 B& L
        if(fy_Exp::GetExpValue(isin, d))! P) f' T, s' ^& a& B
        {
& ^1 `, k0 V! ~            cout<<d<<endl;% W6 D% H* I7 H9 b7 {+ J
        }( I9 t0 F' O7 b* G# O
        else
) ?: e- B- t9 U9 j- Q% J: Q        {7 y4 R) r$ A8 G4 i8 F% v5 S
            cout<<"ERROR"<<endl;
. P* t/ V; T! \" H+ p        }. w; A5 f- v- @( ]+ f
    }% H' J2 V# K& U! J3 P: f
    return 0;& w: U3 q& j1 L
}1 }7 v' @4 n3 `5 M6 g5 l

2 G7 [0 F- l3 g
' N6 G% E/ Z, f$ G. Z然后编译执行就可以了(*^_^*)/ @, E7 \8 ^$ W! Z( s# z5 t" \
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
3 h1 s/ s' z* [: k$ f6 N      建议使用VC7或VC更高版本,或者使用GNU C++编译

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