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

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

在9月8日那天我特意编写的,给大家分享的,
' @# X, _4 o/ |) i一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
5 H; t- d. W7 h0 Y9 b+ c3 R只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
* h7 f. D' p& S/ c- ?" U" O/ u$ ?参数解释:3 x! Q% Z) T3 I3 ^1 m. u9 H
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流3 F  B3 `! e6 q1 k1 k9 o# m
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 g# M4 f! t/ V9 z1 d" N$ S! U! `
返回值:
  z3 v7 C) C! \5 I, |# Z4 Y, J; T返回非0表示计算成功,0表示计算失败有错误3 F. ~- q4 I: U7 H5 Y

/ |' Z/ c  p' o- @/ @
+ p# O4 }, W% p# @* T% V
) d" i/ j, W3 z: q) a, g# E程序代码: & a5 ?7 M6 ~3 a

9 u; o& @+ {1 a( g$ [2 t; dnamespace fy_Exp{$ i" `3 [* p% U* M9 {9 }
namespace {template <class _T>
7 |& [9 k+ E& D: e+ P! r. Sinline _T GetExpValue(_T t[], char& csym){
5 c' l# A/ o; O+ E    char c=csym; csym=0;5 d$ e7 X7 `: Y( ]* Q  t6 i/ l5 r
    switch(c){
0 X% G6 i. M) M; L    case '+':return t[0] += t[1];
" c3 h; T% r/ ^7 U1 y    case '-':return t[0] -= t[1];- s: P4 q! n+ a, `9 y
    case '*':return t[0] *= t[1];8 r. k+ Y: Y- Y, P) s
    default: return t[0] /= t[1];//case '/':
- v8 D' ]" T+ m3 E9 k    }, P+ [- F0 O: ~& A9 Q
}}0 v7 G+ E( \6 f5 d0 [
template <class _T, class _Tstream>
, Q( ]5 D/ s8 I  |( ~5 S' }/* _Tstream: inputstream, _T: get return value0 A$ F* l, e1 _& n3 ?
* Return nonzero if get value successfully */8 a* o9 z, {6 t  _5 U/ m* }
int GetExpValue(_Tstream& istrin, _T& nReturn){6 R; ]. Q$ C+ ^
    _T t[3] = {0}; //雨中飞燕之作% ]  }, U. b# W& o' L
    char csym[3] = "++";' Y. B, I4 I! u8 R: q
    int nLevel = 1, nERR = 0;
( ?* o! u, Y& c2 s2 \0 T    if(!(istrin>>t[1]))istrin.clear();& [- H5 c, t/ H" k0 q
    for(;;){
+ `1 ]  W0 a+ M  E' R4 w& H, M( O7 y        if(istrin>>csym[2]){
) S/ j1 }3 C! s            switch(csym[2]){6 R6 ~, [2 p+ ~8 ?* I
            case '(':5 ]$ R1 a, E, }3 ?$ }
                if(!csym[1]){nLevel=0x100; nERR=1;}else
5 j/ [% b7 t3 a                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
8 q! T, M% r* B                else{nLevel=0x100; nERR=1;}
6 }. \3 Q7 Z4 }5 c. A8 n/ i7 |                break;" s1 @/ e  A! q* R; E
            case ')':' z( V' u% M' M4 B( j4 S- E9 X
                {nLevel = 0x100;}break;8 {- |/ n5 Y) V
            case '+':case '-':case '*':case '/':
& k7 T% j; `' H                {csym[nLevel++] = csym[2];}break;
; ]" c+ t3 ?" m$ A# [* h* x' D+ X            case ' ':case '\r':case '\n':case '\t':continue;/ d9 O* w$ ]6 H. \* A
            default:
% }7 a0 |5 ]  }) [; {& d4 R                {nLevel=0x100; nERR=1;}2 `4 Y: \" H2 N9 P! ], Z
            }
8 G* N9 m" {. ~0 ]6 [! I            if(nLevel==0x100)break;$ f7 q' [  p; g7 h
            if(nLevel&0x10 || istrin>>t[2]){
. b  d9 @% ]; D                nLevel &= 0xF;9 n* E# Y" X5 P. F3 L/ q
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
; N, y$ X$ T+ V6 X" M2 V! l$ f, ~                if(csym[1]=='*'||csym[1]=='/'){
+ j, H0 p! f: ]9 q+ Y7 }" Y                    GetExpValue(t+1, csym[1]);
" R  R" K: D, [2 D% |0 O) k, n                }. n. C, S/ |0 a! @2 O. @
                else{
6 T3 p6 i6 ~' m$ R                    GetExpValue(t, csym[0]);9 Q4 m# X. Y! w6 I7 s
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;# ?; Z2 x2 p. s& A3 v
                }
! R* ?* n( f' |4 E3 f: k                nLevel = 1;6 ?0 G/ l' b, E  R1 _( z
            }
1 P! T  F* K8 J* a4 d+ _( B% A            else istrin.clear();6 X0 E! p5 c# E2 A
        }
- i) }$ k' Y9 X; O1 A        else{nERR = -1; break;}4 e4 F. G( r8 Q" W6 ^# C/ F" g
    }
) r3 g) h/ O% f' Q+ C' f    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
. \# m9 e/ z. U+ O: F! V    else nReturn=GetExpValue(t, csym[0]);
/ n% e7 p) P# G! p! I1 n    return nERR==-1?1:0;% b# c- u; W- M& \) Y7 T9 j
}}
3 [% i9 w( r! m& ?  }% Z5 ?
# J- Q- E+ d- ?3 A
3 |4 O# A' v8 @8 n. b0 P+ l# D. Y! J9 ]# g8 u  N
函数模板使用示例:8 y" `3 x: z8 C7 a7 i
在以上那段代码的后面加上以下代码:' m' A4 h; E0 A. h  G

$ Z" ~3 z/ u! ?" W) F* u) x0 q 4 T7 t7 k- Y: h- O, O! B- X

% y; `0 I; L. S% W) C程序代码:
" J8 x. Q! P+ @' H3 u2 u  Z: ^5 r" z) _/ ]
#include<strstream>$ ?7 Y& h2 ?. a' N
#include<iostream>
4 W7 ]/ [6 W5 E#include<string>
  a3 M6 h( K# }- S* p4 pusing namespace std;' h0 B0 [3 a# r3 [+ b# i
int main(void)1 s: |+ ]! Z, N& B% x- c0 i
{+ X0 |+ @$ z' Q) u4 z3 I/ U
    string s1;; Z8 H; U8 w$ ]2 K; K
    while(cin>>s1)
4 r0 n, k" f1 d! v1 D8 K$ {6 j    {
3 m5 |, ], Q! A1 U! C' R% E        istrstream isin(s1.data());" _) g  J. }2 a2 \4 j
        double d;
0 f# o) H+ C* |        if(fy_Exp::GetExpValue(isin, d))
' Z8 r9 T( ^! R5 W        {
! H* F: K" [+ c* x8 q: {            cout<<d<<endl;
) f! W6 n; M7 R% I' b        }
! b2 l9 _/ g  ^$ g5 B6 k        else
) d* v9 u9 l: k" u3 \        {% e( Q1 N0 L% z; A" @
            cout<<"ERROR"<<endl;0 @! n% E8 Y3 u& s  f& K
        }( ]; P  E6 g  O5 Q3 c$ @
    }& S8 p/ P2 G' K2 s# @% W, `, W; [8 j' d1 |
    return 0;2 [, t2 T' u3 S* a3 Z5 S
}% g2 N* L+ O) Z1 C! j, M
( E! z; @& w) y$ d$ ]

" i' B* w" c, Y' q- {, C( n; R/ l然后编译执行就可以了(*^_^*)! e$ L  f9 m! b5 m, R: g
其它:TC++上一定编译错误,不保证在VC6上也能通过编译4 N$ Z# C6 o- ?( ~( S& N8 @: V
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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