返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,& S) |8 I  C, n4 S1 F- s- e2 T
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
8 M; D, o2 f3 r6 [  K, ?  W只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)1 ~, i& f7 H& I8 [) j& S! G0 b& H
参数解释:
$ f2 Y$ {4 F  v1 @5 tistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% S& Q8 t; p1 {6 ?+ s3 F/ F
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定  z& N4 i; A4 w' c4 b" w8 c4 N% i
返回值:$ B: Z# {; i9 R
返回非0表示计算成功,0表示计算失败有错误
: |( S# W; f4 w
" t- k7 J# |4 q8 m$ o( i
; ^! Y& l- Z1 Y5 \
& |( v; G/ ], g) a/ x: c程序代码:
9 X3 P; F( S, m+ i+ Y) Q
+ i5 u9 q. P3 [) lnamespace fy_Exp{; S) s- n5 w0 J! \0 ^1 R
namespace {template <class _T>
7 k4 L$ @5 v, A- h( G* o  @inline _T GetExpValue(_T t[], char& csym){, A2 `7 s- _' K1 R8 F2 n* N" R
    char c=csym; csym=0;1 ~0 x0 b& h. J5 F
    switch(c){3 q: |) F5 s( u2 f0 y6 j
    case '+':return t[0] += t[1];
' H3 E& n2 u1 Z; @0 T' b' i    case '-':return t[0] -= t[1];
) Q9 F( o! o6 D4 ^0 ]; `3 M    case '*':return t[0] *= t[1];1 a4 j6 X7 {. q! z
    default: return t[0] /= t[1];//case '/':
/ d8 G' @5 S- S( [    }8 u3 K! S& @! b4 u, @
}}
. ^. k& R! P: j0 k, g! ]template <class _T, class _Tstream>
( F! J; j+ a* I7 p; S8 |/* _Tstream: inputstream, _T: get return value
4 a" f% V9 f$ ^, i# y( U* Return nonzero if get value successfully */
- ^9 N7 [- z# f; ~0 Q7 nint GetExpValue(_Tstream& istrin, _T& nReturn){
( Y( z1 S! r/ M/ p* j; q" o    _T t[3] = {0}; //雨中飞燕之作7 n2 @7 ?" O, }% w% C
    char csym[3] = "++";5 p' }  }0 H& P* q- a* y
    int nLevel = 1, nERR = 0;9 O3 r4 a: m5 ]2 F; G8 X. _
    if(!(istrin>>t[1]))istrin.clear();
+ u' B4 c8 _. @* _* F# v    for(;;){8 y5 |0 j+ T1 t. D
        if(istrin>>csym[2]){  s7 M0 x& n, f
            switch(csym[2]){- x, Y+ J  k2 Y" v3 }( n
            case '(':
% D3 o7 Q# Q; D! a  ]4 [                if(!csym[1]){nLevel=0x100; nERR=1;}else
' M3 W8 N4 o9 _( k. R* d                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;! E8 W# k% x' U3 D0 {) S
                else{nLevel=0x100; nERR=1;}
+ q5 a, F: B0 f& }. S                break;' q( ?" d* ]7 r# b$ Y( o: E" r
            case ')':
' s- ^& f  Q% s                {nLevel = 0x100;}break;
3 _: ]2 M, G2 O+ A            case '+':case '-':case '*':case '/':
  l( V+ s0 e/ ?; Y2 C' m3 G                {csym[nLevel++] = csym[2];}break;
8 a* N  u: {& J            case ' ':case '\r':case '\n':case '\t':continue;
8 J+ w9 H. A- t: V" z/ T            default:
5 B3 V3 O+ S4 m/ D9 B- y( C- ]; K                {nLevel=0x100; nERR=1;}# Z) G0 A6 W2 S4 u
            }
; K  ?7 g/ R5 x4 l' L( b            if(nLevel==0x100)break;
' D# D& c/ B9 \0 c4 m( B- U            if(nLevel&0x10 || istrin>>t[2]){
6 J. ]6 w6 L( ^' A% m, f$ v; X9 y                nLevel &= 0xF;
* h7 `7 X+ w/ ]9 w- O" V                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
, }; x+ ^1 o' P% Z                if(csym[1]=='*'||csym[1]=='/'){6 B* `4 k$ l( e# s: b' }* x
                    GetExpValue(t+1, csym[1]);
: x5 h; S  n0 P0 ]- t$ d                }
: s3 g/ Z2 Q% c' k% ^" d                else{5 W) U& Y6 V. e) \4 h. v
                    GetExpValue(t, csym[0]);
; M/ D& ?  L3 B/ t                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;! \: k% o; H1 A* l6 x9 r
                }/ ]% B0 v7 p  k' {) S3 J
                nLevel = 1;
# S0 m9 L5 \9 c, Z3 d8 `" ~            }
% g4 n$ |6 E4 c4 e. B            else istrin.clear();
6 {3 w' t4 Y9 p        }
: [) |0 X/ A/ G( D' g        else{nERR = -1; break;}
2 s4 L! n8 V& s- v" M* x    }4 w; i* E/ v* u+ ?! [) X
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);6 w4 W2 u/ p1 _- r5 s, B' K
    else nReturn=GetExpValue(t, csym[0]);
! d  d5 p5 ]" _2 s    return nERR==-1?1:0;
( }' L& A. W# h5 i}}
7 S; K5 U' c4 B6 d( b, b8 {. P% o$ Y

+ y5 p3 L$ i2 A% b  y( ^( ]4 q
% Q: }" q' D+ i3 V5 G. M! _函数模板使用示例:
* k' J& [, d; l# Z在以上那段代码的后面加上以下代码:
+ q' @& h% P4 V2 G, f, f- |3 f3 r% T* ~. Z" J% x  ~

' b( [6 U: Z3 R, ~; K2 W% s9 Z4 P
程序代码: + R$ `: g& t$ ]6 Q
6 C# D9 F2 U, h, h' d( n
#include<strstream>
" `% m. u6 h2 s, _. [#include<iostream>
( j# R  L. E2 J) Y#include<string>. X& j  h( [) p/ k
using namespace std;
0 Y: R- v' a0 k  P3 ^5 S: Z2 Yint main(void)
- c9 Y5 q! i/ E/ K{
$ a; s* K# ]% ^: k2 F/ }    string s1;
0 I: e5 e0 z: M    while(cin>>s1)9 {  S0 Z1 Q4 B  t2 X3 O$ R; v
    {
# V5 u& s+ W$ p        istrstream isin(s1.data());
: H- z, R( s/ k! B, J7 }0 G        double d;4 l8 l1 c( R* A4 ?! s
        if(fy_Exp::GetExpValue(isin, d))
; A! a* g* M$ i' ^  h        {
3 c% D+ Y2 Q9 N3 R- f3 y            cout<<d<<endl;
  Q% `. o' K9 S, V" {' h2 l        }
# k! \6 g1 Y* E  T7 f, W( P4 l        else
& F- q/ S) G& y% H0 H6 X7 ~        {
* p6 S2 v: U" S4 e! i            cout<<"ERROR"<<endl;
* F) H6 R7 O  @        }3 Y4 M" M! H; d! @# ^6 S; v8 ?: I. b0 G
    }
- s! D- }3 ^2 h9 P- H# v' c; F    return 0;
/ L& P& x8 A8 q" J; Q2 U}
1 S; r: H0 J  N. a$ z( H4 N- L' Q2 P) R5 D

& h5 e1 L7 c; q然后编译执行就可以了(*^_^*)
. F8 h) @. A2 d# S& c其它:TC++上一定编译错误,不保证在VC6上也能通过编译: F7 n: F4 N( ?6 S! L: i
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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