返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
$ x* S! _, F: o( n% r' ^) N一个很方便的函数模板,可以并且只可以计算含括号的四则表达式! U' z) H+ A  g9 m, Z: m
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
/ ?0 {- {2 U+ M% [( B4 t2 J参数解释:
- Q6 E: g9 L$ n* Yistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
/ l' C6 e9 |' k( z: OnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
: c& K* t- R7 L+ C; t返回值:+ q1 B% D$ w  E" `, v5 k; B. r7 ?
返回非0表示计算成功,0表示计算失败有错误
) I. J% _$ r  e1 y# `" i8 E; s  E
: @/ t! U- l- l& R4 e$ S2 r: a! l

" L7 r9 N9 I* Y+ Q程序代码: ) c/ f, m! ^8 D& P
1 o5 `4 H1 O0 T- V+ ^
namespace fy_Exp{/ z2 d1 }4 W. U( m# \. v
namespace {template <class _T>" W/ K2 C" D% y5 \& J
inline _T GetExpValue(_T t[], char& csym){
9 T7 A$ _" ~9 c( H9 H    char c=csym; csym=0;
$ p% G+ i0 {* M" k, s7 H$ _    switch(c){
! h/ d- Q' u" ?2 U    case '+':return t[0] += t[1];2 ~$ i9 D% ^3 Y4 ^: M' a' o' x' y
    case '-':return t[0] -= t[1];
8 f9 @: R3 I' a+ l7 }( v    case '*':return t[0] *= t[1];
. Z$ `7 m4 ^, b3 K    default: return t[0] /= t[1];//case '/':0 G' y' I" h" w7 f
    }
7 I9 F' }6 u6 b" @9 O}}' z9 u0 T2 c, _- n& Q* ?6 M- C, i
template <class _T, class _Tstream>; Y+ i# y! a% @- K6 D
/* _Tstream: inputstream, _T: get return value
8 O$ B- w# a7 o* Return nonzero if get value successfully */1 x" V8 K' s$ O. x- }6 a0 f* U
int GetExpValue(_Tstream& istrin, _T& nReturn){3 B+ Z$ ?' n( E; a
    _T t[3] = {0}; //雨中飞燕之作
" m( ]0 w* V( z3 A    char csym[3] = "++";! K" s( z& M# o' ?( L
    int nLevel = 1, nERR = 0;, O6 d+ t7 l. I! ~- y9 s5 O/ L
    if(!(istrin>>t[1]))istrin.clear();
7 d6 {7 F5 @0 \1 D9 v    for(;;){2 g9 C: P: y9 \  i! b' O' ?
        if(istrin>>csym[2]){8 E) O' y3 y- o1 G0 X
            switch(csym[2]){
$ Y- x$ |- c4 C& q  \% s            case '(':
, a. e6 d) X# E  c) R2 L                if(!csym[1]){nLevel=0x100; nERR=1;}else
- {0 i& O+ N+ d# D$ F                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;# @& e7 g/ t4 ?+ v$ _
                else{nLevel=0x100; nERR=1;}: Z9 t- i, y4 w# A: c
                break;( g* c0 i0 J6 S
            case ')':
  I0 m- L7 y' q3 Q% b6 C" f8 {9 l" s                {nLevel = 0x100;}break;% l) y' U8 ?( ^* X
            case '+':case '-':case '*':case '/':
' }( ?* @( M) D+ H+ E                {csym[nLevel++] = csym[2];}break;
9 y" O# V2 S! \1 r8 K% A            case ' ':case '\r':case '\n':case '\t':continue;
/ W) z- \3 A8 R* a! i            default:2 G) j& a, q. U5 w0 i
                {nLevel=0x100; nERR=1;}; K4 X8 J( A: b! w: v& q
            }
4 u; e  K8 f( g- Q  o9 @, F' `. [            if(nLevel==0x100)break;( W% h5 `+ N, M4 J- `* {
            if(nLevel&0x10 || istrin>>t[2]){
" q, A; W5 r/ ^+ q# b% ?                nLevel &= 0xF;
( X7 y8 k" o+ [# V* Q6 ^                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
4 L$ _% O2 F8 H$ O# U% r+ S* T                if(csym[1]=='*'||csym[1]=='/'){
# Y; m$ O4 j9 g' w; b- X: T' w) v  `                    GetExpValue(t+1, csym[1]);
& f. }' k, i) K+ n* F                }4 W/ {2 f$ A9 X) d6 t. r
                else{, @+ b; O& U, }: Y
                    GetExpValue(t, csym[0]);/ {" B/ _; F  u% \
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;+ P; x( E% b* P$ s# k: I* O% T
                }: n/ l& T: x# K6 t
                nLevel = 1;8 Q5 b: }, p4 S( a+ j
            }# A$ x" e9 i1 T6 f: |5 B8 z8 V
            else istrin.clear();' N. t/ K4 A! ]
        }
( ]' [8 p5 V- }! H  G& W        else{nERR = -1; break;}* o2 E. l7 K  Z! z, |; X; \1 [
    }* A/ S% `( G& v8 X. n# ]1 i
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 [0 G3 Q: ~1 N9 O; b+ _/ Z* k# V& G
    else nReturn=GetExpValue(t, csym[0]);
9 p+ H, V" v' p6 A    return nERR==-1?1:0;
& P1 r6 D6 v; K" b  g}}
/ x+ y# N0 ]; i& E3 p9 |; d/ s! w% N# d' d: X- M7 {

0 R" V# j- ^$ q4 |4 }
' F  n) o2 I: M0 p# c7 D+ _函数模板使用示例:; i$ {* a0 g4 z  k  t  \0 V' o
在以上那段代码的后面加上以下代码:
0 f) b6 G3 n# g1 `
; m9 k" m& S: X
& ?6 z8 l( V: Q3 v. G8 {! _
# H# S5 J4 v5 m8 I程序代码:
! b8 Q$ _% D4 k  I5 d* Q& V
, `' M% I, @4 o' n" M- e& t6 o& y#include<strstream>
/ r% T9 |# n, S. W  a#include<iostream>' |, T. G+ B# ?/ X
#include<string>6 J5 {# F1 Q" ~+ Z% [7 r/ P/ V
using namespace std;  b1 E  R+ L/ |! W
int main(void)
* k! |+ d" z3 C( {{
% Y+ Q( {( O4 i* l    string s1;; c. K+ S* j. G9 ]
    while(cin>>s1)
+ v. X# U- g! A/ f! ?2 i    {
( Y4 ?( v/ X* \        istrstream isin(s1.data());
0 u- R8 a# X- p' h4 P/ \  x        double d;
& @7 |! w' x! m, p& s2 J        if(fy_Exp::GetExpValue(isin, d))
* T+ X1 d/ r9 ?: y        {. W5 u8 W3 S1 l: @( P5 w
            cout<<d<<endl;' f* f3 ]* D1 F2 T8 i. V
        }
: ^* ~) F4 {; Z1 T) V        else' q0 q$ F0 D3 c* J  D: L
        {" C$ B* _% }! g- L/ J
            cout<<"ERROR"<<endl;
8 d! T0 o8 h$ b1 V        }0 c5 e) j2 @- ]$ i( J/ l
    }
0 R( C. E& F3 a; t0 A  _0 O    return 0;4 G- W% e3 o$ x& H
}9 ]9 f: ^7 f" u( d2 e1 g. {( X

- ]* X: _8 N# X9 s% [/ L5 J/ F
* P+ c- N  K2 c! M然后编译执行就可以了(*^_^*)
" @6 z9 ^/ o% b& _8 T6 r其它:TC++上一定编译错误,不保证在VC6上也能通过编译- D- Q5 T. _2 t1 y9 |% c- e/ P
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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