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

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

在9月8日那天我特意编写的,给大家分享的,
8 H- X# O" i" _* N一个很方便的函数模板,可以并且只可以计算含括号的四则表达式: V2 I+ c& \/ Y
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
3 R! H3 ?" w* ]& L参数解释:' \( m0 H% q2 p2 {& Q- s
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流2 G( V7 q/ b! [. d* U, ~7 i
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定3 {" n0 g3 e  H9 D0 r1 O9 a
返回值:5 c: {# J& X* g5 H$ {
返回非0表示计算成功,0表示计算失败有错误
, ~+ w9 U/ A7 ]  U2 H
9 m- u8 T5 r7 V7 r/ o6 D, y: |
6 M4 N' D9 [, c3 x  l) U2 r( P1 `/ Y2 \9 H" c& D  ]" z: R
程序代码:
  h# `" s4 D1 K2 O) ?5 p) `3 N) z" }" A) k% Z+ u) _8 K
namespace fy_Exp{/ V+ d0 b. I$ q
namespace {template <class _T>
9 F2 g+ u9 R& n  }inline _T GetExpValue(_T t[], char& csym){
5 z' R5 b, u: Y/ G    char c=csym; csym=0;6 H+ ~+ r! m: w* s' f& h
    switch(c){
0 x* }' m, s' ?. F# I" Y2 z    case '+':return t[0] += t[1];
# e9 w/ l" }% Q/ D& q9 c    case '-':return t[0] -= t[1];
. j1 e; X8 c6 a  K    case '*':return t[0] *= t[1];2 A# K; L1 ~5 D: W8 ]
    default: return t[0] /= t[1];//case '/':
& F' _0 ]6 h) h8 g, ~6 h    }! _7 v) `$ t7 A( G( G$ e1 [  _
}}
/ b9 L* W( e* C9 Ptemplate <class _T, class _Tstream>0 T+ R% Z# t6 I, w" g" A. {, ?
/* _Tstream: inputstream, _T: get return value! X3 m; f' X/ V
* Return nonzero if get value successfully */5 T6 l: f, S% B. r
int GetExpValue(_Tstream& istrin, _T& nReturn){0 K8 {& k2 w* w) u
    _T t[3] = {0}; //雨中飞燕之作  l# ?9 ^& L8 S6 M( Z
    char csym[3] = "++";
8 L3 W* n! X0 n9 H" V# w1 N    int nLevel = 1, nERR = 0;/ p' c. z. W. I# {% I* ~" c
    if(!(istrin>>t[1]))istrin.clear();" E- i! b; m0 I6 M' P# V) P
    for(;;){
9 M, u& K% f2 e        if(istrin>>csym[2]){7 m1 F) C, }# N
            switch(csym[2]){
' }( i: ^! s" z6 Z( ?* b( T            case '(':. t+ G. O' c: Z
                if(!csym[1]){nLevel=0x100; nERR=1;}else
0 b* P/ R' }" {  w: m- ]                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
. ?! M3 l9 y/ I) z8 T, R                else{nLevel=0x100; nERR=1;}
# B" J( p& r4 Q' N) F" K+ T/ L3 o                break;. M$ [6 M+ \9 `& H' t  A! q
            case ')':
; t1 ^6 ~$ f- F6 s6 e& x8 D3 D                {nLevel = 0x100;}break;
0 s$ j% t8 C8 c, c. D8 @            case '+':case '-':case '*':case '/':
/ ], [; @) |% U                {csym[nLevel++] = csym[2];}break;
) o4 L3 `5 L9 a  l' u3 @% @% _            case ' ':case '\r':case '\n':case '\t':continue;
' p. \4 T' @' b5 D* L  ^            default:
) o9 R4 y2 [6 C5 V+ ^9 g                {nLevel=0x100; nERR=1;}6 J! v+ O: p6 E/ H
            }
5 M+ d1 Q0 t6 ?3 H            if(nLevel==0x100)break;) @; T3 z' f. I
            if(nLevel&0x10 || istrin>>t[2]){5 |0 i) e1 I- V2 o' s
                nLevel &= 0xF;
2 u) L4 T1 V. @  F                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}, C& }5 M" f' a: y
                if(csym[1]=='*'||csym[1]=='/'){0 U& q. q" ~& b6 @/ H2 o0 C
                    GetExpValue(t+1, csym[1]);( G5 t, W% L5 C6 k: _! ~
                }! E. W5 E7 I, @# d& Q; ^# L4 h
                else{
; L- v* U+ X( _                    GetExpValue(t, csym[0]);
2 N: l6 F  v2 r2 H/ k                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;* Q& A: E0 B5 F2 b( p
                }
+ B& [. X8 c' {8 p9 E                nLevel = 1;& o" u! d+ U3 ^0 g9 Y2 b* `' X+ u+ p
            }2 j. a" H0 q7 V; o
            else istrin.clear();
+ m- d" S9 i8 P& n7 e: v        }$ E3 B4 u1 J9 i* }
        else{nERR = -1; break;}
( ?. r# l/ n* V' u: j  C# Y2 Y    }8 P* {& {! m( B" g* k4 r% B4 R9 c
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);  C' F, ]" I* H
    else nReturn=GetExpValue(t, csym[0]);
& g  ]- A: @8 i: H# G6 p9 X    return nERR==-1?1:0;  ^4 y% u& Y. R, N; a# @: y
}}& v& o0 _3 S  X3 z' M: X+ b* ^

5 h2 u1 C7 q! |/ v. T( x- z
  K/ R; h) S3 _0 T& @% v5 A! _3 h9 d; ]8 S
函数模板使用示例:
+ W6 [0 D! T; y7 p# m* X在以上那段代码的后面加上以下代码:
" ~' c* l" f% D* B- [1 M3 W( t- d7 W0 N% `& h6 S
0 U  n: B1 }) P3 a- b# G

( E& L: K# [) F% a* b% b" j; P程序代码:
' J+ n" [3 ~* g6 n- s9 {4 K5 E* Y4 J6 D; A- t( F
#include<strstream>& o9 O4 J3 }5 c) C; V* z) e
#include<iostream>
3 Y1 Q' p$ f+ Y* _& t#include<string>, Z4 e9 H1 T% Z7 M4 g( J
using namespace std;
% z! j9 Y4 B/ o- Vint main(void)- T6 [1 w& k/ v) i5 W" Q- y, G3 i* i& Q
{
0 p$ Z4 w" a4 h! p& W    string s1;0 }5 L% d: d: _% t7 {4 x  L- m
    while(cin>>s1), m5 z/ W6 R- ^  W& t
    {
6 \* g8 d8 p( }        istrstream isin(s1.data());
5 b( f- z1 @( ~% u        double d;
, r5 \3 V# M6 f' \7 M- r( V        if(fy_Exp::GetExpValue(isin, d))
5 ^5 v, H9 |( k8 V/ O) e3 a        {5 }+ }6 p# i8 Q, d
            cout<<d<<endl;/ G3 }& R& k' `0 r
        }
6 T8 b- G! E* x3 }8 n4 w* K        else
- S2 @( {: r. i, X8 _7 @$ i        {
+ `2 m) U" D' k# }' W            cout<<"ERROR"<<endl;
, p" t" u6 @1 v, M" C  \! t4 Z        }% _. U; V( i) n* l8 P- f5 h. ^
    }
& G/ u4 Z& A3 s7 ?- ^3 S$ B/ V! Z    return 0;
4 D( S/ f) N' E}
, m6 k' {& M" c, w. `
" Z2 |$ v6 ^; e4 n( ~
2 B5 X! F7 `1 X$ B6 A+ I3 n& S然后编译执行就可以了(*^_^*)4 P3 R9 Y! B' b  x
其它:TC++上一定编译错误,不保证在VC6上也能通过编译  `& r; ?# D# @2 v7 z4 K+ Y% ~
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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