返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,. ?  h- Z8 l5 Z6 g' L; B1 r7 S
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
6 W: z$ r) C6 N+ B1 e3 L# s6 v0 V只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
7 v, Y3 t( e' J/ z: y) d9 c! d参数解释:
" ?: i% f& \" }4 O: Mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流3 K# t) z& m4 r! W' ]- M9 k
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定& D% n2 [, h9 _. U3 x
返回值:0 S+ e% {# [3 f
返回非0表示计算成功,0表示计算失败有错误8 t2 k, Q" G; a0 A$ h9 _
7 u% c" [! r* A4 y

/ |# {8 j8 `! ?
% [( D+ g. A. j程序代码:
- n% b8 \" C0 r- K/ A
3 ~7 @& k" P: v- w; E8 L1 Inamespace fy_Exp{% r( `( F( z! E1 x, |3 A4 t; V
namespace {template <class _T>  g  b. U. G4 K) y1 h
inline _T GetExpValue(_T t[], char& csym){
' J/ k# g2 B% r8 J/ x6 A    char c=csym; csym=0;
* v$ {$ W/ q4 G* a    switch(c){
! k8 Z* T6 L, R3 H& Y    case '+':return t[0] += t[1];
8 \. k- F2 j* m9 A( N: e    case '-':return t[0] -= t[1];
; g. v. n) I% a. R0 O& D6 s; ]5 x    case '*':return t[0] *= t[1];) R" r1 n8 i, Q
    default: return t[0] /= t[1];//case '/':* o" r& z+ [, n& o( C
    }& p( q1 B$ B( L) ?7 _$ b; M; q: I
}}
, M; H( M7 A9 P# etemplate <class _T, class _Tstream>
8 z+ ^5 {$ N5 K5 T/* _Tstream: inputstream, _T: get return value
# d9 v- q9 i# C* Return nonzero if get value successfully */4 [3 v- |4 g% i: g" y  H( S
int GetExpValue(_Tstream& istrin, _T& nReturn){
. D& e9 b0 T& T  I& K- X    _T t[3] = {0}; //雨中飞燕之作
+ r3 N3 T5 k: P; m2 ~/ I* P. p    char csym[3] = "++";, x& T% b) m# {- r) `
    int nLevel = 1, nERR = 0;$ X6 c$ I3 ?" m$ M# f8 [7 p
    if(!(istrin>>t[1]))istrin.clear();: P- E' e# ~1 N
    for(;;){
1 `/ }5 k2 p( ?        if(istrin>>csym[2]){
0 q& k0 p$ V# B+ D            switch(csym[2]){& J, r: W( \9 B, z- h
            case '(':# u3 }9 T/ ^) O/ d$ P1 p
                if(!csym[1]){nLevel=0x100; nERR=1;}else% \, G5 P) p$ e7 s' ?- j- ]
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
3 K6 ^' V/ b  O                else{nLevel=0x100; nERR=1;}
4 Y7 S$ Y+ [- Y8 H. e2 M  ~                break;0 y: u2 V( F3 x) T" V, C; \- g- ]
            case ')':
4 H; V5 c2 ^$ ?/ m" t                {nLevel = 0x100;}break;$ o- c* t6 L" h" w7 C' a0 _
            case '+':case '-':case '*':case '/':
' m% o& A) v1 n: x4 |# G6 h# n                {csym[nLevel++] = csym[2];}break;" _2 m- B5 }2 g3 ~
            case ' ':case '\r':case '\n':case '\t':continue;
( P$ a' _: ~$ p( [( N            default:
3 Y. H& e) V4 S" k+ _# h/ f                {nLevel=0x100; nERR=1;}3 v9 a* X; @- y5 ]( r
            }& P6 t' Y/ Z+ f" E
            if(nLevel==0x100)break;0 H, s- q  i& M* ~
            if(nLevel&0x10 || istrin>>t[2]){
8 N- u3 u; j, W+ S+ P; |                nLevel &= 0xF;
, T  r# W/ @( h+ A3 e* X  ]7 C* {                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. V( w  \: ?$ o" p$ `0 S1 S3 E
                if(csym[1]=='*'||csym[1]=='/'){# l( \  f1 C9 n" D
                    GetExpValue(t+1, csym[1]);* R& g: V( o6 g. \% e7 l/ Y' b
                }( ^; i0 n) I2 O- m6 ?, T% X3 I
                else{' c5 ]1 E& I( ?0 s% _+ O1 T
                    GetExpValue(t, csym[0]);
+ `' H1 I8 W  L+ f  e9 U                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
6 R) i4 L9 x. s& C0 d                }
+ K! D. e; r7 u- F7 ~                nLevel = 1;
, K3 }$ r0 J2 Q; x( t            }
2 w3 L# Q8 V# h7 c0 T            else istrin.clear();
4 {: t4 s6 ]" }, ]! o$ H        }7 L6 Q: z+ H$ m: i8 B7 E! Z
        else{nERR = -1; break;}
1 c& h8 j; Y0 N% v; ]4 }% `    }0 M" M! Q2 }1 g3 O) k( d  A4 k3 B
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);, F0 z6 R$ O7 G
    else nReturn=GetExpValue(t, csym[0]);
5 t$ m/ y2 e$ R/ v& ?    return nERR==-1?1:0;! x% k! X( |/ m% ^( r% r6 O
}}
1 G; A, s! U3 {0 H: f/ C6 a2 c5 `/ e3 q1 X

2 F, H/ W7 k6 D, U- i$ a1 h* e5 Z, K0 @+ C  b0 N
函数模板使用示例:
  n6 N) k% Y) O在以上那段代码的后面加上以下代码:( s9 ?: c# @9 \8 B$ C, w7 Y9 f
9 B) q- q6 x/ l3 V# H0 m
8 ]1 I8 h0 i. _
0 p7 n4 b! v, W1 j: k0 L
程序代码: 0 ?1 j$ x, W& Q. s' c

4 z+ V: Z' C8 p& C#include<strstream>- u- n6 @" d( b) `1 _
#include<iostream>/ E7 l2 W. ~& W) ?
#include<string>* k% q" b9 }! _# x3 I2 R# j7 u
using namespace std;
" l+ @/ R" z: m: y  O& Tint main(void)
" U' C$ i" `: Z0 ^3 t{
0 J7 e1 O& u9 @    string s1;/ F( h* X. G) Z% p. q2 a
    while(cin>>s1)
$ q( ?) T% [/ ]7 P2 N$ M    {
+ @( I0 d& ]. b- |        istrstream isin(s1.data());7 M9 f& G& H- _  E- `
        double d;2 O, V- ^- F* Y
        if(fy_Exp::GetExpValue(isin, d))+ A8 V+ E8 ~0 g/ w+ b
        {/ m7 b. W$ X6 g0 [* a
            cout<<d<<endl;) i* s$ i+ e1 e' b1 d  m' ]- Q1 X
        }
' k6 X2 _; h5 b" Q; D        else. W- j8 y$ @" {7 P! S
        {
2 N/ n2 n4 }: Z* w/ v5 y+ F            cout<<"ERROR"<<endl;! x! V) _9 \8 X2 O* @
        }3 k! z. n# ?5 m/ o
    }1 D% f- i: f6 I6 \3 B4 }
    return 0;2 G0 _3 p7 u* D% F# y  }
}- W: d$ U! \: j9 |; z9 M
. q# l9 b  z4 t/ t' H5 C. K
3 o3 C" C  ~3 t0 Z( |! R
然后编译执行就可以了(*^_^*)! q6 ^9 ]) W2 v& N# L% u
其它:TC++上一定编译错误,不保证在VC6上也能通过编译/ k: ?' t3 e! c) d
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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