返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
% ~. C/ A$ n+ d) {/ K& O一个很方便的函数模板,可以并且只可以计算含括号的四则表达式# g& I) Z; `6 f$ X
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" o1 L1 ~) C. V6 L+ S" U' q参数解释:, v8 @) s, S) `4 v
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流: R/ A: j9 ?6 Y5 u; H8 @
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
& ?" |  S& r( l! j; _返回值:
& @3 H& u: g+ e$ n3 g! @( ~2 x( U返回非0表示计算成功,0表示计算失败有错误) P! b! m; s, [$ Z2 t/ N2 i3 v

2 ?3 U0 I7 x) g: ]: t% w . c6 c. z4 Z9 C) u) {; m, U6 O

8 X+ p4 U- {( g/ {程序代码: + Z0 u0 z" l, P. y- w, N6 }+ l

6 N  z0 @3 h0 Knamespace fy_Exp{
5 @8 i& ^0 x- H3 Rnamespace {template <class _T>
) n" I/ |' {7 U! U4 Tinline _T GetExpValue(_T t[], char& csym){2 a0 P: Z: `- z/ x0 X
    char c=csym; csym=0;
* B+ ~6 l% W! n  X9 h    switch(c){1 D* t8 }6 W, ^  S  C# u
    case '+':return t[0] += t[1];( b! J" t, j1 e( z
    case '-':return t[0] -= t[1];+ }. D3 p( C* k0 i
    case '*':return t[0] *= t[1];& ~( E) }) q5 F$ z7 D5 o2 Y
    default: return t[0] /= t[1];//case '/':3 q2 F; k; d0 a% m  M
    }
- A# }, b: W- x6 ^3 o& t}}
  ?( k& r, R. Y' a2 vtemplate <class _T, class _Tstream>
3 K7 ^4 o2 _9 i$ h$ f3 L/ n* ?/* _Tstream: inputstream, _T: get return value9 r  Q& t# Z/ V+ a1 f, C
* Return nonzero if get value successfully */$ q6 V- {0 W7 k. s1 C
int GetExpValue(_Tstream& istrin, _T& nReturn){8 q3 n5 U" y: w4 M6 B
    _T t[3] = {0}; //雨中飞燕之作
) a% c) F/ B* _) f    char csym[3] = "++";
7 [( X- W  a( q    int nLevel = 1, nERR = 0;9 i. U3 y% V: Z& ~  ?" B
    if(!(istrin>>t[1]))istrin.clear();
: t6 u0 d) U6 l! s2 j    for(;;){
+ P+ }3 }; W+ K* w5 w7 }        if(istrin>>csym[2]){
) b" T+ [. x) v/ e5 r4 V; f! K8 [$ D            switch(csym[2]){$ _7 b% V" Q( K2 q. u; u
            case '(':# ]3 I! H7 ^/ `( w8 i$ p
                if(!csym[1]){nLevel=0x100; nERR=1;}else: |/ P% v+ T. C. Q9 d
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
3 t: N2 H0 S0 X0 Q                else{nLevel=0x100; nERR=1;}
; k2 Q# ?6 W3 b* }8 p8 E: e                break;# G3 v; z7 ^8 |  D8 i/ t& `! H5 l
            case ')':
# d% w" r+ K, y0 M. @                {nLevel = 0x100;}break;
* m! p) P; p# Y' }' `0 s            case '+':case '-':case '*':case '/':
" R3 y2 J0 r1 |- `. V$ V                {csym[nLevel++] = csym[2];}break;
. M6 M  F7 ?- T. E- ~: b3 u            case ' ':case '\r':case '\n':case '\t':continue;) t9 s" `) J2 B- k
            default:4 K& R/ [- }; M
                {nLevel=0x100; nERR=1;}  m/ L6 |. ?, Q$ v# _  _
            }
$ q0 {- z8 v8 O1 @( f4 L            if(nLevel==0x100)break;+ O, c. S  v% z. V9 Y5 _
            if(nLevel&0x10 || istrin>>t[2]){
  l0 g. v9 f. F  C5 {                nLevel &= 0xF;
9 Z, x+ O% a) B- g* ^                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
' W% l/ U5 P! U0 K: ]                if(csym[1]=='*'||csym[1]=='/'){
! S* K3 C0 R+ C8 |0 ^& o                    GetExpValue(t+1, csym[1]);. q2 [' M" F4 q$ k2 k/ y
                }2 V) x' C4 l0 v% a" m( {
                else{
( g1 r1 `$ u- d2 y7 V5 p                    GetExpValue(t, csym[0]);! \1 h* a  _! V4 Z9 q6 C, V# t0 a  q
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
1 T$ o  c& H. ?                }. V  ~: Y  c' L' [  Q7 ?
                nLevel = 1;
# T2 K! s- r  D: m& a6 N* G            }
. {: E$ X& K, |) T+ ?            else istrin.clear();6 K7 t4 P* g& j1 Y
        }+ U2 d" g* t6 }- d
        else{nERR = -1; break;}
9 f' S( p1 [$ B2 i% L' e    }
) K3 F  V& }* g2 w( J$ K; z, Y    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
7 D5 q8 t9 a- f/ R- I    else nReturn=GetExpValue(t, csym[0]);( u* }1 ?8 u1 g( t8 s+ l
    return nERR==-1?1:0;1 u' b- a  F% b
}}
6 P! L( @( m/ S( a3 _% @$ t1 _, c- v1 R+ {' g
- @& D& E" [: u' F, `
  e5 \' y; Y, N7 T( u' K
函数模板使用示例:4 |  c# Q! t+ j! B3 g9 q$ N; M5 |/ F
在以上那段代码的后面加上以下代码:
- T7 E( z/ a$ H; E. L: f, l% r$ q" `' g, c( ?3 I

3 x' w; M  v, Q8 X
" ?+ \; |; }% M4 r5 q% Y6 Q程序代码:
0 Z" _6 X1 d3 u1 x# h+ ^1 P' i! E8 u/ b' k) X( N+ C
#include<strstream>0 W. u+ K0 B0 e7 X2 [/ C5 I
#include<iostream># S- P9 Y' j/ |. t) p
#include<string>) J  `0 H/ E/ V- j6 K
using namespace std;
% E( Z# Q- ~+ h- Zint main(void)! n: P+ ~0 l. b- [  C, O
{; c7 o8 \9 i* {+ M* W
    string s1;
0 y1 o- E/ @4 `: @! W; `2 h2 g    while(cin>>s1)+ i; i. [4 R  f' y
    {
, P" r% }2 Q3 ?; U9 s/ t        istrstream isin(s1.data());# R; Y/ y" Z; Y
        double d;
6 e9 m9 |0 c! V# o        if(fy_Exp::GetExpValue(isin, d))1 G7 W" y- [9 [2 N* f
        {, G+ b4 |' u' M% l& u% w
            cout<<d<<endl;2 V& j- J& v% u! w1 }( K' q# p5 B
        }5 u& b) l! Z* ~% Y
        else, c& |# {8 I# C7 ~
        {3 q  ^# p" T* ~7 W- x* c. F
            cout<<"ERROR"<<endl;
: u$ F6 [: h1 j( P7 C  y4 K        }9 u* v8 R6 w( N" }
    }1 v6 _! `& e. m! V3 k+ j
    return 0;
% N$ W0 m& s: f2 J5 Y0 |7 O}- J, r; g* L, r" ]! {. _
7 n; o, a* ^9 g* q6 f7 l
' ^7 U. C1 \6 d& j- T/ u; M* K% W
然后编译执行就可以了(*^_^*)
* o% \1 k) k& K5 t其它:TC++上一定编译错误,不保证在VC6上也能通过编译
; c% G9 F5 a: A; t  m. A/ k( L      建议使用VC7或VC更高版本,或者使用GNU C++编译

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