返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,6 L" h% }8 M8 a3 v
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式6 O* d" i6 B- k
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn). b& t% x. _  d1 D( U
参数解释:2 D" K# \+ u) `' @& f- B& X. P
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
/ R* Q0 E" y0 L! r4 g. _nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定7 y( K/ X' s! h, U) z
返回值:& r: P0 _) M# U) E4 H5 W5 X
返回非0表示计算成功,0表示计算失败有错误
& T6 A2 e2 ~' x5 T2 D7 C) I& s6 b/ i) i$ n% [! X- r( x

4 }3 g$ _& j$ E" G4 ~9 I2 W
# r$ q4 w: W7 I( P程序代码:
3 n( H5 v4 ^: _) Y1 X1 u
# _/ q. h% {6 I2 N! o; R7 _' V" nnamespace fy_Exp{* K' ^9 b6 r& Y- c( g' ~0 Z
namespace {template <class _T>& q% ]/ r) p+ }) W* W
inline _T GetExpValue(_T t[], char& csym){
& S* }4 Y9 c% d0 X1 [6 p8 V! m5 f/ A    char c=csym; csym=0;6 s& O( `3 X, n3 F' K) T; k5 E
    switch(c){
, v/ X' X8 F5 m    case '+':return t[0] += t[1];! B8 r4 \3 k) B
    case '-':return t[0] -= t[1];( M/ q& X0 a( s; @2 Q! f0 h
    case '*':return t[0] *= t[1];
) g+ t) y1 H- D; b5 p* c5 \    default: return t[0] /= t[1];//case '/':( l- q$ a) Y$ p# d) L1 @& m% S7 F5 P
    }
: `7 |1 K6 N6 X}}
) B6 o' {# R# g3 N1 J1 xtemplate <class _T, class _Tstream>4 g0 i# f0 u& S* N: [4 N! f
/* _Tstream: inputstream, _T: get return value
# Q; q% ?6 N9 [' f* Return nonzero if get value successfully */3 j, N0 Y7 T" P  c/ l9 b0 b8 N
int GetExpValue(_Tstream& istrin, _T& nReturn){; B, M6 e2 I$ Z+ g4 I, U8 Z
    _T t[3] = {0}; //雨中飞燕之作  I) Z! t" D* e2 k0 K7 j
    char csym[3] = "++";
6 j7 m6 N* b/ x9 a    int nLevel = 1, nERR = 0;
* B+ r+ |$ N( j0 [  \    if(!(istrin>>t[1]))istrin.clear();$ V0 @3 D  _% b
    for(;;){
  D! Y9 l5 @  R4 E        if(istrin>>csym[2]){
  `* z! B5 _# Q4 n; r            switch(csym[2]){9 _) l1 _# n4 B5 p; v2 n
            case '(':" r& f. H) q. ^: C1 G% Z: ^. {3 d
                if(!csym[1]){nLevel=0x100; nERR=1;}else- a/ t& N) t. l' z/ M, o; |8 Q
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;# K  }$ g! \, T
                else{nLevel=0x100; nERR=1;}* u" d8 ?3 q, G6 C
                break;9 X3 y$ [% ~! D4 w( q. Q$ u: @
            case ')':$ D! U& e. l/ M/ i
                {nLevel = 0x100;}break;2 F' S$ p% V: {& a- H* [5 c
            case '+':case '-':case '*':case '/':3 E4 u7 E/ p! W5 ~
                {csym[nLevel++] = csym[2];}break;
8 G3 S9 S0 _' R            case ' ':case '\r':case '\n':case '\t':continue;
- @" ?: ]- m( @& ~+ r  ?3 l            default:
/ W7 l9 l1 I$ {: k                {nLevel=0x100; nERR=1;}) l; F( k- a4 q" v2 e+ F
            }! E+ ^1 [) ~" U; F- s
            if(nLevel==0x100)break;" Q* R: Y; a$ Y6 q4 m
            if(nLevel&0x10 || istrin>>t[2]){
2 w9 s6 E2 O+ _! S+ V4 f0 I  v                nLevel &= 0xF;# d# X& D: M  ]! v! I
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. T7 |( C; ~4 k0 H. u$ q9 d
                if(csym[1]=='*'||csym[1]=='/'){6 v$ B0 v* r; Z+ e/ y
                    GetExpValue(t+1, csym[1]);
. n4 q# D6 o/ {/ o$ D% l3 p- R3 I                }% r$ v) D0 W) E- W
                else{
+ g5 ~9 Y& j) R6 K/ {( L" I                    GetExpValue(t, csym[0]);" C* M3 Z- ~7 Y* m- t
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
  i( T& P8 b( {) q                }
' k2 q" l) v  k; o: I                nLevel = 1;
: a+ Q2 x" L" J3 `  Z& g            }, p# q* A  ?: x0 m' E! a
            else istrin.clear();  ]8 @! I5 U! f
        }
! D7 N" k' X7 b2 T        else{nERR = -1; break;}+ \1 M9 F) w7 m; J* N6 o$ O
    }
. n) o  i5 Q8 {( D1 w    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);6 f& b! X' t# ?6 ?$ g
    else nReturn=GetExpValue(t, csym[0]);+ G8 D- L" c8 ]8 k. @7 r
    return nERR==-1?1:0;4 ]6 D, l: J0 \7 R
}}7 y) l5 q5 ?  T5 D* V
$ J# ^" O7 [. `8 ?
8 k( R4 r+ A" d  i  D0 x

% j5 U* j: C( f8 K4 f函数模板使用示例:
# J! h- z! p/ [在以上那段代码的后面加上以下代码:
. a7 ]" |8 z; b& h7 v4 ?! |- [, k+ @$ n
5 B6 I! o/ t1 m& m! r# S7 p7 D: [

& o) H6 [# [$ }: B) T( C程序代码: + `& l; S& ~9 q, B
8 [8 O1 J$ F+ B" c! h
#include<strstream>' }3 w0 Y( q7 t+ A  M7 b
#include<iostream>1 A6 p/ p2 T7 E  c3 E4 S: w- ~( U
#include<string>+ h" b  y. c  G, |
using namespace std;
" p9 w! f; L8 Fint main(void)! }1 E( c& D" @# O3 C3 c' ^
{4 ^. i7 X: k5 v$ O2 l& I% O
    string s1;( t. `4 A% J- I  T6 J
    while(cin>>s1)
( ~+ s+ j. A; M  s% [' _# D6 `    {" S; |) q5 y7 g* ~
        istrstream isin(s1.data());
3 J9 L8 b: V  `2 C$ ^' f        double d;
% j1 V% Q8 e, z( o        if(fy_Exp::GetExpValue(isin, d))
6 v; _  B  ~, g4 S1 q$ @        {
+ H4 z6 i% {" X' c- A            cout<<d<<endl;* H, f9 R$ D. P' V$ P
        }* W8 V* j& R5 R9 Z/ [6 O  T
        else
" m! {& T/ Z# S        {) ~. L0 L$ Y$ C& N, B2 q
            cout<<"ERROR"<<endl;  k' l/ U. U9 F4 y% c
        }
1 F/ w, C# ]* @7 r2 S    }
2 m# L$ ]! F/ V4 \3 e5 N    return 0;
0 w5 I: F+ {8 `/ Z4 i}/ z2 Y  d+ B( [/ F* y+ z! F0 R9 d' K
$ w8 M* M# v9 B. V! a, t
' {0 }. J/ t2 Y) n) }
然后编译执行就可以了(*^_^*)
7 ]$ K8 s/ A( q  Q4 f. S其它:TC++上一定编译错误,不保证在VC6上也能通过编译
( R8 e" {% e  s      建议使用VC7或VC更高版本,或者使用GNU C++编译

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