返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
2 l) `1 Z, z( Y8 {, T一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
4 U) S: _# q1 ^1 z只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
! F! S( k' a# s1 s$ |3 f参数解释:
& `0 A* O# d2 }, Q, [5 H% R2 Uistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
' I* e( q4 E* c4 e  y) qnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定( O, {& n* v7 ~: r$ }
返回值:& |# f8 \/ V) z/ M9 X$ Z. k  l; Z7 ^
返回非0表示计算成功,0表示计算失败有错误
' v) O2 g0 z4 n- U- M
3 v, f0 i8 ~: f' j' g
/ Q$ a, B+ c/ R0 Y
0 a+ b, s: |9 B# y2 M6 @! x7 q4 B& j程序代码:
+ x1 F( u9 y3 f- {" J
" J/ P: i7 C. U, e2 M, \namespace fy_Exp{1 l4 i6 J) Q! R7 n& v6 v
namespace {template <class _T>6 t* G4 s7 N5 K( n% w
inline _T GetExpValue(_T t[], char& csym){% ^2 _7 O0 G8 t/ k' v) j- V' E
    char c=csym; csym=0;* B, x& X  L; X
    switch(c){
- y8 }) o1 @: z' M3 u1 W    case '+':return t[0] += t[1];
$ T1 ~4 B2 c9 n7 Z' @5 y    case '-':return t[0] -= t[1];
* M- r6 {6 v' I  Z    case '*':return t[0] *= t[1];
1 I& i0 J7 I* S$ @    default: return t[0] /= t[1];//case '/':2 z% \7 p; p. ]: _
    }8 l# R) q" A+ D. h$ j2 W3 `, K5 Z2 N
}}4 x9 o. m% s1 @# A% \
template <class _T, class _Tstream>1 q3 U" D: V' F* b" v* z
/* _Tstream: inputstream, _T: get return value
* h  A8 w3 z; i* [# c4 m* Return nonzero if get value successfully */
: Z+ |, a8 p' [  \6 Jint GetExpValue(_Tstream& istrin, _T& nReturn){
; ^  j0 o7 J0 g4 p% p    _T t[3] = {0}; //雨中飞燕之作0 D, P  g4 J: }* T0 @
    char csym[3] = "++";
& ^. U$ X% l" h7 ^, k/ {3 A9 q8 k    int nLevel = 1, nERR = 0;8 ?. R4 r& l& R$ R* s
    if(!(istrin>>t[1]))istrin.clear();& _  [$ f* q5 p" ]  Y8 C
    for(;;){
3 p- X3 }5 g7 V  {$ d        if(istrin>>csym[2]){* z4 P. z$ X2 t9 ]6 v! X
            switch(csym[2]){
0 d1 B4 M! ]. G* w: x            case '(':2 Z  w; w0 d0 F  C* {
                if(!csym[1]){nLevel=0x100; nERR=1;}else  [# A3 |/ R2 d. B1 f' B) Y1 y. n
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
  ^) K7 O3 M1 @3 L                else{nLevel=0x100; nERR=1;}# V: T. e7 W; l6 P  y
                break;- a& f6 `$ d6 ?9 N, A$ l3 T
            case ')':
6 j: L- _$ R2 \/ A  `                {nLevel = 0x100;}break;
! z9 u6 n4 G/ J4 r; S* Z/ w& J0 F            case '+':case '-':case '*':case '/':
( L  ^' a$ Y! ]3 n' Y                {csym[nLevel++] = csym[2];}break;
3 y" z4 {" _! v) T3 E7 L0 f            case ' ':case '\r':case '\n':case '\t':continue;
- t9 r4 Q% a( E. Y' P9 y$ y: m            default:  Y5 r' E0 @  ]8 U: i' N
                {nLevel=0x100; nERR=1;}
; ?6 g8 v+ F3 ^- T! z+ {& q            }$ a' e4 y# e" `8 |$ z! u
            if(nLevel==0x100)break;
/ h4 A( N7 P6 B+ X% {$ e            if(nLevel&0x10 || istrin>>t[2]){
' m7 r9 @( ?0 B' o. S% d                nLevel &= 0xF;
; c0 N; n0 l  P+ e4 e6 j                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! P0 l" }; O' b0 J
                if(csym[1]=='*'||csym[1]=='/'){
6 A0 [4 C5 r1 _4 K! U6 R, d7 N                    GetExpValue(t+1, csym[1]);" a' J( C1 D/ j+ r2 I' w
                }& c4 I, B* L- u; P; M$ c) W3 g( q% U8 l
                else{
( O6 D- n. Z# U/ r+ G6 {( U/ X* x" D                    GetExpValue(t, csym[0]);  u* h+ n( A4 x  g& N6 o" ~
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;4 o% ^' V  R4 n
                }& @* ~4 y# U8 S* h9 r( {5 J
                nLevel = 1;7 N5 o5 h8 h, e' o& @
            }( U& _# h, F: S# `2 s8 W
            else istrin.clear();
) R: f! D8 n$ Z) \3 V        }5 @) D, D4 F9 i4 z
        else{nERR = -1; break;}
8 h3 x3 B5 Q/ e5 R* Y4 K+ d, m    }. E! ~* @! d9 a9 B" j
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
  X$ b' z* w" s4 u8 g    else nReturn=GetExpValue(t, csym[0]);2 g: A  Z/ }% h5 J: k& V
    return nERR==-1?1:0;8 {: `5 r- f" W6 }; V5 A+ Z4 l
}}
9 D7 o$ j6 A* J  H1 b
, Y1 k) F' L- @+ `. Q  a+ o
4 ~& a- D! J; x# q0 }0 R: m
% f) o1 f2 n' z函数模板使用示例:
5 H  F6 }5 ]6 T在以上那段代码的后面加上以下代码:
$ H* e3 ?0 Y. @/ V: O6 O  b! m+ ]( z' {. K8 l. P; ?! \
+ l( F0 K1 L. w) L, V- c

: T- s( n% d9 b) y% ]9 V程序代码:
: \% ~' H+ d% L9 ]* o$ i9 i8 F6 `
6 F; N9 k5 V) I. U#include<strstream>: r1 A! L. R6 Y/ w* B
#include<iostream>
  }) A, t: K3 [# I7 C' l+ W#include<string>3 q- S$ ]/ U/ i2 Q7 X8 _: Y. G6 P
using namespace std;
6 H9 v8 N: K0 X1 ~- rint main(void): [& l) X6 k1 |( B, n% X
{
  D6 m6 S! J! F! {" _    string s1;3 n5 [( W( e3 F% w
    while(cin>>s1)
1 A2 Y+ f% L* d0 H7 c6 _5 a% w4 v" @) r    {6 r3 G6 ^. p, X/ R8 J' L% U
        istrstream isin(s1.data());, x8 z* N" C* Z$ P  g
        double d;3 x$ [1 s& I  v5 z) M
        if(fy_Exp::GetExpValue(isin, d))
5 L/ N3 I8 t! A8 k- F) U        {0 a! |8 ^- v1 z* w( b  @. S
            cout<<d<<endl;
  O% B6 k3 F! s% l. ?+ p        }
* H: l% P: H  N1 ^5 I        else
+ x8 `7 ]+ L$ _* g; R3 d7 l        {
& i4 ?1 e6 |) @* [' {' g! `' B            cout<<"ERROR"<<endl;5 p2 H4 a: J  r8 O# ]% D; ?
        }1 U2 c  m; W, H' w8 `( k  D7 r
    }
! O) {8 h8 z, L    return 0;
' S& T! e" A- T/ U}% M8 f) T- Q9 \$ J- M

) O' T* A: c* H1 D7 a$ S; R$ |+ R5 }( t$ k" i
然后编译执行就可以了(*^_^*)
) D  T* s/ ?: v; w) g4 v0 `其它:TC++上一定编译错误,不保证在VC6上也能通过编译. D- _' m0 Q: U; b. |
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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