返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
; q' u1 H9 b# Z$ p5 F, K7 I: n一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
7 P! w1 v5 O8 H/ N4 M$ C只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
1 V  m% P# j& c( _参数解释:6 r: y: ?" m4 m0 Q
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
0 x) d/ Y! ]: m9 Z! e7 \nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定' \& s- V4 m- C9 W( R. l
返回值:
% H+ t; k* M7 }& Q5 W返回非0表示计算成功,0表示计算失败有错误
$ C0 r: u3 Z9 O; G  `$ T/ h8 N! }
3 e) t7 J& d1 F- u3 ?# Q  i7 U 4 L; ~; J8 a8 w- g5 X3 v9 X( h

- `' q% Z# ], [/ S1 F4 Z程序代码:
$ D# k" B3 o2 G9 c3 V# h( ^& e0 E" l" N% g' A: m4 L/ c' J% {
namespace fy_Exp{6 N1 I, M5 C0 {7 M1 V% ^
namespace {template <class _T>
9 g3 g6 R4 r7 {  r2 m8 {) ?! Ginline _T GetExpValue(_T t[], char& csym){1 h3 U. T5 b4 c- M: s
    char c=csym; csym=0;: j3 L8 I1 b( i6 F7 g
    switch(c){
1 E; @; M; m+ m6 e* b5 a    case '+':return t[0] += t[1];( ?# B' F% i/ G
    case '-':return t[0] -= t[1];
" v! m  V% F2 v1 r: w# {3 a  e    case '*':return t[0] *= t[1];/ V4 n' t$ c2 L' I4 U" y
    default: return t[0] /= t[1];//case '/':3 @9 U$ e( A# d# ]
    }% w: B+ D1 r( [( [, r- b) T
}}
: K- k$ b5 ]2 Q7 t/ ?  xtemplate <class _T, class _Tstream>
# z3 G+ g; f  L/* _Tstream: inputstream, _T: get return value
" p! O: G4 h/ G$ j" h4 ?* Return nonzero if get value successfully */
# }2 c: j  n+ u8 Q) ~int GetExpValue(_Tstream& istrin, _T& nReturn){
6 O! _# O0 ?" j# _& W    _T t[3] = {0}; //雨中飞燕之作" a$ @7 z/ X3 u; ^$ [8 K6 `/ i1 ~+ t
    char csym[3] = "++";- A! N" [( Z6 B7 o! V6 c
    int nLevel = 1, nERR = 0;
2 s& e8 F  O5 R9 a2 H2 }    if(!(istrin>>t[1]))istrin.clear();6 O$ o0 l) t7 g# l7 G0 ^
    for(;;){
4 w& r3 {) }: B8 D* J9 m5 A& h+ K8 D        if(istrin>>csym[2]){! `0 X3 ~8 f$ J/ l7 |% e
            switch(csym[2]){: T( h, @/ n; z) j
            case '(':. x* o, a0 y- ]1 e/ X- c
                if(!csym[1]){nLevel=0x100; nERR=1;}else0 S  r! {9 B" Z' q# |2 A
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;, [: j. E% b  _! U
                else{nLevel=0x100; nERR=1;}( J5 C" q% R8 v
                break;
/ ?3 Z" F$ `, N- W/ a            case ')':
/ V% a( O: w5 ]& F                {nLevel = 0x100;}break;
. p4 E$ Y9 C/ c            case '+':case '-':case '*':case '/':- y2 Q' ?' D! U8 @
                {csym[nLevel++] = csym[2];}break;
5 {+ Q4 b. O: ^* ]; z            case ' ':case '\r':case '\n':case '\t':continue;( I' l7 a, V4 S
            default:$ I+ `  v' l& V+ L& Q! z
                {nLevel=0x100; nERR=1;}
  i; u3 J) c  ^2 |$ P! M            }0 @! m# E+ g4 P7 Y/ b7 z* F
            if(nLevel==0x100)break;
  F# u* B! K7 L$ k/ F0 n            if(nLevel&0x10 || istrin>>t[2]){
. s1 V5 G4 l1 t/ a/ d( F                nLevel &= 0xF;! Y9 I, p0 j+ O% S
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}6 V# P7 O# R( Z6 s8 x
                if(csym[1]=='*'||csym[1]=='/'){* S9 _$ S# R' k6 N5 v
                    GetExpValue(t+1, csym[1]);& k2 N9 z) a5 q1 K% w
                }2 u# d* _& P$ m5 W$ S1 D, R
                else{
# a1 n9 s4 x7 {& E/ e                    GetExpValue(t, csym[0]);
  Z# U7 p+ b5 Y8 J. {& v% M$ R                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;5 y( N. g8 ^' O- \" d: I1 n) q
                }
& ?- ]- Z: h. ?) w                nLevel = 1;
9 t8 I0 H' ^& |) e            }9 Z* v8 F5 z* N& r1 _7 E
            else istrin.clear();
  b( h( r" w0 S6 b        }, i0 j& P6 @; ~" V  O: ~
        else{nERR = -1; break;}" N$ F3 C  M5 E5 s9 Z( I
    }
4 A, J' _+ W( @5 V    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 o) o5 q! ?- p$ c/ w$ |% v) S    else nReturn=GetExpValue(t, csym[0]);8 }$ U8 G1 f+ @' H( @
    return nERR==-1?1:0;* B+ E% b. r& g; P
}}
! N& P# s0 Z; i1 A
( G7 T2 s0 z. L1 ~( w  Q3 E
" C' G0 [# L3 P/ G  E* c: q5 S. U9 B
函数模板使用示例:! K( ~7 y; {7 J: p# U* u
在以上那段代码的后面加上以下代码:
7 M2 F3 }* U+ q2 x" ?) y
" ?7 e1 u- @0 M1 s% E9 g
( |) U6 T1 U- n
% n) Q  s2 Q/ b程序代码: ! L! T* N7 E+ B1 G

  h1 D8 Z* i2 s% r8 Q#include<strstream>6 O$ ?9 q9 A7 B# H' M
#include<iostream>
) j; s  P* c  X% B$ S9 t" N1 {) N#include<string>
' Z8 _. N6 _" \( {& C0 `using namespace std;6 _1 f5 o% a% [
int main(void)9 D6 T6 z! m/ k4 n( \9 F) q- m
{
# |4 H( M6 _) K$ s. h    string s1;8 Y1 Q5 T# P# a) G
    while(cin>>s1)
+ o( I# Y/ Q5 ~$ C5 e6 a3 \    {
' {8 U3 u- F) m        istrstream isin(s1.data());& G0 t. e/ O# r: {1 v- a( T! R  X" ]
        double d;: D: g: |$ J4 F8 R* V
        if(fy_Exp::GetExpValue(isin, d))! _0 l0 `! V# ]' H5 I/ v
        {9 k6 M; h& E6 t" o% @9 F! v
            cout<<d<<endl;
7 x& y: o9 p( i9 e        }. u. R$ I( w$ g
        else
2 y1 `: `' F2 E6 }  E/ K        {6 s, w0 H$ M) Z  z2 `
            cout<<"ERROR"<<endl;
# X. o0 i, C, z9 x' O% N        }
: o/ n# k4 b' m' }( C/ \; k    }
, L* E; Z" @, d    return 0;
5 r6 r) a' E, V( _; t}
& V1 m) @* Z0 c. P2 K0 B# \8 q3 t
) H' K+ o' v8 y% n6 Z2 A' B) {5 Q5 w+ X" t
然后编译执行就可以了(*^_^*)$ [+ U1 ^# F& q* w5 p
其它:TC++上一定编译错误,不保证在VC6上也能通过编译. p" M1 A  r3 f# [
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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