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

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

在9月8日那天我特意编写的,给大家分享的,9 n2 _$ e9 {  h# k. T1 z& {
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式( o) j/ j. G+ m
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)2 k, Y2 ]. l9 B4 a& r! m* }) |/ l& o
参数解释:
0 U9 |6 Z2 ^7 q( ^  J  V% Pistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
  r. v$ l4 d7 J% w5 D) j/ UnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定1 F. C# i- B! W; j
返回值:) M0 b9 @) O* M2 _
返回非0表示计算成功,0表示计算失败有错误
7 D( d2 x$ B8 D3 t' F7 N, W* m2 U- }9 V' r1 [/ o
2 W2 O, w9 n% N0 ^6 A1 S7 a

0 \# a2 |% B1 H+ f" B' z+ d程序代码:
& E9 B9 v  c" p: j4 K  \# d
0 T( d) [! {( ~5 G, d: {namespace fy_Exp{
$ ^6 |- y$ u8 N  E: u) S9 {( F9 g- Nnamespace {template <class _T>
. E( u+ K. P6 C& Kinline _T GetExpValue(_T t[], char& csym){
5 `+ e8 N1 O+ ]    char c=csym; csym=0;
$ x4 e4 I6 d$ T( D( f    switch(c){
, U; ^) f, P& q( b1 X7 t    case '+':return t[0] += t[1];
4 |% f6 l# P; S& o    case '-':return t[0] -= t[1];
8 W9 E4 W) G1 f. z4 V" N    case '*':return t[0] *= t[1];
' M1 M. z5 G" Z, q% x3 s( k# c    default: return t[0] /= t[1];//case '/':: P% G* U8 S# G+ N3 c: J1 q
    }
7 |7 z6 r6 U' Y2 J4 f" E}}
* {+ _+ U& u/ o! Q2 f# Ftemplate <class _T, class _Tstream>% s$ f, j7 k3 H, `
/* _Tstream: inputstream, _T: get return value
! L  f1 K/ J2 o$ f1 B0 {* Return nonzero if get value successfully */
% _+ G! B' y# `" _; f2 N; bint GetExpValue(_Tstream& istrin, _T& nReturn){3 [: H) w, y+ t" n" S8 d. V
    _T t[3] = {0}; //雨中飞燕之作* O3 p  [: y1 a& ^# e
    char csym[3] = "++";
, q) J, r0 Z  j" c$ d    int nLevel = 1, nERR = 0;
! E! t2 e9 m9 W2 W    if(!(istrin>>t[1]))istrin.clear();' @( D  d3 h" |! x# [, x, j) K; |% N
    for(;;){
* N* o9 e; }0 w! \+ F        if(istrin>>csym[2]){4 U! Q3 X$ t, ]4 U
            switch(csym[2]){
# _; }! R1 z, z7 g' b            case '(':
* e9 w5 g/ C, E6 k) F                if(!csym[1]){nLevel=0x100; nERR=1;}else
( b8 ?* w0 i9 G                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;0 c" J) U, V0 k
                else{nLevel=0x100; nERR=1;}1 T- w. K/ T, [: u
                break;
' Q$ v& o. n! A: Y            case ')':/ W# a* y0 K0 W0 i! g) n5 o. A( X: w
                {nLevel = 0x100;}break;5 s6 n- i6 D3 j" M" b* ~
            case '+':case '-':case '*':case '/':3 [; r' Y, n/ U2 K- S
                {csym[nLevel++] = csym[2];}break;
+ M0 z9 N1 A7 C            case ' ':case '\r':case '\n':case '\t':continue;
6 U) \: \' p  \5 w6 x* I            default:
8 H% C: R2 ^" J/ f& j' C                {nLevel=0x100; nERR=1;}  A- B2 z$ V  b( o" o% P5 I; P
            }
- d8 ^2 Z$ c" m: X1 a6 M( l+ ?' R            if(nLevel==0x100)break;# [2 A/ v$ w9 F) \* @9 m3 ]! o
            if(nLevel&0x10 || istrin>>t[2]){
6 H1 X+ j* x# I9 E9 Q                nLevel &= 0xF;# ^" \+ ~" v" v6 B. @3 i9 p( k$ Z1 z
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}* l. s# Y( S# u* a7 Y
                if(csym[1]=='*'||csym[1]=='/'){
. c+ O, u0 }1 q9 C* X1 g# r$ V5 V                    GetExpValue(t+1, csym[1]);
' u& c' B! f) e# q/ z, q+ L                }1 E% k$ a" j& t( T
                else{7 j! d4 s7 G5 o3 _
                    GetExpValue(t, csym[0]);
: z6 [9 L3 C& ~' T  o1 w                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;6 E* y" ?, X, V% C& J
                }
& E, A8 a- _* B) j8 M, K7 |1 x7 O                nLevel = 1;6 Y+ o" u) W$ O, \& U: v
            }2 u: g  _2 d. I8 }6 Y, c
            else istrin.clear();
0 r7 J' r/ S3 [! l" g        }
3 E$ \% p  Z2 w8 y        else{nERR = -1; break;}5 X$ u, m1 O0 D. ^" O7 I! l
    }
$ @6 U1 ]# r2 R7 {6 R    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
' w: @* d: o0 g    else nReturn=GetExpValue(t, csym[0]);
. X1 c- |  o% S+ K( @    return nERR==-1?1:0;" Z, @' c, T* Y
}}1 k1 \# Z+ {3 I) ]9 i3 R/ a
2 N2 S/ g. i  }! B7 V) i

6 b0 s/ }, i/ @, _0 p4 [& T
/ g' e) }& F( e" @% \函数模板使用示例:; s+ h+ t4 [) \4 Y8 G; V! U
在以上那段代码的后面加上以下代码:! m1 y4 X8 \+ N: K1 t& W  f' I

1 O' ]7 x  Q& Q
. C% J: [+ }7 \# l+ W5 j7 G; G
$ V4 B& p; x! D3 D: k5 g程序代码: - B, b5 \5 ~% b( `: w6 [+ \
* [, v: O8 J$ }- `9 I
#include<strstream>
, _" E; `- `6 m#include<iostream>7 t* X, p5 R% e# @8 [
#include<string>( t1 X. {+ w+ C# l. H
using namespace std;' z( S1 o  _+ P' B( I3 A6 x# |
int main(void)
. V' n" O2 b/ ]6 a{2 u- J$ a# C$ z6 m; {$ x) m
    string s1;$ r& m; x! a+ }0 n7 R
    while(cin>>s1)6 N0 E4 _* E1 Q1 H! W; p3 ~
    {4 k) @- y, P) V- m) d/ u
        istrstream isin(s1.data());/ T5 h1 G# h  a. g
        double d;  |% x- Q7 W  H' U
        if(fy_Exp::GetExpValue(isin, d))
- Y, V1 u  r  V% Y5 `* F        {: c' U- @- m) ]% G5 b: A
            cout<<d<<endl;' c8 m/ x' v- V& ?# i7 U1 Y
        }* D$ l6 E, k. Y& N: y
        else+ Y2 {, }; O% m* u" v
        {
2 I4 ]: u9 X9 v( O2 M& K            cout<<"ERROR"<<endl;
  Q7 `6 o: {9 I        }( C) V# G/ t# u
    }5 i5 [% q' K9 r2 p! s' d3 I$ |
    return 0;2 y0 E. t5 l% y5 R& q6 M8 `
}
8 P, F' [1 ?% n/ q, w" P- C* \8 Y! ^% G3 u1 r
! ?3 ]& ^# a* q3 V( p! \5 b
然后编译执行就可以了(*^_^*)
  N$ x& y% G4 w! G1 V4 j' F其它:TC++上一定编译错误,不保证在VC6上也能通过编译! b! t9 X8 g7 x2 Q+ j  m
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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