返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,+ P6 @; t: @9 S# _& ?+ ?. R' P. Q2 K
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式- \5 l0 @* |$ x7 r" l
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)/ x( P/ z- b1 f8 d( q' ^6 R
参数解释:5 ~2 G) `  S, r" O
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流1 w. ]( C. u! H( q# d7 Z- W
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定% V; r; q  t; a  M/ A2 t0 S
返回值:
# X" I/ k4 _6 t- C返回非0表示计算成功,0表示计算失败有错误; _/ q( C+ \7 e- o# q; ^
* c* E# g  r# E
6 v0 h+ a- f( U& {% `% R) r
0 j7 S3 s9 Y; k# \
程序代码: 1 k/ N- J" z3 u  `" T

: H, g5 a( o  Rnamespace fy_Exp{
4 ?7 d: ?* D4 {namespace {template <class _T>, z$ [9 {: m; U2 \( T# E
inline _T GetExpValue(_T t[], char& csym){
) V% r% J" d0 \# c. f- z    char c=csym; csym=0;+ J( W5 h# h! [8 ]! G. Q
    switch(c){5 r4 z4 y: ~. T- E8 e0 Y
    case '+':return t[0] += t[1];
+ G4 L5 d$ J+ {& t1 R) `* |    case '-':return t[0] -= t[1];# g5 \4 x- m6 ]; {
    case '*':return t[0] *= t[1];* ~5 N9 ]: X# Z
    default: return t[0] /= t[1];//case '/':
$ k* d1 a, L2 o2 x* X5 T; p    }
8 l# @2 S% F8 @2 b- I}}
4 f& v, V* P9 q: u& J6 O; t" `- rtemplate <class _T, class _Tstream>
, l# K2 e7 Q7 ~0 ?% \" C$ |/ C/* _Tstream: inputstream, _T: get return value& }8 f* h( d$ ^" U# _8 o
* Return nonzero if get value successfully */
0 x' |4 }2 S0 sint GetExpValue(_Tstream& istrin, _T& nReturn){, `) L% ~6 J# b( V
    _T t[3] = {0}; //雨中飞燕之作. Z! i; H( Y3 X+ q( ^- I
    char csym[3] = "++";
2 ?0 j; f. Y' v) p! Z( x- j6 n4 T    int nLevel = 1, nERR = 0;& N4 f; I- C; V4 q6 c9 r6 h
    if(!(istrin>>t[1]))istrin.clear();
  y! y" f; \3 w1 [7 V/ H6 h    for(;;){
7 e7 ~) J& ]5 h/ ]3 ?        if(istrin>>csym[2]){
+ O" b5 }- w0 E9 D            switch(csym[2]){
6 }( R( L2 l3 \7 y* ]            case '(':+ c2 H5 A, f  v/ H/ ~1 X4 s' N
                if(!csym[1]){nLevel=0x100; nERR=1;}else
. n) F& u1 `. U( G) W. O2 p                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;" I( ]' R0 s% |! C
                else{nLevel=0x100; nERR=1;}
5 W0 }+ |5 i7 T! ~                break;
8 t; o% t6 q& H            case ')':
& T/ P' z8 p. `) z6 t  m4 H3 L0 A5 ^                {nLevel = 0x100;}break;
& \4 i& x" q% [# |, Y  u: k            case '+':case '-':case '*':case '/':  u  Y5 x! d+ O3 L! h
                {csym[nLevel++] = csym[2];}break;% t) r3 L( f1 V0 J; j3 g* j
            case ' ':case '\r':case '\n':case '\t':continue;" ]3 y/ K# U9 n' u3 t+ `: K
            default:3 O, e+ ?5 D' e9 q( X: q
                {nLevel=0x100; nERR=1;}
' f' Y$ I+ }, u* J. }, _$ w            }( ?8 {# \! F0 X
            if(nLevel==0x100)break;; `% ]  k# b. M) E# X/ I
            if(nLevel&0x10 || istrin>>t[2]){
1 V5 u& f" u6 n* K- ?                nLevel &= 0xF;
, R' @! H+ i8 x2 N' T) E$ N                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
5 G$ T% x- A) G1 k4 U& n                if(csym[1]=='*'||csym[1]=='/'){/ o* f. J, X, T
                    GetExpValue(t+1, csym[1]);* _3 n5 n9 E* U9 e8 p3 u# X) y' w% A  M
                }
& F+ @. M5 n2 U' q% I8 R2 f                else{
" b  @+ {( B$ @4 L                    GetExpValue(t, csym[0]);" q5 H# |0 A8 K+ C" X
                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 x7 d" ]# A! B% }" e
                }
1 O% t3 \% ]8 ~" z" t& |" Y( w1 g                nLevel = 1;
; _! x6 V; q" i2 `6 e- h            }
* b' a" P' C2 ]/ l            else istrin.clear();
/ I* O  H- J2 W2 k        }- `2 A+ v2 t- k0 w& X. Z8 u
        else{nERR = -1; break;}' Y' J8 z" f) X/ `! f- K+ Z6 F
    }# }$ @+ r/ `) {: E
    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);7 w, r8 x) o' l' _7 O) p, m* K
    else nReturn=GetExpValue(t, csym[0]);
' c; ^2 \3 x9 F2 \8 T    return nERR==-1?1:0;# R4 ~/ C5 y4 |4 j/ M
}}# I. o" T# k, v% Z- Q- S4 ?

' u# R! a  Y. |- e8 V# T6 \4 a4 h( [: S, M# M3 F

3 `. l( m$ l: C" |( }, p8 g% j函数模板使用示例:
" i: A. n: X1 S6 ^; q在以上那段代码的后面加上以下代码:, W. g. n3 T3 s
6 g* U2 X# K% {0 U0 Z0 E5 ?) h3 G

+ _6 {* h- {: s3 n  {: ~' n7 p" W5 A- w+ x# r
程序代码:
. A! T/ N1 V) B6 J2 T
, k5 I. b+ J# d2 ^#include<strstream>
2 r4 o2 w! a' M9 Z5 y; X* D6 ]#include<iostream>( p2 D* E6 C  d3 B% r! @% o  c
#include<string>8 [6 ?5 C- ^0 a  p, @  [5 j# b
using namespace std;
. D- Z6 I$ ~  V3 D% I4 b9 Bint main(void)) y( a  t. ]  L+ }
{8 n7 W  `3 C2 V, d
    string s1;$ M4 p+ U- i3 w0 o) W; o1 O! W% D9 V# C9 q
    while(cin>>s1)% b$ O4 p: L* H4 k. `2 W- _+ f
    {
7 B9 O2 Q. n( e1 w+ x& C- W& X        istrstream isin(s1.data());4 [1 r. A7 I: n, H* ~" H4 U
        double d;* t8 }' e9 p% ]& ]- m7 E
        if(fy_Exp::GetExpValue(isin, d))
! V2 U  v/ N, K9 x3 C1 n        {. A  p, m6 |5 P4 Y9 K, w
            cout<<d<<endl;
- I2 X, H8 Y! N/ O9 s7 n        }0 G/ N; i3 R  n! q
        else% ^) }5 l- G; |! s! D* f4 q
        {# Y3 q& C# F, R3 x
            cout<<"ERROR"<<endl;+ w# y: n2 J' ^4 ^3 P
        }
! Q, x- k, \4 h$ C5 K3 K9 z    }9 d0 B  {( x8 A7 P. M0 v
    return 0;* v8 s3 b- l8 S* s; m6 K9 Y
}
0 `; G6 @, n/ s( w/ x" @5 T$ U% s5 U- v+ s% s

8 _+ O' F7 v+ q* n( y然后编译执行就可以了(*^_^*)
" I& k. K0 M8 v3 C( Y5 @7 m其它:TC++上一定编译错误,不保证在VC6上也能通过编译- R  r# u2 _: J5 M7 v7 Q& R
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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