返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
- m9 q+ z6 o! e9 e一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
& i$ t. d1 S& c, A1 ~" _只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)1 Z5 o& d; g/ ^2 E
参数解释:
+ x) l( k" _# l5 C. C" H3 wistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
9 Q; @# O. e& j9 inReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定: H- O- V3 p6 l" b6 i
返回值:: v* s8 e! o/ i. h
返回非0表示计算成功,0表示计算失败有错误' A: X# Y( F7 [1 c, f' P

3 o! K6 h4 a1 h( Z4 } 9 P1 L! I6 B2 A5 A; P
- r6 D2 [+ z; m0 X
程序代码: & Z+ O6 y6 g0 x- `! @

( m5 O5 S$ R; _0 ynamespace fy_Exp{
5 F; f9 _' g/ e7 s2 Inamespace {template <class _T>4 }& E- E4 e: u5 k7 R$ w6 W% l
inline _T GetExpValue(_T t[], char& csym){# b6 R2 j0 i+ b, f! t) O
    char c=csym; csym=0;
& r$ _8 Z) m2 o" F6 K    switch(c){( g( u9 @# c# Q/ C8 g
    case '+':return t[0] += t[1];
( p+ _0 B6 {* n% ?5 q    case '-':return t[0] -= t[1];
8 S* F' v+ I" O    case '*':return t[0] *= t[1];
7 \2 z. C/ Q0 ]( g) D6 ]    default: return t[0] /= t[1];//case '/':
* z6 \  }) Q& U8 b7 l8 a    }
. K+ S: k/ ?$ }! a0 Y}}
! j* m: C( @" K+ [) `$ Mtemplate <class _T, class _Tstream>6 x( g. I0 g& R7 m+ m& F# l
/* _Tstream: inputstream, _T: get return value
6 K# R. V3 ~. G7 t1 v( F* Return nonzero if get value successfully */$ A( Q/ |" m% b9 |7 z
int GetExpValue(_Tstream& istrin, _T& nReturn){5 A+ B+ x5 Q$ y( c3 X$ [5 Y
    _T t[3] = {0}; //雨中飞燕之作
7 d' J: x6 d" M( k, A9 \    char csym[3] = "++";
$ E9 m" x4 K+ D' U3 h+ Q    int nLevel = 1, nERR = 0;6 i! O, M1 y: H
    if(!(istrin>>t[1]))istrin.clear();
2 U4 J8 X) V. D$ t4 B0 _; R7 s7 L    for(;;){2 c3 |, O$ S" G0 h
        if(istrin>>csym[2]){, l# V& _- F3 J  @
            switch(csym[2]){
# W9 }: l- I' U; e5 `- B% S- z            case '(':  T- a% F+ z4 L
                if(!csym[1]){nLevel=0x100; nERR=1;}else
$ J- m" g( x+ C9 v% l& A                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;* q8 b4 U+ t, F7 }6 @: @
                else{nLevel=0x100; nERR=1;}/ O" J6 S! _, w  |
                break;
4 R' Z! p# }/ d' v3 B; r9 Z            case ')':
# _2 p0 i; d$ q2 p/ X' |) @                {nLevel = 0x100;}break;
3 L& ?5 `; r$ _  J: k5 }, a& e            case '+':case '-':case '*':case '/':
' h4 |4 U0 T1 ?% D& g2 V                {csym[nLevel++] = csym[2];}break;9 w; P" N+ u2 K5 V9 I# r3 V  n
            case ' ':case '\r':case '\n':case '\t':continue;* T$ B" y2 j2 f6 w
            default:
5 w* K' {* s3 ^, I/ |; [: U0 C0 P                {nLevel=0x100; nERR=1;}: |) q2 C, a/ h6 J; h7 G
            }
) D# ~( o$ K. n( r7 F$ E2 |5 S            if(nLevel==0x100)break;
- E' n% I9 J! z2 e! P) S            if(nLevel&0x10 || istrin>>t[2]){! A0 |+ o9 f9 u; ~3 E; g; ^
                nLevel &= 0xF;
, X) s0 ~' H$ j9 `: Z% M2 a                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
- P4 R, v7 M: H3 s% f                if(csym[1]=='*'||csym[1]=='/'){
0 ^) [/ b1 g) s' R! D$ Y# z5 r7 s                    GetExpValue(t+1, csym[1]);; W6 W. C: O1 Q5 J* ?
                }
* U/ _8 ^/ o: g" h                else{
8 t7 a; T( V+ z) m                    GetExpValue(t, csym[0]);& u+ k+ ^( [; b7 \# ?
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;. f# W& Y# d# P
                }
, Y: h- d, K: x$ @6 P$ W. z6 A! q                nLevel = 1;1 S! X# x" T5 ~4 \. T
            }
  c) N) Q7 O# g& x            else istrin.clear();0 }9 a/ _" T% B8 ?$ P. a. I
        }. R2 h4 M$ M& D! L6 ^/ m; D
        else{nERR = -1; break;}! Y' [! l2 {- u  p) z
    }
, K# w+ t$ x' {    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
8 x+ x. c' z$ p" K/ k7 ?    else nReturn=GetExpValue(t, csym[0]);
/ M+ J( m7 x6 o8 X; {. p    return nERR==-1?1:0;( F- G$ p# f3 e* R  l5 r" x6 V
}}
' x; J$ }0 ^( p2 h2 h# M
% V  J! M1 Z1 V+ a& C% s: x: {% f% ?$ O- `5 x. Q

$ W; i& u1 p8 d# P$ ^& A! p函数模板使用示例:
/ z& n4 ^( |5 m/ {- a9 s在以上那段代码的后面加上以下代码:
( Z9 ?) r9 l, x3 r+ Z! _  G: n6 I$ g% S  A3 E

" V3 ?! m0 B' v: P, R+ V: P- D" N! B# k, q0 q$ U
程序代码: ( v3 E% a- {5 B& Z( i
2 \8 V- S+ s. X9 J
#include<strstream>
7 d& J* X4 G/ V, ~7 l  p#include<iostream>; [9 V- K: _- S+ G. ~3 {' P$ k
#include<string>
$ M4 u' C1 y; Susing namespace std;* h# E( m) P5 n4 w8 A$ e
int main(void)3 _" a! {/ V: j( r' T8 y# s
{7 w# N+ V/ L3 |7 N. }& L) s
    string s1;2 o. ~" p5 A3 G8 E: A5 ~: R
    while(cin>>s1)9 n6 W1 ]1 S# B/ F7 R6 G
    {* ^, P+ o. o, u  L5 }9 P5 S! G: s4 G
        istrstream isin(s1.data());
" }) Q* K  j" R        double d;
7 F: y8 X: @7 N        if(fy_Exp::GetExpValue(isin, d))7 S& h. z# }. Z& ~" ]1 P
        {
$ A5 |; G* P& o9 W* h* P5 i# O            cout<<d<<endl;
. B' ^) E- L* J$ B9 r        }+ C# m  s' l3 w# O# f' R4 O
        else
. M& a) D1 M( s0 O: ^        {
" C8 e& f1 t) ~" u            cout<<"ERROR"<<endl;( d% w& K5 A( `4 Z+ h4 S
        }+ E2 p# F) F# o0 w) o7 R
    }
8 ~9 Z, h9 A; R* O    return 0;
( U0 m7 D; w  l}* U& G* L: L% q( H
" `0 N+ n/ u9 [& w

+ G: h2 F" g3 ^& c8 v% k然后编译执行就可以了(*^_^*): Y& @+ X3 N9 h' G( O& i7 q4 b) Z) E6 s
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
. r- b2 o6 `* ^* N5 ?/ _- E1 N      建议使用VC7或VC更高版本,或者使用GNU C++编译

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