返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
1 b5 @4 f" C) c! f  D$ r一个很方便的函数模板,可以并且只可以计算含括号的四则表达式! ?( c% u7 j& t$ N$ R7 l1 G& w
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)6 x/ ^$ t  k" z& J" K
参数解释:
0 ?) c" p) r) o" m" N, nistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流: A, G, x! C' f7 f- c/ P
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
/ n% \) m1 W( _% O返回值:
' F# D7 [5 v7 @6 \- Z" v返回非0表示计算成功,0表示计算失败有错误
3 t, w9 X8 v, P8 T0 S2 Z  L- L- \$ t" O+ B* W

8 i2 c+ h9 n, }& @
+ Y! w2 Y) r5 C6 v% z, j程序代码: # i; u* J3 I8 n! O

+ J7 k8 I" o+ Enamespace fy_Exp{) z2 j$ q7 F: s' [, ~
namespace {template <class _T>
* M% [6 \; `% w9 J2 X# F) Ainline _T GetExpValue(_T t[], char& csym){; V4 W) |6 O# q, J. U
    char c=csym; csym=0;
( t1 a8 f( F* {6 _    switch(c){/ J; I0 f5 e* _- ^& ?* S: P7 W
    case '+':return t[0] += t[1];% m) p4 P* j) y# Z2 H
    case '-':return t[0] -= t[1];3 s  ^7 C) i* `% R: j) \2 `- e
    case '*':return t[0] *= t[1];6 G1 Z4 O0 j2 u  X3 r3 `( R- z
    default: return t[0] /= t[1];//case '/':2 m: L9 \+ E7 w* g' r
    }7 [* G3 ~* W5 U6 t( j( G* r& j
}}9 E" S; |7 ]% N4 Z
template <class _T, class _Tstream>
! n; B3 h9 E* v$ J- A/* _Tstream: inputstream, _T: get return value
, X- s. x- |$ n/ t5 R+ S0 q* Return nonzero if get value successfully */
! ~- v6 `$ N9 N# m% Yint GetExpValue(_Tstream& istrin, _T& nReturn){
7 r0 n7 N  ]* O. L8 l+ p7 O) i3 L    _T t[3] = {0}; //雨中飞燕之作5 |0 j2 M& n; C. @
    char csym[3] = "++";* Q5 W- k, v. z: J: p# t# I
    int nLevel = 1, nERR = 0;
6 E9 F0 O# e/ a5 p- E2 m$ j    if(!(istrin>>t[1]))istrin.clear();6 _6 I8 _( `$ {% |2 s
    for(;;){# V8 O$ q- i3 Z
        if(istrin>>csym[2]){/ j  @  [2 ^( f# R
            switch(csym[2]){3 E7 ^. b7 m( t9 Y( z7 n
            case '(':4 K3 {/ [8 g$ Y9 o1 e, D. F
                if(!csym[1]){nLevel=0x100; nERR=1;}else
$ s. N, i4 {$ T' V                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;9 v/ p9 L& _  d3 e& W2 s0 v+ s
                else{nLevel=0x100; nERR=1;}6 [4 }+ }& k! u8 h  v
                break;
% k8 q" x8 @* |, i# l% W. J, |            case ')':! z" L5 x7 r( M, d3 w' H! N# A
                {nLevel = 0x100;}break;; C1 V( h. V3 @0 \* ~$ J
            case '+':case '-':case '*':case '/':
6 e1 K1 H6 z4 l# {                {csym[nLevel++] = csym[2];}break;
% J8 T; h% k; k: |! C: F            case ' ':case '\r':case '\n':case '\t':continue;" `5 G( i) @' T8 c3 C2 M. R
            default:! }  B+ d6 X- r4 ]: h
                {nLevel=0x100; nERR=1;}4 k" L9 s2 F4 P0 Q7 w
            }
! W, Y1 P3 o2 L. V/ H            if(nLevel==0x100)break;" B' y; |4 b0 z6 L5 S! a  c
            if(nLevel&0x10 || istrin>>t[2]){
! m& D) ^5 ]& g, a7 ]                nLevel &= 0xF;
4 x+ a0 m5 P0 K+ a2 I5 N                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}) m3 {% a; s# G: s  [$ d) ?
                if(csym[1]=='*'||csym[1]=='/'){% k  y, O1 G2 @# `
                    GetExpValue(t+1, csym[1]);+ b+ p1 U6 \1 }/ q; O
                }* ~. d4 p( L$ n6 \( v; ?" t* e
                else{
% E1 a+ M' z. L, a                    GetExpValue(t, csym[0]);
5 f3 c: g8 C  g, J) s3 ~: ^- ~                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;. a* G6 {# u) G" c" Z
                }, ~& h0 H# u9 P
                nLevel = 1;/ k9 c0 ^8 D8 K. h, k
            }
- `, ~3 A$ L; n" ~. n7 s& L0 W            else istrin.clear();* f6 G( B# Y* L6 U; D0 G
        }
$ {% g8 X) v- m8 Z* f8 v8 s        else{nERR = -1; break;}# C0 ^* V. i# N' v, A2 C
    }
  a8 k) Y6 c" }" h0 e0 H, m% B- S/ ]6 r    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
# {4 K- t2 ~5 G4 u# {; u7 `) Z    else nReturn=GetExpValue(t, csym[0]);# v' b4 d) |) A) x' s9 g- ]% z
    return nERR==-1?1:0;' H' x+ J6 w3 C3 A# n7 P
}}
/ J( f+ n" O2 v$ E9 F5 V4 f0 g& r" B; H+ l" R
# `3 Z* I# W8 Y; k8 R
3 ]+ y2 r2 ]6 s' J4 g1 J$ o/ s
函数模板使用示例:1 t4 ?' B7 G! D
在以上那段代码的后面加上以下代码:0 X" p: x3 W' m' T& C! F
5 Z9 S: n3 Q5 i% |2 A
. ?7 _: R* N/ t: v# l! G

) Z. `) f" U& l% V程序代码:
. P7 f4 ^. ^, A6 z
# k8 @9 @  G& ~. h2 b5 Q) u#include<strstream># n3 u5 m8 _( @4 K: X. Z: j/ v* S7 I
#include<iostream>
$ t: R0 {% S& b5 y$ v4 i; U- t#include<string>  H# \: _! R7 ^2 V2 [" @
using namespace std;6 d, E4 _+ ?+ @- A  }: k4 o6 e7 n: E
int main(void)
2 T4 g; }: B6 M! u" g5 y& @* s{
7 z5 ]! A+ i7 W! i4 v    string s1;0 F4 W. S$ i! i! Z; r/ e% z  E: K
    while(cin>>s1)
7 ?: L5 e) Q) k9 L    {
5 @7 N0 |1 h; @( s        istrstream isin(s1.data());
4 V/ _0 d6 I2 n1 E1 Z( M        double d;/ [( }) O% S0 {
        if(fy_Exp::GetExpValue(isin, d))
( @6 w' D; V8 _  z0 T        {  J+ M1 t) v8 e
            cout<<d<<endl;! I( z3 E( v2 p; a  f7 B' J* q6 N
        }2 H7 I+ f% e8 G9 Q
        else% b. N% ]5 @5 c; v) n
        {2 e8 z# t# r) ]& z
            cout<<"ERROR"<<endl;6 z" h) Q9 E# B7 v
        }
1 t& ?5 t$ S8 K( ~6 P    }: W1 f' Q, ^6 V& U( O' Z5 h0 v
    return 0;
: k7 |4 x8 }! V; E7 Z! u' K}/ @0 i$ L9 H- X9 y: v
, f! c6 a; I" A! W  y; T

; F1 L0 Z% r% h  h* y然后编译执行就可以了(*^_^*)% V; C2 u  b6 v; R) d
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
$ y1 V6 r6 h" I/ n" \0 N: d' M: E      建议使用VC7或VC更高版本,或者使用GNU C++编译

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