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

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

在9月8日那天我特意编写的,给大家分享的,+ D2 ^1 N6 v8 u# i) \% r( ^( b' _% l4 }
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式4 y0 v; ^+ {) D) U0 j% X1 C
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
$ L9 U% B1 T% A: C( R参数解释:8 J( |' m7 o+ t" Y) }8 o, {
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
8 h2 U( @6 c& d* R; znReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
1 m! U! k2 y) R9 }1 \返回值:" H$ c- d( r$ r( d1 E" n
返回非0表示计算成功,0表示计算失败有错误0 D% v, e, L1 t0 G' X* o, f# O
! H4 j% {, I2 ~8 g9 a3 ?

; i4 c# k: O6 Q* j% w! x8 }$ \% N5 _3 g. o, Z" V0 g! \) ~
程序代码:
/ j- q; m! n: j9 [/ W- m  g' D9 D  p  k: H" b8 z+ S  s- q3 E
namespace fy_Exp{; h: b: L  B0 n4 e
namespace {template <class _T>
& U; Y( m2 p8 T2 V# @- n# kinline _T GetExpValue(_T t[], char& csym){
. \7 U) i+ n! Z* O  J& c    char c=csym; csym=0;
! A( w# o0 [# O$ h0 I! F5 y    switch(c){, a" Y, U7 _/ B& Y
    case '+':return t[0] += t[1];2 V$ y+ F1 P; y0 S5 v
    case '-':return t[0] -= t[1];5 e: J$ V( d$ \8 ^/ r
    case '*':return t[0] *= t[1];. R. i- @, ~$ g7 x
    default: return t[0] /= t[1];//case '/':$ c/ v2 c" r8 D: L
    }% O* W! S( s" s" Y, F
}}9 |( _- c" c: W) E' ?' B
template <class _T, class _Tstream>
! c6 p) U  s8 }6 W2 L8 @: k3 h$ U9 G2 |/* _Tstream: inputstream, _T: get return value
8 {1 B; P8 K( F) N& x* Return nonzero if get value successfully */
  X0 N5 l% f4 j9 C& bint GetExpValue(_Tstream& istrin, _T& nReturn){6 B3 `0 a. t- z  l5 A
    _T t[3] = {0}; //雨中飞燕之作1 W7 t( c& {' ^# Y5 u% ]/ ^- r
    char csym[3] = "++";
- M! [/ n; P0 b* e. d, ]. }* E, @    int nLevel = 1, nERR = 0;
6 E4 w5 x: A8 _) X" `" J4 U4 `1 w% ~# @    if(!(istrin>>t[1]))istrin.clear();
" @) w( m) B& n" T    for(;;){8 p* i' \+ C2 L
        if(istrin>>csym[2]){& j+ i* m2 D/ B: L4 `
            switch(csym[2]){
& @* d' H: m5 f; F            case '(':% y0 X0 X, T! w
                if(!csym[1]){nLevel=0x100; nERR=1;}else5 ^" y% d0 `$ ~0 T1 R9 e& s
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 u; E* D6 `2 s9 s+ }4 n0 |
                else{nLevel=0x100; nERR=1;}* _! f* W+ y5 i
                break;
7 R* d, M4 K2 a* ?' V, f( B            case ')':
8 s# A0 b1 Q4 E                {nLevel = 0x100;}break;$ _# w! u% R1 E9 D5 k9 O, W) u
            case '+':case '-':case '*':case '/':" v8 q. n, L( Q3 R/ s# d  `& @& p2 o5 _
                {csym[nLevel++] = csym[2];}break;
/ D1 K8 G+ O- Y            case ' ':case '\r':case '\n':case '\t':continue;( C7 C4 ~" R6 s
            default:
9 k7 k( i& H7 H9 }) o                {nLevel=0x100; nERR=1;}
+ {% [' X3 W. w7 T            }
* \. V7 ~8 U9 A, z0 I& a            if(nLevel==0x100)break;
0 D4 L( K  Z1 n+ m5 @            if(nLevel&0x10 || istrin>>t[2]){6 ?# j; A, n. H' F
                nLevel &= 0xF;
5 r/ b; G& {$ R8 O9 f                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. E, [! U6 x8 ^  b7 C                if(csym[1]=='*'||csym[1]=='/'){
2 \. s% S' G! J6 k9 r5 x                    GetExpValue(t+1, csym[1]);2 i/ M4 |$ R  F
                }6 d" z7 ]9 g$ ~4 i
                else{" N' @' z. u: a4 u2 \* w
                    GetExpValue(t, csym[0]);) o% r% `6 ]' {5 ?' l
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;, g+ J- G* M0 s. E" d
                }1 _: v) Q2 ~# {: a
                nLevel = 1;
2 {5 ^4 V$ t% L% u            }
; a8 G  @$ a+ n, d% b8 ~" v9 T            else istrin.clear();6 L; [& l( R( ?1 ]% O. `
        }
/ ?$ M. N$ j" p: r9 Q$ [% P        else{nERR = -1; break;}
6 V! w; }2 X( V; S2 P2 W+ W    }
5 }, _* [9 {1 D3 O4 t    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);5 a% ]) d& E. s/ s' I9 J
    else nReturn=GetExpValue(t, csym[0]);& P3 W+ U( Y* i
    return nERR==-1?1:0;- i! g" M6 H: l9 n; ~  U
}}
. g  g/ Q; p% x, g. q
. r3 s& J" R' W" s; U
3 w4 q# c. s. ~: P1 _: N
* ]( [5 v0 s- O+ x, Q2 y, Z函数模板使用示例:
" n% @. s$ ~3 H7 ~* x( `2 u: o3 j在以上那段代码的后面加上以下代码:
0 i) b1 D# Q, x3 U: Q7 z* G" Z  i4 U) f+ x$ f' N2 N
9 A( Y! }$ i( ~5 ], Z; k8 ^
8 y8 x8 m& a% |) }: \. C" x: {
程序代码: 4 K( @/ A! S9 L/ F6 x4 w$ X
+ p# c4 I& a3 y
#include<strstream>
+ H8 a# b7 J3 n/ L8 ]#include<iostream>
% I$ x/ @- b' n9 j#include<string>( i" j; @9 u2 {0 @; g
using namespace std;
1 g4 f; R- c2 y6 |6 vint main(void)* O, z* x: T9 ~; L
{
: Z6 T5 A, {( b9 Y6 G& N    string s1;
3 |9 y3 S" X" F  K6 G    while(cin>>s1). r' L" z8 d! s" J9 l' H9 k
    {
$ ]' K3 J0 x, D% V6 R- z1 e        istrstream isin(s1.data());1 x+ T0 L  \  Q8 ]; A
        double d;% p6 A( i9 Z! L
        if(fy_Exp::GetExpValue(isin, d))8 _  H( L7 u" j
        {
5 D% B% z, X( U+ @" P; A: }            cout<<d<<endl;
# E, ^1 F0 r9 u7 P3 B5 g0 M1 [        }' k; w/ o. Q' V, D& ^; V
        else- I4 U4 T  O$ l  _$ t! \
        {
/ Y6 \) C0 L0 X% W/ Z- T1 S            cout<<"ERROR"<<endl;, `9 Q! B# |  a' m8 n/ V
        }
4 u0 Q9 \+ C& |/ C    }
. ]8 x' {& x9 r  y# p: _7 j    return 0;% b: w5 ]: S# ^; K" U$ r. N5 ]
}) R8 Q1 Q) P1 Q/ X- j
4 ^( K' m6 v# {6 \9 s

. j& j$ V# \5 l/ o然后编译执行就可以了(*^_^*)
. S* i2 ~9 \, }+ v& S其它:TC++上一定编译错误,不保证在VC6上也能通过编译4 F2 [9 e  V4 A% W
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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