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

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

在9月8日那天我特意编写的,给大家分享的,! Q% B3 l* B- o% _2 h  F: f
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
0 `7 F% K. J5 {/ H只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)" J/ w' q  `, B+ M* A: ^: s. W$ D
参数解释:
( k; N4 x- R! S5 r8 J0 Eistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
" h) D0 v. ?* Y, wnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定2 s$ `2 _* ^% @. M5 G: u5 X
返回值:
2 H( e  d2 _: k% j返回非0表示计算成功,0表示计算失败有错误5 G( n8 r+ D2 H0 Z- c7 a
1 e9 I, b1 Z5 U* N8 C, w" }
& F& J1 B9 v  J  H+ q% S2 F9 T2 p- @

* P0 L2 z' J/ z) @; b; o程序代码:
, j6 C  v3 e1 @; M- x8 g: I% F( u0 `& t$ K" b
namespace fy_Exp{( U9 x$ _" K' f, G7 ^, u; ]
namespace {template <class _T>  r0 {$ I- q; G& U/ \6 W
inline _T GetExpValue(_T t[], char& csym){% U6 [% I6 w! S+ r
    char c=csym; csym=0;- ?3 _  g0 Z* \7 u7 f
    switch(c){% t  D! ~. V% H. r; F: I
    case '+':return t[0] += t[1];% ^& S0 i: S* I5 k' Y
    case '-':return t[0] -= t[1];
/ ~0 M1 U0 A, I; H$ l- k    case '*':return t[0] *= t[1];' v: Q1 d, U6 L) D8 K
    default: return t[0] /= t[1];//case '/':
2 @) W0 h! w. n4 h/ i; Q* V) H/ M( B    }+ p+ T9 F: U$ Y' E4 l; Q& W  w& I2 x4 D
}}
5 |2 A% a4 N" X& f; |& l7 a! }template <class _T, class _Tstream>% g) k; ?9 G' C9 i
/* _Tstream: inputstream, _T: get return value+ ?" _; o. d& y
* Return nonzero if get value successfully */
. c$ {& B2 E7 I+ w; ~' {int GetExpValue(_Tstream& istrin, _T& nReturn){5 x$ |% I' w3 y* Z! G; B1 }. T1 j
    _T t[3] = {0}; //雨中飞燕之作. e% a+ c3 Z! r* S; Q
    char csym[3] = "++";( t$ O0 M; s8 ~$ q$ J6 w% U
    int nLevel = 1, nERR = 0;
# c! H2 ^+ T* [" y1 x+ ?9 p    if(!(istrin>>t[1]))istrin.clear();
. _  H: m' a  z- L    for(;;){2 w' q: T# r/ q
        if(istrin>>csym[2]){. i* F1 B# j: A
            switch(csym[2]){
& U, H4 E) z  }! y' z* k; J            case '(':1 w& ?( Y; Q9 q$ t
                if(!csym[1]){nLevel=0x100; nERR=1;}else
  k: P# ~' S. H/ u                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
* x9 O. l2 e/ f, i8 w                else{nLevel=0x100; nERR=1;}. g7 k% h& Z8 z& k4 P4 Z. _
                break;% E; _( Q' B  j
            case ')':
% ^5 H/ Y! d- L" {                {nLevel = 0x100;}break;
7 ?9 m# z, r! \1 X            case '+':case '-':case '*':case '/':
9 f  K- L( E5 w' t" ^                {csym[nLevel++] = csym[2];}break;
& w8 `) I/ D; ]. G! y6 z; E            case ' ':case '\r':case '\n':case '\t':continue;& r9 }! v9 M+ P" H4 k5 W
            default:$ k2 u) j! k& ^1 r7 E  h% N" a$ |* P
                {nLevel=0x100; nERR=1;}9 V$ n: g# Y" Y
            }
3 B! s5 @+ \) O% L            if(nLevel==0x100)break;1 n7 X5 i2 G, _) D, K3 B) t% n( G- S
            if(nLevel&0x10 || istrin>>t[2]){0 r: v. T' N( a, {+ H0 ^) Y
                nLevel &= 0xF;
1 K$ h! g$ C1 _# C3 ^                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
0 Z, G  g  \; S' i6 J                if(csym[1]=='*'||csym[1]=='/'){
9 M1 R- n; O1 j2 X! c/ P                    GetExpValue(t+1, csym[1]);5 B6 {4 x& e$ b  t: E5 e$ w
                }1 [5 a, N/ S0 `1 O1 e5 N
                else{% o; _' E. P  }4 H% l: m
                    GetExpValue(t, csym[0]);* Y/ ~) Y  A' J5 l* z
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
- @3 Y, J' C* I9 Q                }
5 T. x/ X% Q3 A: v) @8 _$ |                nLevel = 1;
" X7 ?! _, B. w* H- b            }: W3 e6 c5 K: _1 x! [
            else istrin.clear();' t+ J7 W/ f+ h8 m6 m3 c! [" G( C
        }' U  r# F* y4 c8 b
        else{nERR = -1; break;}
) t, N- u, f6 W- i" W+ `    }1 }. P+ P2 S) m/ i4 c; R
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
& y2 M2 ?+ b8 o9 B- v+ D    else nReturn=GetExpValue(t, csym[0]);8 l# m& p- r. \, q
    return nERR==-1?1:0;
9 |, H; x+ k  A}}
8 Y$ P" D3 P& c
" Z) i2 X2 V9 C. @4 F: J8 T' V, o1 P1 W4 W5 [+ v. I& c, m; n

  g  M% H; ~& ^5 ~2 _* \函数模板使用示例:
& [. \! d6 i1 T在以上那段代码的后面加上以下代码:
* R! T5 A4 J5 E4 z) ^" M( C$ S" s8 J- V% C' s- _3 A/ I8 Z

8 h* o) N; [& t1 M& F: M. M, Q
+ D# S$ w; }* }% [1 v: w3 \程序代码:
/ J+ _2 o- x! _7 L5 m* S6 W. L, L! p; Z! \& r- I# E5 U! m) v
#include<strstream>9 d+ E3 |: [! w- n' a9 X
#include<iostream>3 I* |" b7 |6 Z. I
#include<string>1 m" f1 i% R6 y' t+ e
using namespace std;
+ i9 k2 A/ Y8 {) L6 j7 P- \% rint main(void)+ P# R: R* S' f+ g$ K
{3 X% u# e6 L+ s# s# |9 K- r4 S
    string s1;
: R1 d" `2 P, O$ W- B6 `    while(cin>>s1)
2 D3 ]- @, A+ o- a! |. n& N    {& _) d( o! i1 o" i
        istrstream isin(s1.data());- }  U! k; [0 p" W2 |+ f) r) F
        double d;
* o) q( D& f$ v% d6 g        if(fy_Exp::GetExpValue(isin, d))
6 F" q: L) D6 ]5 U0 f" z$ T        {' q& M, E$ o" [: x3 t; P; |5 U
            cout<<d<<endl;) @* i# r* s/ U) [. ^
        }/ Z$ M  }& f" Y% b) {) o" w/ m
        else
5 _* k( M" S8 m2 O  _% f        {9 J- a2 F" r4 N% }( f$ a9 q
            cout<<"ERROR"<<endl;
! J7 x( P: c% G; O/ R9 }0 {; a) Q9 S; {        }
; ^: u7 u8 [% G: J4 h% x    }
3 h& z7 E! F0 f6 U    return 0;
4 a6 B4 o* e8 l( W+ Q7 E4 t* y}
8 A, K2 L1 c, l
5 b$ O$ u7 z& b. o+ ^" t4 A; _7 d% |% d
4 _* s3 b9 w5 T+ A. E  O+ R1 T然后编译执行就可以了(*^_^*)  h) q4 W( w- w( o* z
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
: m9 C& W& \, E  S1 O      建议使用VC7或VC更高版本,或者使用GNU C++编译

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