返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,; L. T4 j# q: Z$ J/ L' A0 K
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
5 t9 \- a$ s8 R/ i只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" m6 f7 r6 a1 l: S' C! k$ I1 [参数解释:% N' b8 F0 _$ ?) ?( R1 G
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流. |- Y3 v; R# w$ \3 i1 H8 D7 }
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
$ B# |) M/ F5 y返回值:1 {" v9 l+ _0 \1 ?- Z
返回非0表示计算成功,0表示计算失败有错误5 p5 m: f& U- D
9 P  o5 o+ x" H+ t7 B% \4 A7 O# C- P
" }; i7 z4 S- y- m3 f  o! S0 z3 H

/ b. Z( }; n& o/ D程序代码: + N3 i$ z/ D+ \  y4 @$ m
, Q) z' @- m( O6 S! X) p7 D, ~
namespace fy_Exp{
  w, A+ h1 G6 M8 Gnamespace {template <class _T>
9 a+ p: x0 s; P. @2 Dinline _T GetExpValue(_T t[], char& csym){
* @( I* v" ~$ v$ l4 j    char c=csym; csym=0;0 \5 r0 u& p" \7 ?7 y
    switch(c){) R7 `5 |+ Q8 F% b( a
    case '+':return t[0] += t[1];9 R. n0 y: p0 H/ y
    case '-':return t[0] -= t[1];
3 ^6 I6 {9 C/ `! |5 F$ u6 ~; e    case '*':return t[0] *= t[1];
6 r; Q6 s6 ^0 u3 M$ F    default: return t[0] /= t[1];//case '/':
, s6 Y, n1 K# S: Z" v    }/ B6 G: O3 i0 U0 _( G* ^1 l3 y, w2 o  _
}}3 E( V: z) K; Q) b  O2 k
template <class _T, class _Tstream>; k  P, I" e1 @( M
/* _Tstream: inputstream, _T: get return value- J  k, Q8 ^/ \  l2 t1 |  `
* Return nonzero if get value successfully */
1 |8 W# R+ L2 Q7 @$ Yint GetExpValue(_Tstream& istrin, _T& nReturn){
4 D% X2 y5 t' n    _T t[3] = {0}; //雨中飞燕之作% z$ z+ l& h7 X* t) W) X
    char csym[3] = "++";9 p% H5 F! g$ k) y
    int nLevel = 1, nERR = 0;
. Q  c) q5 _$ z8 S3 i- l0 X    if(!(istrin>>t[1]))istrin.clear();5 W* y! y  [; E8 W' B) D
    for(;;){7 u9 F; ]( I+ c9 e' H" n
        if(istrin>>csym[2]){- D* ~6 {3 k& f" r, }' k+ ^
            switch(csym[2]){* ?7 U: f0 Y4 O3 L
            case '(':
; I2 S( C. U# T                if(!csym[1]){nLevel=0x100; nERR=1;}else
# ], H1 |! ~# O& G' f) Z3 t                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;" L+ R8 L3 g7 D* J8 ?% G/ ?7 q
                else{nLevel=0x100; nERR=1;}" y/ J- e% S, I; f. l! z1 P
                break;* ?3 e) q, o0 ?  |& o9 v# D; F$ Z
            case ')':
- S- q/ _: D# p  d- N5 \                {nLevel = 0x100;}break;( L$ R& M. T, ^* w5 h
            case '+':case '-':case '*':case '/':
1 B' G; D: g4 y5 G7 G                {csym[nLevel++] = csym[2];}break;2 i% _  x8 U5 X
            case ' ':case '\r':case '\n':case '\t':continue;& K" X* q& T- K" s
            default:
2 E: n/ X! o3 D                {nLevel=0x100; nERR=1;}# o5 T: G7 l! T0 P; ]
            }
4 Y* O" y& r5 B! A" N            if(nLevel==0x100)break;
6 |; q7 P3 @: A* d            if(nLevel&0x10 || istrin>>t[2]){! Y+ H+ `: P2 m( l; Q! l
                nLevel &= 0xF;2 B( h1 [: n5 _- I( G3 {9 q
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}: T/ [' [+ ~) q1 m
                if(csym[1]=='*'||csym[1]=='/'){2 Z: d, _- o5 r) {  N( ?- N1 a
                    GetExpValue(t+1, csym[1]);
' O2 L9 u$ t% i- _* p; \' _: e7 _                }
) F' j7 o5 b* S& i$ ^/ H                else{0 c7 J* V, b* ]- X
                    GetExpValue(t, csym[0]);
& I9 x: ~  O8 ~2 K" W  _! X                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;  Q1 c) {' m2 \6 p( a. C
                }
" v& ]; C" m4 y' q                nLevel = 1;
% ?& ?5 {2 S( Q0 ~; O            }8 E9 C( O' f& S8 |7 t+ O, @- d, t
            else istrin.clear();
2 `' S  |! c( j        }* N( _0 E$ A% s' |& \
        else{nERR = -1; break;}6 Q/ Y/ n: Z0 A/ ]
    }
- {: N+ J& B* r9 s3 k) L' N    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);8 N' R/ j" f' [0 @" M
    else nReturn=GetExpValue(t, csym[0]);
5 D  `: }( Q% w& W    return nERR==-1?1:0;0 H7 n7 @8 N* s/ e8 C$ Y
}}
. ~) h, K0 D: K0 y: d0 W1 Z( D+ f, f& H/ \# S" t2 U; m
) H: ~2 Y5 G/ A- T2 g/ x+ x
% m& V' U, _: b0 g; _! F* S# O
函数模板使用示例:9 I, k+ ]1 a; d3 _8 ^% l
在以上那段代码的后面加上以下代码:
; C5 E; T9 j, U9 K0 U3 \7 L1 r5 y6 J! d+ l" G& A* p8 m% m
$ |; c; }9 x: b" a& h- D  Z

( s( K9 M+ c. [7 N# P6 C  ?9 C程序代码:
% D7 S5 i+ w; P! W: a3 ]/ k# X9 g& C6 `+ S) @6 V4 B
#include<strstream>- P1 g0 O. B: p1 u9 m. H! \  r" i8 {
#include<iostream>9 v1 V7 I: @: x5 k0 {$ e
#include<string>- G( t9 ?- x5 v6 T" G+ ?
using namespace std;
& m9 ^. \5 V. A  S  \# m) nint main(void)2 Q4 @. W# M- q3 O7 V4 l+ }
{$ c# o% v! I9 B, C$ C7 N1 S9 l
    string s1;
9 @8 x) m% I+ K* J8 N8 ^    while(cin>>s1)1 r; ?; J2 w; Q/ R* C
    {
( k+ x  ]& R& }3 j- O        istrstream isin(s1.data());: w  V$ s) n. _$ z6 |
        double d;& J3 H0 F' B5 B0 t
        if(fy_Exp::GetExpValue(isin, d))
; E6 P4 a  C  s+ g        {
. }7 ^! p' s! Q) U2 R            cout<<d<<endl;
0 C' d+ z: T+ Q6 U' A* \        }
1 `0 K8 T. x. }) R' W        else' m, H. }4 ?  M/ D2 Z
        {2 @9 K. _" v" m8 N- X# s1 _: g
            cout<<"ERROR"<<endl;+ y5 ?7 u& l5 F7 m- ?
        }
! l1 i3 t5 J  ~  L    }* d( L" r5 _5 m% f. A
    return 0;
( J& J0 @% N& X. t4 p}
) b7 A, U- ]' B: b7 R  Y1 l  x4 G* R% @2 x% n* I
$ E# M& B* p: Z# E. I2 p% }
然后编译执行就可以了(*^_^*)
! L+ Q. s$ E( d- V4 X0 b$ ^3 D+ f5 G其它:TC++上一定编译错误,不保证在VC6上也能通过编译
) @/ |1 h& y8 w, a, N  E      建议使用VC7或VC更高版本,或者使用GNU C++编译

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