获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
9 E9 g2 ?/ ]. @  ?# I. u, d一个很方便的函数模板,可以并且只可以计算含括号的四则表达式0 K) ~3 A- R8 k( m
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)6 \  J4 ^; [1 t; q) I3 g
参数解释:4 Z4 X* q7 ^% _8 m8 k5 q% Q
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
$ T) f; _+ m" F6 ^: p$ LnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定# K% B% I2 N: {4 J" _- p% }
返回值:
# M# D- v* G$ r, C- N返回非0表示计算成功,0表示计算失败有错误
9 i4 P( d& G# {/ W( i/ \( C* ~/ H- f0 L( O3 f( i4 w# P
' B8 i/ O+ `1 J" Y& q+ g1 O4 X1 g

2 L  J7 w& h& a  K3 E0 [程序代码:
6 z5 o' s# @/ F2 L- L
( b/ A6 I% v6 Knamespace fy_Exp{1 s* S! v0 v4 w- F( E2 k
namespace {template <class _T>
! d+ a. T  o* Xinline _T GetExpValue(_T t[], char& csym){
) q1 L0 O. m$ g1 `    char c=csym; csym=0;; _* S4 J' O& i4 }( O" Z$ L
    switch(c){
) m' o  w/ Q1 i+ S6 u0 Q( z    case '+':return t[0] += t[1];
* Z0 d7 ]3 e8 C, ^; Q- L6 r" ~3 G    case '-':return t[0] -= t[1];
% ]- l) |9 n- n    case '*':return t[0] *= t[1];
4 E4 P1 p" W/ u! S* @8 W- u    default: return t[0] /= t[1];//case '/':
8 q( u8 t! \" u5 y" g4 K3 T: H    }
* u3 m& ]( a3 Y& M- o& [% z# t}}2 Z/ J1 o! X) k2 R  u
template <class _T, class _Tstream>2 N7 B% M& X2 e) V( v: {3 U3 C
/* _Tstream: inputstream, _T: get return value2 V0 o6 E9 ?# N( e) @
* Return nonzero if get value successfully */
; v, |: N6 j3 c; ]; R5 E# `3 n/ Qint GetExpValue(_Tstream& istrin, _T& nReturn){( f* ?/ \6 h9 P  n6 W% Y, p3 g
    _T t[3] = {0}; //雨中飞燕之作
5 D0 }3 z2 o' Z' [6 B/ X    char csym[3] = "++";  f' Z( b' I* g5 U' k- Q
    int nLevel = 1, nERR = 0;
+ m1 p/ g* a$ I- }: H1 m; O    if(!(istrin>>t[1]))istrin.clear();+ Q3 M4 I$ [; f+ Z" b
    for(;;){9 V: m1 ?; ?/ N3 X* t8 k8 e
        if(istrin>>csym[2]){
' T& g1 Z' @7 |9 S3 B, N            switch(csym[2]){6 r4 L. B. ]# R1 K5 W  q. x' v1 T- U1 @- `
            case '(':
% R; D+ q, l) j% A8 n# g, o                if(!csym[1]){nLevel=0x100; nERR=1;}else
8 L7 T( D' S' f  G, b6 L                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;0 i: M' v6 W) [, g1 ?9 t4 H2 L
                else{nLevel=0x100; nERR=1;}
: ~, G7 O2 E: n7 ?# X                break;
# i2 ]3 j; [3 q$ Q; x# J            case ')':4 @# J2 w9 l( w% M7 a8 ?
                {nLevel = 0x100;}break;# {8 o- Y0 l. A/ H3 }! ^
            case '+':case '-':case '*':case '/':& g- _: x! A5 S, A% Y
                {csym[nLevel++] = csym[2];}break;
: d* `- x# v5 N1 I, H8 _/ g# U            case ' ':case '\r':case '\n':case '\t':continue;
% n7 W3 z# W; U$ E) R            default:
) _6 F" b; m0 b0 Q/ y                {nLevel=0x100; nERR=1;}4 q# ]5 X2 y* o1 n
            }, @6 f* C8 e! s3 W# Y
            if(nLevel==0x100)break;
+ h& O  e& \* |: F1 ~            if(nLevel&0x10 || istrin>>t[2]){& [# A2 t6 V3 O& h/ `$ _- x
                nLevel &= 0xF;1 O# [. l0 C1 C! e* U8 r$ E1 f
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
5 Q$ y; Z3 B1 d1 m1 \0 ^/ ^                if(csym[1]=='*'||csym[1]=='/'){
3 k& G5 V% P2 o2 k                    GetExpValue(t+1, csym[1]);7 J4 a* S0 i( a3 f
                }( N  k- [2 a! C% x1 ^2 h. B2 Q
                else{
+ Z& b- r6 t! g  A% _                    GetExpValue(t, csym[0]);, s  C* |! H' ?
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
* r- q7 e0 t: r6 t) m0 z1 W                }) W8 |) X4 c1 o# v& b, B7 E: ]( y
                nLevel = 1;. p8 g% H0 ?* L9 }/ |+ d* ^" m
            }
' G* K+ g: ~, F# d; \) [            else istrin.clear();9 S9 k' Y& P. \9 Y$ t. Y
        }: R3 `0 C- P( g0 E& I
        else{nERR = -1; break;}0 K5 B" l' M9 H4 k7 m5 p/ v
    }& O5 K) {  I- u* r+ Z: i. S
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
3 ~6 Q% i$ L2 A1 I9 j% p0 i    else nReturn=GetExpValue(t, csym[0]);
& k. S* S$ }% b. {    return nERR==-1?1:0;1 F* ~6 q7 u% g; u: e- `, n
}}
! N& S2 e( v( Q, A* C: R  X
# `3 N9 C0 {- W- }6 t2 U# N6 ~6 n+ _8 B. J# ~

$ H8 _9 y6 o6 w/ e% p% ^9 b函数模板使用示例:
: S" j- R: Y  @在以上那段代码的后面加上以下代码:8 R+ T8 [; C; q: f, c0 w5 t

+ D- h. Q" [5 I$ K( O2 S
7 V+ q$ n8 k' R6 \+ l+ d9 w6 [
0 V. C9 Z* n: ~5 h0 A+ n9 U+ w程序代码:
$ L1 `5 I7 \5 d: e3 q
* o. r8 T! j" {; V) o" S#include<strstream>+ B6 o" Q6 c* ^
#include<iostream>9 ?/ W1 w3 I7 a
#include<string># O5 Y6 J) W5 z0 Y( w; M$ y
using namespace std;& D0 E! `! I! |" H/ y; g( u
int main(void)" ]3 X0 Z+ E, A0 }6 b
{
% D1 _+ }7 u6 F+ y4 e  o" E    string s1;
0 ?) ~: O/ C7 Y3 X    while(cin>>s1)! t5 W) t, B/ O- }) q0 g
    {
9 ?* ]5 j: K8 j1 r$ x- r. C        istrstream isin(s1.data());
) T0 s7 `: _7 Z        double d;
2 f  {8 Q2 B7 D9 @& F6 E# \6 D        if(fy_Exp::GetExpValue(isin, d)); e! K. g/ J* x9 f" {6 [
        {
3 O( D! C. F/ u4 D# U5 l8 J            cout<<d<<endl;5 Q& B" n( x0 X. J; ~
        }
6 I( |& Y) a, H! h        else. p! ^$ b; ~2 l6 J- x
        {
+ E  S3 W$ s: H9 Y  }+ ^& `' u( c            cout<<"ERROR"<<endl;
* v, `; p  R. a; D# D        }
2 `' @: O  A3 m% a    }
- t9 S# _* i5 f* M' K1 ?3 G    return 0;
" \3 H5 C/ E$ V$ p& Y) ^1 L) ~}
5 E: O$ f% M/ Y, ^+ ]. r. I8 T6 Q3 X3 K3 L2 n; l2 u$ p
! ~/ N. S! o) W; L: |8 C' l- Y
然后编译执行就可以了(*^_^*)
9 }: v. v  g5 q其它:TC++上一定编译错误,不保证在VC6上也能通过编译- w  \, b) a, n& b" D; D
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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