返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
' G& e  d% S3 q: @一个很方便的函数模板,可以并且只可以计算含括号的四则表达式& E6 S5 ^- D, B$ F% q5 f: K- B9 u
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)4 q% _5 O3 Q( I) [" _$ Q! L* U
参数解释:) E$ N) r- K- a) s$ a
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 n' G; r) r4 @nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定0 K/ `' L& q6 r6 Q# Q
返回值:
' \9 n" s3 p6 H' V( x返回非0表示计算成功,0表示计算失败有错误5 a  v( |; \" J* R& ^8 ]: s
" [/ e7 k* O# ~3 E4 N: M! f

% p! ~6 A7 a, [' ]' F" t: X2 Q
程序代码: 4 {) z7 y) ?, \
. R  T2 O) z  a7 W# d
namespace fy_Exp{# _5 D( v) O- u- w1 B' {0 [5 \  c
namespace {template <class _T>; }+ ]8 s* e! {8 G  }
inline _T GetExpValue(_T t[], char& csym){  m6 a. @# q8 {3 h
    char c=csym; csym=0;# n3 t( f4 W  a1 S1 u2 r
    switch(c){; \0 u" R( T$ j7 D
    case '+':return t[0] += t[1];) c0 x$ k7 c, O, ~1 p" N) F' [
    case '-':return t[0] -= t[1];( c7 `9 y  s" s' \3 Z: l
    case '*':return t[0] *= t[1];
- Q; c7 m7 l* }: R6 i' y  r    default: return t[0] /= t[1];//case '/':% F1 F% P7 ^' {2 f
    }& ^/ m+ ]2 S- ]7 o% C4 q
}}
# c8 ^" _2 H/ `template <class _T, class _Tstream>
( @5 H1 [: @1 h! j' v; V9 |/* _Tstream: inputstream, _T: get return value7 _' X0 v3 I0 B" b
* Return nonzero if get value successfully */
$ M# I7 @& f9 w* S( B0 G) eint GetExpValue(_Tstream& istrin, _T& nReturn){3 Y5 F4 Z0 P6 p$ G3 d1 O1 w
    _T t[3] = {0}; //雨中飞燕之作  b2 M/ M8 b) M( h/ [! O
    char csym[3] = "++";7 D% ]5 Y' d- L! M8 O8 E( k( z
    int nLevel = 1, nERR = 0;
7 n$ }5 {; F) `& ~& n    if(!(istrin>>t[1]))istrin.clear();% ?! N/ }: r" E5 X- T# Q2 w
    for(;;){/ t( L! A9 D* k/ T" [/ B4 m; I
        if(istrin>>csym[2]){8 o2 Z9 ^1 R2 N# _9 S/ P
            switch(csym[2]){" Q0 a0 N4 P" ~! j; b
            case '(':
) {) I) e5 T! K; i' w0 F                if(!csym[1]){nLevel=0x100; nERR=1;}else
7 H4 ?  U( n0 S' v3 f% _                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
( I2 W5 G5 x! F                else{nLevel=0x100; nERR=1;}4 X# U6 Z  c$ T& [
                break;2 Y) `$ |6 {4 f' a
            case ')':+ _. u: l$ G3 e) }* `, {
                {nLevel = 0x100;}break;
( v6 k$ K; i  L1 ?+ W            case '+':case '-':case '*':case '/':: T" A% n) b& ]
                {csym[nLevel++] = csym[2];}break;
, v3 A" x) \: p* d5 e& L8 g            case ' ':case '\r':case '\n':case '\t':continue;6 {# I6 ^8 J8 A! {7 _
            default:- Q8 w2 u, |% U: [& {4 V
                {nLevel=0x100; nERR=1;}
" X; P; k& }" X            }- |  m1 o& }( O% g
            if(nLevel==0x100)break;
# _4 p. A& f% Z5 S7 z            if(nLevel&0x10 || istrin>>t[2]){
+ D: K5 d' H5 m! P9 i: \1 l                nLevel &= 0xF;
( b- T6 B( |- B4 X3 }                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}( A9 F/ ^1 F9 L/ s6 `- W3 ~+ H
                if(csym[1]=='*'||csym[1]=='/'){
+ C; a9 O; C! y                    GetExpValue(t+1, csym[1]);: ]" e- l4 G0 j/ q9 i9 E
                }
: S# c9 F/ B0 j( v* f                else{
. C8 w$ D  Z7 x# p' R                    GetExpValue(t, csym[0]);
2 e( z9 p* ?# u* {2 y2 f                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
* W' J, o; Q+ ^! m$ q# X                }1 F/ |  o2 b$ j, s' e( w
                nLevel = 1;" A; B% b4 j! x( k6 l8 a7 t
            }' a3 {& V4 g/ r* e+ a7 W) h
            else istrin.clear();
* `1 F* @% `* Y2 G7 `        }
9 G: a" j9 p; x4 l# M0 }        else{nERR = -1; break;}
) h! J& \2 `- n9 F    }9 F7 R, k+ C" ~5 F0 C7 _
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
: j8 N- b# T# ]0 k/ Q    else nReturn=GetExpValue(t, csym[0]);
. Y) O1 N0 g& y    return nERR==-1?1:0;
4 q& F" s! a- i! V9 ?6 @/ M! B/ l}}
" Z3 K3 F$ j+ J- C0 s$ N2 `: c5 m* e
; q% ~( U  v% A, t9 \/ E& p$ {# T
0 S* F4 g1 ~. g+ H- b" k7 _4 [/ }2 _9 j- g) p
函数模板使用示例:0 K& I, A% h: o( @/ a) Y
在以上那段代码的后面加上以下代码:
# N; g3 l6 B5 W, K9 p* D! ~
$ I( r1 @4 m8 L( ?  l) O5 A9 j$ j8 P( Z. A # Q* W1 u, B! e1 V8 R, q0 |
% E" U8 K$ P$ @6 O' |! u, H# R
程序代码: , P8 _( {" ^: U& s2 K

* D6 n' h2 c) {  P#include<strstream>* g) Q  L( G- K. n8 P: G3 J
#include<iostream>! x( H! c$ C6 d; W- z1 E# [- I
#include<string>
' u' G0 b7 {, a  Z. I& z  e. r7 [using namespace std;8 D' Q: L* z2 _' X/ _, {( X' U
int main(void)( j) C9 _5 A( a2 K1 X7 E
{
$ M1 @5 [4 M% K    string s1;
/ i8 o7 u' s: O; G% J    while(cin>>s1)
% }6 r# {7 [; r( s9 S    {4 E, e) [; i9 o9 f5 ~' e9 o& o
        istrstream isin(s1.data());! k1 j: ]4 j2 P, U2 h
        double d;; K7 P! O7 W0 a7 Z( p- Y' T4 }& [
        if(fy_Exp::GetExpValue(isin, d))
2 _: |+ l6 u) x$ M        {5 h& V/ C" ]: {1 I9 w
            cout<<d<<endl;+ Q) b7 l) y# H9 c8 B
        }
+ X7 \5 M: R* l        else( u4 I, j8 X5 g8 |' G* T+ ?! y- ?1 w! Y
        {
2 c" S( x! j, W: D8 \( e            cout<<"ERROR"<<endl;
  l! ?  E% [- `9 Q        }
! ]' B$ J" x5 O* n% W" N    }1 P0 n5 ?# @! h; R% W
    return 0;! U% _5 K* C! P
}
5 Z, D* G% h) s9 {( n( k. L3 \, f# _

5 o1 T* G7 p' T( x2 a7 N/ u5 q6 ~& j3 d然后编译执行就可以了(*^_^*)7 B; q9 O' R8 v- {% e! p' r
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
, f# A; W) G5 [/ ]- ]: v% X$ F7 z      建议使用VC7或VC更高版本,或者使用GNU C++编译

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