返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
, Z# f4 K/ ]5 T  l) Z+ h/ \/ b一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
+ y8 w9 p& [# z4 l0 [- s" r只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)+ F3 H% e, v3 E/ A- u  Z: j1 R0 ?& d+ A
参数解释:
4 u5 z: e; [0 o3 Fistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流# j* n4 z- b& N; q
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定0 y: k$ O! b* v% |% r
返回值:
3 r; [/ s# |5 m+ Y- g返回非0表示计算成功,0表示计算失败有错误
, A& `' z0 e- D7 m, X- n, h+ E+ {6 |  F8 m/ h* y9 X
5 T& s. E' s6 v% G# C

: O+ V; N2 @( y0 [( X! Z" T6 x程序代码: ( k" j) V/ H$ `# v  J0 ~) a. @

: O1 t: z5 l% \+ a" }namespace fy_Exp{
- U, k+ L. L4 L6 [; ?, v; i; H& N+ @7 dnamespace {template <class _T>
2 w4 ]9 {  H1 g$ ~6 J! H  r) }7 vinline _T GetExpValue(_T t[], char& csym){
# I  K% W  @% v% _9 N    char c=csym; csym=0;
0 A( L. Y) g4 R& A% f8 x8 y) u    switch(c){
' ^0 o! G/ z8 a% N8 ]2 m9 x    case '+':return t[0] += t[1];" |9 v2 ]9 |' I0 B+ B0 v: ^
    case '-':return t[0] -= t[1];
' _% P. x4 n3 b/ i$ T5 z' b1 c  `" `    case '*':return t[0] *= t[1];$ k7 g+ }& p9 k4 D
    default: return t[0] /= t[1];//case '/':3 ?  {1 C9 s2 k* {  d
    }
( ?1 l0 A. ~: i7 P1 y: d}}) u$ A8 Q6 H  x* E( f
template <class _T, class _Tstream>( C; D5 k$ c; y1 B! Y; |0 b; U& h' t
/* _Tstream: inputstream, _T: get return value
. G+ @( j% S# M, d* Return nonzero if get value successfully */
2 u9 `# a3 c8 L5 X4 ^+ _+ gint GetExpValue(_Tstream& istrin, _T& nReturn){# V: w3 g" R' }$ r8 \& d
    _T t[3] = {0}; //雨中飞燕之作
0 a& ?4 C+ @) l7 l: L    char csym[3] = "++";
) E8 \. D7 ~& X5 ]8 d$ R. R4 g    int nLevel = 1, nERR = 0;
& b! K2 g$ W  E) @2 u( r    if(!(istrin>>t[1]))istrin.clear();
7 P$ Q) o" Z  N5 ^  \/ W    for(;;){1 I2 K( E- n2 S. j( P. x
        if(istrin>>csym[2]){
4 l/ U, P1 z, e9 Q" O, a            switch(csym[2]){
# n3 s& m0 b9 S" W# r- G            case '(':
! i( G* e  L! d+ A! G                if(!csym[1]){nLevel=0x100; nERR=1;}else
) I9 q( A7 k( Y4 Z3 G                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;( l; t$ A5 @% e
                else{nLevel=0x100; nERR=1;}3 v/ K" q3 |: v1 s. U1 e
                break;  D6 ^) U; v% i6 ^) c4 z+ v+ I7 P
            case ')':! R6 M; u& h- {
                {nLevel = 0x100;}break;
$ O+ U' W/ x6 T) l# E/ M* l1 I            case '+':case '-':case '*':case '/':& l) x! P1 `% L* G' x! h
                {csym[nLevel++] = csym[2];}break;  Y) q5 \0 E- `( Q% ]( `( u' F
            case ' ':case '\r':case '\n':case '\t':continue;
% P! X7 }# M* k0 Z' H3 W) o# j/ F            default:& \+ o6 H1 [% H' T; u3 @
                {nLevel=0x100; nERR=1;}' `% R. s+ Y7 v/ U2 U& I+ C6 @
            }+ Y+ @  F3 c( s9 \
            if(nLevel==0x100)break;4 \( N9 a; C+ i7 I' f: x- l
            if(nLevel&0x10 || istrin>>t[2]){
( W. Q- Q1 E$ f& ?) F0 o/ J8 z8 s8 F& j                nLevel &= 0xF;
. z/ P3 l4 c2 }2 @- C                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}' Y  X0 [8 ]4 O7 B9 J
                if(csym[1]=='*'||csym[1]=='/'){5 ^9 z! E, C" ~. E* Q& Q2 w' D
                    GetExpValue(t+1, csym[1]);
$ t4 ?9 u# K) u/ F7 R                }
. \) c+ u6 V& r* Y0 s* w' E4 |/ ]7 d                else{* o, @+ n) M3 K/ o$ F
                    GetExpValue(t, csym[0]);
8 i% K2 ]$ t4 H/ k6 U9 m- a) u                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
. N5 [  f. E# g% ~                }
- e$ c1 b8 G$ t& C0 j/ @" j8 Z7 ~, {) r                nLevel = 1;3 q4 |' Y* l) n3 W
            }4 m! ~, u% R4 d% F
            else istrin.clear();
  T7 j5 H& o& G2 i+ ^8 y        }
4 f) I7 r" z  k7 F' A* x        else{nERR = -1; break;}0 M- |' n8 w& Q8 c" m+ K
    }
' Z  x. U3 c1 `) D3 w- ]    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);& w" G6 g/ y" i: p1 r9 q; a/ u1 ~; O
    else nReturn=GetExpValue(t, csym[0]);
3 x9 C  e. W: @+ z    return nERR==-1?1:0;
6 K: _" h0 F4 v7 B7 @}}. O/ _4 n8 u0 {% e8 v& F
% Y4 L9 j5 f8 G) H0 f7 H6 d) y
) W. n# N! F8 E/ B3 E) j& J
0 E! }5 C  P3 p: O) O0 ~2 Y% O; g
函数模板使用示例:8 M) w, L8 e- d; Z, I) z
在以上那段代码的后面加上以下代码:7 f, ~' S3 ?# W5 b+ z4 L7 `7 r8 c) T
/ i; b+ b: a5 n+ o  C& \
, T) [6 r, ]& w) q) x6 P7 h

6 W$ ]5 X; Y$ q# j, X5 \程序代码: 1 z+ s) z6 e! O3 j' ^" k8 {/ M- c! I! Y
' s1 T2 {, T: M! i' m1 S* U" h5 k/ w) L
#include<strstream>
/ E9 z: _2 a% s' \#include<iostream>- Z9 B" j& Y& l  r8 R. ]- L
#include<string>" g: f8 P6 D) X6 K
using namespace std;
  A" Z) p4 G  K: L. N& R9 P8 T: pint main(void)
2 q( }7 C0 w& V3 x' ?' G{
9 i! y' r! X- x  S) `. x# j    string s1;
0 G5 ~% x! R" Y5 v% L    while(cin>>s1)
( \% ]0 V$ ]  _    {
( p/ `( O7 ^" i9 r        istrstream isin(s1.data());8 C4 \, M4 w* e* ~/ L  o% _  Z: ], _6 i
        double d;
- t! q4 ?1 z+ U/ `        if(fy_Exp::GetExpValue(isin, d))& [3 U7 m* y% j7 M
        {
- J$ u% ?  `& N2 E            cout<<d<<endl;' m& K# o. }$ N! i
        }
* a/ @# C+ H' v" N' {- x& x3 p        else+ ?! `$ o6 k8 K" k( C! d# B
        {
7 T- q  f% ~/ w! s# }- I7 }6 ^+ b9 q            cout<<"ERROR"<<endl;, J6 }* b% k' b( N
        }
8 o  y+ ^, D$ r2 M7 u    }) y3 l  x" b3 _
    return 0;2 `9 X! H6 E$ P4 O4 w
}( H  X) q' h( ?" z

6 w& w4 G- v. @$ P' V/ t& S) B; }: K* D+ L- e4 K0 ~
然后编译执行就可以了(*^_^*)
  M! y: o( ]) m% h5 U其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 G2 V- Q9 Q" X9 H+ _# @      建议使用VC7或VC更高版本,或者使用GNU C++编译

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