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

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

在9月8日那天我特意编写的,给大家分享的,7 i' C" j& z) T
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式& Y4 ~+ Z0 `& N* C5 O& K1 E' q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 @) e1 T  n) k: z% ]' w9 G参数解释:
. h; F& y2 r4 _  k. iistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
! g9 J* b- V+ k% ]& qnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
+ `3 u6 d# Y5 F' H+ X返回值:3 M$ m. c, D' b* c- A- Y
返回非0表示计算成功,0表示计算失败有错误; ~" n3 d  C! U

" d4 e3 V7 s# m! H9 w: [ * T3 H' _% \. i) F, p
9 }  I  C6 O7 U" v/ ?
程序代码: ' A1 q* G- ]& X# @$ m

) B2 Q6 s% R( Wnamespace fy_Exp{# V  v( ~; \6 \+ r/ u% u
namespace {template <class _T>
" Y" A# H, H$ z6 M5 `' e5 linline _T GetExpValue(_T t[], char& csym){+ D  O: h* h6 `; N" W- A5 ~
    char c=csym; csym=0;
! D6 ^! X, O) o) \) r' q1 Q6 x8 `    switch(c){
+ n* A$ n/ v: N  z6 m    case '+':return t[0] += t[1];
. h# c1 A: i' `7 w8 z    case '-':return t[0] -= t[1];2 U  p# _6 W: l) j/ m8 e3 ?: }
    case '*':return t[0] *= t[1];2 N% f6 Y7 K: Q% N0 G3 K. G- E1 t
    default: return t[0] /= t[1];//case '/':
) ]; i( R/ u/ s; j) u    }$ K1 @5 c% J5 J$ f
}}
( `0 l2 V% ~# Y4 G4 I* {template <class _T, class _Tstream>7 n  g+ n" o: L' @
/* _Tstream: inputstream, _T: get return value
- B' ]3 S( _% O% k0 M* Return nonzero if get value successfully */$ f* B! a' t& s$ B$ I& M5 I
int GetExpValue(_Tstream& istrin, _T& nReturn){
4 ^0 S- D' C1 s# T/ K/ g7 O, q    _T t[3] = {0}; //雨中飞燕之作
; R/ _: W- B' g0 t* ~: D    char csym[3] = "++";
# s1 `2 e% h5 {    int nLevel = 1, nERR = 0;4 }3 V- s4 ]( y; M0 O  j
    if(!(istrin>>t[1]))istrin.clear();: h/ \  e1 Y% ~6 f6 {7 Y
    for(;;){3 Z# {2 Z( V$ D& ?/ G' x! i& m
        if(istrin>>csym[2]){' X6 U& K; _/ |! R/ Z
            switch(csym[2]){
4 k$ r+ u; K9 y- J8 H+ i  o+ ^            case '(':
, g6 P! N6 J7 M9 Q& [                if(!csym[1]){nLevel=0x100; nERR=1;}else
6 d$ D4 V. {! Z# i/ S6 y                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;8 Y/ l% X2 P2 g7 e" H* \
                else{nLevel=0x100; nERR=1;}
; {9 K" z! d/ Q8 |- h                break;
9 a, E* U/ o7 M! ~/ d! }6 W            case ')':
& _' @; u( O0 i                {nLevel = 0x100;}break;
0 M4 [8 c: C$ x1 z  b8 t  n, K" P            case '+':case '-':case '*':case '/':- j# J0 `( v5 N$ h7 A, Z
                {csym[nLevel++] = csym[2];}break;0 G* T/ w3 }# x
            case ' ':case '\r':case '\n':case '\t':continue;
. ]5 O" p: A* k" O* A3 i7 x            default:2 B8 J; C6 R6 {' h
                {nLevel=0x100; nERR=1;}
6 L7 k- X' J. N1 h! j! u) \+ K1 O            }
! L# ^1 l( D9 H& B            if(nLevel==0x100)break;2 ^; j! {/ Q& N/ A6 P4 Z# z
            if(nLevel&0x10 || istrin>>t[2]){) q& y- y3 n# {' `: E$ d6 L
                nLevel &= 0xF;4 [4 g3 z7 @( o* V/ k) g
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
" z" n$ u! ^" T                if(csym[1]=='*'||csym[1]=='/'){
, v0 t) T7 z; G$ H) U$ n4 s                    GetExpValue(t+1, csym[1]);8 ?7 G0 F6 @. A) B( v* B& c
                }
0 o; G7 p) |! D                else{
/ L+ T; g' T# L, L. I                    GetExpValue(t, csym[0]);
0 R+ n) d) U' ]                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
8 [  T1 P' p5 K' c) |2 D                }, F  S1 {; h% n/ O9 @
                nLevel = 1;' B  Q& k3 N2 n/ Y% }1 g
            }
0 |# f- s$ ?8 Y  E' ~            else istrin.clear();' F7 {. h6 X3 b# o  i, @/ {6 @
        }( D7 T' W4 m+ d7 S1 R
        else{nERR = -1; break;}
! h% C" }3 I" s    }
6 q4 [3 @/ u! Y4 X3 }. p; `1 a! u    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);, a. b7 g% e  q
    else nReturn=GetExpValue(t, csym[0]);5 q5 A% Q( o& }$ c& @
    return nERR==-1?1:0;. w: @* T; ?3 b- B3 d! J$ f
}}
( x6 O$ U3 y  n' N, c; z5 e
- m* y- ^( j1 ?! }/ [9 p  }8 {, H! v- Y; T

/ c* @; V! v, M0 o函数模板使用示例:
0 K, K& u2 ^3 E/ g在以上那段代码的后面加上以下代码:. p9 f' w& `  A1 d, a7 w
5 g+ r/ o9 M( i7 y' ~1 n
4 u7 ^* m1 E- ]. p6 E5 O8 S

) N* W. i  a6 F" v+ U9 a程序代码:
4 g: ?$ s# f: y3 w! ~
- s' P( h3 g- n0 q#include<strstream>" K+ v, R2 f% `# Z
#include<iostream>
! m  X% i- ]  y#include<string>  K5 J7 x; g" b* r
using namespace std;
& v- U+ L# \. i0 A; l- C0 mint main(void)/ v8 F9 r4 n2 q
{: X7 g/ P; n  o
    string s1;, F* y/ ^5 A' y# r) _9 y5 f: C/ V* W# B
    while(cin>>s1)5 T2 D( }1 B9 Y( h" o% S
    {
" N8 z8 T. t- h% j/ C; q1 T' e        istrstream isin(s1.data());
7 H/ k# [2 y2 g" S0 F# p: q: C' O        double d;
3 y% y& a( d5 A  O5 F        if(fy_Exp::GetExpValue(isin, d))' `3 G0 k6 i% I4 y7 c! U
        {  k; {; p5 F- F$ p+ W+ f
            cout<<d<<endl;
& J0 s8 e! a, y8 z" q        }* t2 z2 D; o# j+ V0 Z: L2 Z' x/ D
        else
* j1 A7 w! E9 q        {
6 d2 M& S) s0 o; B: o. y( u            cout<<"ERROR"<<endl;5 S& h+ X" t# x4 F5 D$ N4 G9 I3 [5 R
        }: I. s% q( i1 }. N
    }
5 p4 M! q4 v; q2 @    return 0;* X' Y- K  O$ v
}
7 w, U9 ]) A6 G6 x9 a$ i; q) k9 n" \2 @* t3 B7 m# A

1 |+ |; n$ X. u( J4 K然后编译执行就可以了(*^_^*)  N0 B4 R3 V) ^5 b
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
: w0 |& @( J4 L  l% U( t$ h- H# ?) @% }      建议使用VC7或VC更高版本,或者使用GNU C++编译

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