返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,. S1 }# @# l4 i) T
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
- n& e: }. a3 _: h* M只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)+ p$ P/ K7 M# a; ]/ u
参数解释:+ m5 g3 x, R: O* C* k; M% n
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
- u/ u0 M/ ?- |) O5 anReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定8 q8 V5 a  \2 X% u
返回值:
3 q. P+ D  P- v% A9 B6 M返回非0表示计算成功,0表示计算失败有错误
5 O3 ]! @: E! s2 I/ [! o* g! \( X  B" ~$ `; L& `/ P
/ j  A' K2 y9 D4 o
" ]& y+ Q8 _. B- b' m$ l2 Y+ }
程序代码:
8 n/ V. h2 }2 N/ P6 r* Z
+ `8 G6 U9 N( p# [9 k% b' znamespace fy_Exp{
5 z" }; Y8 L! m8 J( o9 c# {namespace {template <class _T>( r0 {' K4 n5 S& Z9 P
inline _T GetExpValue(_T t[], char& csym){
/ k$ v/ f/ i  O; v+ _6 m    char c=csym; csym=0;
: m9 e7 s! Z3 N) X+ Z' J0 I) h    switch(c){# M1 O6 o5 Z# K6 u
    case '+':return t[0] += t[1];
! `: j/ L9 D# r, @3 i% k# v4 A! h    case '-':return t[0] -= t[1];8 n0 A! h0 S7 {
    case '*':return t[0] *= t[1];
3 X# Z: k* S  \0 e5 R8 x. ?    default: return t[0] /= t[1];//case '/':0 _1 d+ v2 h" F2 R
    }- q3 h* Z( C; M! _" C
}}$ G. J1 q8 @9 P6 s; @0 p, K
template <class _T, class _Tstream>( ~4 w- h2 H! K* E  s( J, V2 l
/* _Tstream: inputstream, _T: get return value* S, e% P' b' P# Q6 h- p
* Return nonzero if get value successfully */* Q( |6 `1 [" @2 u
int GetExpValue(_Tstream& istrin, _T& nReturn){
! p5 O, k- X5 j" }2 z8 }    _T t[3] = {0}; //雨中飞燕之作
% D% U6 b  A5 U5 U! f! A    char csym[3] = "++";( p. |+ a; ]# J; v( f" H
    int nLevel = 1, nERR = 0;8 `8 V. }- A3 A* X8 [( l! j& E
    if(!(istrin>>t[1]))istrin.clear();
! r; E, D# O; L: L" m    for(;;){* s$ r$ `3 {9 U! m- }+ h
        if(istrin>>csym[2]){
+ p! L9 }# i: n/ f+ t* F3 O            switch(csym[2]){6 K' O! f+ x: j1 O$ G
            case '(':8 O! ^, B1 f( E9 c. m5 O0 c; L
                if(!csym[1]){nLevel=0x100; nERR=1;}else
" p) |! j, S$ K5 d                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;. A( H# F/ t" _. g9 p$ C
                else{nLevel=0x100; nERR=1;}
3 O; G2 Q& G. v- ~: y) F" [; k7 P                break;8 z9 J) Z; x4 l
            case ')':
+ a$ B. V9 ^; E7 h5 W5 R                {nLevel = 0x100;}break;; |5 C. u2 ~" P0 o5 U& k( w* H1 O
            case '+':case '-':case '*':case '/':/ a$ `6 r$ I8 r6 g
                {csym[nLevel++] = csym[2];}break;
; P5 H/ k+ q* q9 ~            case ' ':case '\r':case '\n':case '\t':continue;7 ~/ m$ o1 L  h) T9 o
            default:
+ v6 O* C3 T: I7 }                {nLevel=0x100; nERR=1;}
, \- d0 Z; C/ S$ e            }8 m0 H, W. {  ?
            if(nLevel==0x100)break;
+ r6 q6 |6 f. A- r0 k1 n            if(nLevel&0x10 || istrin>>t[2]){& c8 g9 w: V$ x1 s7 _
                nLevel &= 0xF;6 G/ j9 P6 N2 H; ?" o
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 m5 l" j5 a' R* W
                if(csym[1]=='*'||csym[1]=='/'){
1 x; Y) i* ^0 L3 @' u7 d! Q) [                    GetExpValue(t+1, csym[1]);
  W0 Q% g; Z% l# b                }0 i+ a% ~8 S* [
                else{
. ^; M3 j1 \! U! z$ }6 j                    GetExpValue(t, csym[0]);
/ O6 h, Q" L9 }" h6 K                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
) ~" S" l+ ?* E7 I                }+ i# e: w  }6 x) l% M& c
                nLevel = 1;
' V0 a; n* @& G9 I. }            }! h3 n1 A/ _5 Q0 `+ d8 n/ ?
            else istrin.clear();
" n& s$ j: r# P        }
; J1 c: }0 ?* {% C7 I3 C5 R        else{nERR = -1; break;}- v: d1 {; \" o
    }
! V! c3 R% P. o, o8 E" y; a    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
% m9 [* e7 M+ b    else nReturn=GetExpValue(t, csym[0]);
* \) h, ]3 I; _5 i" J) K    return nERR==-1?1:0;
( c6 @# {. c9 j3 ~/ X}}
' O7 d8 A, D( }1 C( S. T( I. A1 q$ [( {3 P5 {4 [3 n. Y
& b. R( J& `7 {$ v' H

# F1 c" w8 m( {5 {' Q函数模板使用示例:: c, c+ k/ q( i2 Z
在以上那段代码的后面加上以下代码:
9 y, S' ~' X) n
/ I& x1 v2 l. H, y+ l! L
  u* h5 ?0 C2 X. n6 _& `
: t' Q6 [$ V/ J6 o" F& K+ j' g程序代码:
4 r; q1 f/ A4 d2 P/ P
, E0 S2 ~0 T9 H2 r#include<strstream>! V+ W) H9 n2 _8 V* f- q& j
#include<iostream>/ s2 ]& ~' l5 W4 x/ }  _
#include<string>
. O8 o7 z" X$ E# V% j' gusing namespace std;) c) z. T. I1 T& k( I
int main(void)
+ `2 \7 Y, o- G$ b5 c; v{
% a; v+ O% H/ t8 Z    string s1;
4 C1 Y9 D$ @- n/ i+ v6 c/ f    while(cin>>s1)
" Z& l& t4 n0 R: O    {5 p6 L' l; I! }
        istrstream isin(s1.data());) s* G* @: ~* V
        double d;4 }% H  V" X' y- G# K5 o' Q
        if(fy_Exp::GetExpValue(isin, d))6 c* F7 q0 J0 `# I; Q4 M
        {! a& @9 E* \- z6 N' r
            cout<<d<<endl;( C( {: B% p) y
        }
  R5 i5 W! Q; \; a: s        else
# W5 ^- ]) j2 \! J$ B        {
' z7 {& ~( i3 X+ s! c; x            cout<<"ERROR"<<endl;% |3 U# s+ c1 c
        }/ X$ Q  O' p: _/ A, ^  s- `
    }- K2 i( `- b, J1 ^* O9 ~
    return 0;
2 z* Q* Z6 n0 `6 }}9 q  m* K5 K2 p: j, {
4 n' E( R0 f: o* U3 [5 o8 X

6 k0 H4 f6 l# F8 Q/ W1 T4 ^' ~, g然后编译执行就可以了(*^_^*)1 B4 n/ C' u5 s8 y
其它:TC++上一定编译错误,不保证在VC6上也能通过编译# f  \# p* Y( _  d8 u! K
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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