返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
0 t; j& j2 b( E9 i5 c' U% C一个很方便的函数模板,可以并且只可以计算含括号的四则表达式- I7 C0 ]' i4 p) K
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
. y5 x. V3 T7 D% J& F参数解释:
/ @; v) c- k* Eistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
8 l+ \& |" X; R: L6 _nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定, Q. D! u) N9 e" P7 T
返回值:
& m/ i  L: _# X3 u返回非0表示计算成功,0表示计算失败有错误" Q7 U0 `3 H0 @4 c9 Z/ o: @
* u9 I4 ~* {! N- J2 q! T  q- B
& f1 y* }- ~; C3 A" w3 B
% r8 ?/ S1 b: u' m! k6 [
程序代码: - D- Y+ o) b8 J. l( K" S
  }2 u+ d, C1 p7 e8 j" h; E  n
namespace fy_Exp{/ |- `. m: N" c" b9 M
namespace {template <class _T>3 _& }- ]4 _5 j
inline _T GetExpValue(_T t[], char& csym){4 n& F; ?: j0 D2 z- O# T7 O
    char c=csym; csym=0;
/ _6 d  |/ X2 X( A/ l; E9 q    switch(c){$ O  q+ |& s+ L" d3 c6 I
    case '+':return t[0] += t[1];' g# n- T7 [5 k( U
    case '-':return t[0] -= t[1];
$ p6 w' f) T' P: o6 E    case '*':return t[0] *= t[1];
' O1 i- W/ o6 J. J' p    default: return t[0] /= t[1];//case '/':
4 y( M% ]5 Y( R% p- T/ E1 P    }
9 K8 Y) k; j2 c+ I9 B4 d4 B}}7 B" F0 e& R8 `: M5 m
template <class _T, class _Tstream>
, H, ~+ F# A" ^8 P0 p1 L5 G1 l/* _Tstream: inputstream, _T: get return value6 q$ P  b1 G9 [0 G$ |7 P
* Return nonzero if get value successfully */
+ R* q' Q+ t1 |int GetExpValue(_Tstream& istrin, _T& nReturn){1 V: k" J3 z! P7 N( Z) k8 T
    _T t[3] = {0}; //雨中飞燕之作4 S* g$ ~; ?1 G- M; S4 ~9 G; I! G
    char csym[3] = "++";
3 A( o( x6 k% u6 H+ T  l; T  r- v    int nLevel = 1, nERR = 0;
9 {; [* d9 d% P0 T$ q' D$ j# @. a    if(!(istrin>>t[1]))istrin.clear();& F* r8 A. A1 b1 }" r" r
    for(;;){
0 }+ ?* P/ W: M! ^        if(istrin>>csym[2]){
% j/ I- O# Z, W, r# U6 Q            switch(csym[2]){  a$ U  r2 V& C- G9 i$ ~. u: j
            case '(':
; Y2 P. E. g9 N                if(!csym[1]){nLevel=0x100; nERR=1;}else
3 G( g- v  ]; Y                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
5 R% i, i6 m- _; W2 O$ [                else{nLevel=0x100; nERR=1;}
* o5 W% }5 \; n& |, X+ a                break;
+ k# Z( h; `7 O2 i+ h# Z# }* V            case ')':
: z+ |  n2 z: e" C! g0 p1 `) G1 o                {nLevel = 0x100;}break;
; h( g$ W, u) M# Y& }* d- d            case '+':case '-':case '*':case '/':' @" a9 h2 F0 Z1 x. E
                {csym[nLevel++] = csym[2];}break;
$ b! U7 H/ _* D* \' r7 P            case ' ':case '\r':case '\n':case '\t':continue;
5 ]- R( K! B0 ^' j+ H8 c$ H            default:1 A3 o, E( K* F; j
                {nLevel=0x100; nERR=1;}
6 H1 ~& f' [& q* p8 W$ V            }1 P9 h, \. ]* k: B1 ~7 {0 z
            if(nLevel==0x100)break;9 V' w- a1 k% W4 W5 l
            if(nLevel&0x10 || istrin>>t[2]){
  a5 G* Q: o5 j1 S3 q                nLevel &= 0xF;
' o5 R& z( F+ r/ L8 f                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}" J) F* X2 I, a; Y1 t
                if(csym[1]=='*'||csym[1]=='/'){
3 \  P1 U1 i* g9 X0 T) |2 M                    GetExpValue(t+1, csym[1]);
& v4 G0 Q; q4 c5 A/ j3 h                }2 y$ N/ q7 F; g. C; p" @
                else{
6 a6 \. W' D* |8 m. q: D                    GetExpValue(t, csym[0]);- G) i( K" t+ H  Q+ \' m  j& q4 X' q( w
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
5 y8 b& Z3 `  |# a                }# }7 v' t8 x8 a$ k
                nLevel = 1;2 c' t+ K9 r0 v4 I, X7 d1 F1 H( f/ c
            }
8 i# S6 ]& m3 F+ {1 i            else istrin.clear();' [+ C2 {, G: F7 r. r, P, H
        }
) L3 Z( I1 w9 D  @; ]2 D; T        else{nERR = -1; break;}3 Z1 r8 j0 V- Q% Q7 I! f& `
    }; b/ q) I, E* s$ Z/ v( E7 V
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
( b3 i- V' F0 Q( i2 H. p3 I# j    else nReturn=GetExpValue(t, csym[0]);
" G( J- G9 J$ [0 F! J* B  d& K# H    return nERR==-1?1:0;, R0 n2 L5 K+ o7 q8 p# N4 ~
}}' t$ b% ^) `9 W/ o

0 i# D0 e4 @. C$ j$ n* a8 x- @
6 Y+ z; u' _* t) w* E+ D; g2 |- R9 w7 M, n0 o& A8 P6 p
函数模板使用示例:
& b' G. X$ O( j0 H9 A7 ~在以上那段代码的后面加上以下代码:5 b+ U  m3 ]3 ^* S

) }4 R; [+ ~/ {; F % S0 ]% T1 k) }4 N! E$ l

2 r! f8 m) a6 t程序代码: 5 G5 n! r8 Q1 G0 R& O
& J0 V. B0 i2 r
#include<strstream>
' O4 y8 }% V+ k' l" V7 o% n$ ]' f#include<iostream>
! S4 Z' W! r; j% Z: K" m#include<string>
' e/ ~4 L9 t; a# ?% jusing namespace std;
' z+ V9 B4 T) N2 [" o& Lint main(void)/ {" ]8 O2 ?- y1 B
{
3 p" I& W& R* z% L* x6 r    string s1;
/ A7 @$ D6 T. X/ V3 E    while(cin>>s1)
' n4 z; N! O/ B- g4 x' ^  Y    {2 g% s* v1 E3 m) E, q& A2 V# Y7 ^6 @
        istrstream isin(s1.data());' a# M% U: g2 }
        double d;7 ^- I3 N" O+ p' Q$ e: V
        if(fy_Exp::GetExpValue(isin, d))
1 `+ Z& T7 V8 u2 K) h* S0 P  I4 {        {. m7 C  k+ t. |+ u: {1 _/ T% [
            cout<<d<<endl;
, a, F, A+ G# V7 C- o        }
2 G; b- N5 }9 _        else
. g7 B* w# n% |" @! ~+ I6 C: R        {  F1 B  S  t$ X
            cout<<"ERROR"<<endl;! }  ]+ l" L, u+ y% l! u# Z
        }' G* @5 `+ l( I" m0 B+ F8 g
    }
5 X( f0 F& B+ Z+ o! |8 A9 G    return 0;
; ?1 U0 `# [" d7 m* \0 g' N: j: H}* \9 v' S# |) Q8 |  E+ x# v

% |- u# e# X( J0 W. W  M5 S( ^- E
然后编译执行就可以了(*^_^*)
; k# `  K- g9 x, v9 V3 z其它:TC++上一定编译错误,不保证在VC6上也能通过编译7 U1 W$ ]6 z! m7 u5 Z
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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