返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,8 ^3 C4 {+ g) ~# R1 q4 N4 ^
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
/ ^; k! j6 D8 Z/ F) C' W9 l9 `只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)1 j+ u# M! y2 q4 Z! |# E- @
参数解释:' E% S: G* }4 @: R9 p0 O
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流7 E/ G% I1 U) d% Y" t4 f" N
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定/ K! @# {2 `1 W3 f( P
返回值:
& L8 q% a* o& f返回非0表示计算成功,0表示计算失败有错误% s9 S* z  D& D5 H0 R+ c5 u( ^
/ ~1 ]5 W: F' V% @  O) V. a
# A. n4 Y- J2 \! Y$ l

7 i  }% G8 {; ^& h6 z程序代码: / B4 V+ t/ }8 [0 l, [$ i9 ^
: x' [, t0 \6 t- m$ Q3 p
namespace fy_Exp{
* j; P4 s# G7 r+ Z) @! g7 Rnamespace {template <class _T>
2 t1 g3 j4 v$ Y7 s1 Rinline _T GetExpValue(_T t[], char& csym){' e3 A% n9 j) Y# p6 H/ R: ]
    char c=csym; csym=0;3 {' q+ `$ v$ `% _7 t1 I$ K) @
    switch(c){. y, W; g" Y2 ^3 l! b7 o+ t
    case '+':return t[0] += t[1];4 B1 }! o% t4 B8 B4 F% X3 k
    case '-':return t[0] -= t[1];6 Z6 H" n! a" [
    case '*':return t[0] *= t[1];- j/ G7 D  r9 N; \# N
    default: return t[0] /= t[1];//case '/':
1 G! v& k2 l  ]0 H    }
6 u6 _3 ^. ~  m! k% _}}
4 j/ f# h  m4 k( dtemplate <class _T, class _Tstream>2 M2 Q9 T7 K, k% g3 i) o
/* _Tstream: inputstream, _T: get return value
1 e* o% ~$ C7 @6 z* Return nonzero if get value successfully */! G! o& d( k5 J4 f! S4 }
int GetExpValue(_Tstream& istrin, _T& nReturn){- R1 l' R; I: q  |" ^" K, J
    _T t[3] = {0}; //雨中飞燕之作2 r6 e- @# w- n; ]8 y0 L8 m' `$ J, `
    char csym[3] = "++";
9 V9 p  p2 Z' q4 a7 J    int nLevel = 1, nERR = 0;" Z5 n, P1 H- p5 {
    if(!(istrin>>t[1]))istrin.clear();  l( A* F- [6 m* v6 o6 u% A. E
    for(;;){
, X+ w& v* d, A2 o3 z  H        if(istrin>>csym[2]){8 R, w6 o1 O% l2 q/ j
            switch(csym[2]){& I" O! z; g) q, P/ `4 \
            case '(':
" @2 E" c$ `# H- `% l                if(!csym[1]){nLevel=0x100; nERR=1;}else3 W6 v) ~& n' j" c- e  {& w
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
: p2 Y7 w% d0 D* D7 p" I- Z4 s                else{nLevel=0x100; nERR=1;}- @7 Z, c3 n% D0 x$ u7 A( z8 t
                break;& g  W6 H  k/ T
            case ')':6 N- O0 t8 m  T  |0 w8 F
                {nLevel = 0x100;}break;
4 z; q4 [& a3 a7 [            case '+':case '-':case '*':case '/':- x3 J7 q  s0 m( O0 [& |, V/ q
                {csym[nLevel++] = csym[2];}break;
, `, n: t* W! q( \$ l            case ' ':case '\r':case '\n':case '\t':continue;
. D- b& z9 c* l) N            default:
: U3 r4 I$ b; ~4 P$ e: y3 K                {nLevel=0x100; nERR=1;}
. ~1 r. Q) N; G/ f' s9 Y            }  P& Z+ @' P, a
            if(nLevel==0x100)break;
, b; w3 I# X+ J% O$ N            if(nLevel&0x10 || istrin>>t[2]){
7 p  @+ L( e) _7 \' x                nLevel &= 0xF;: J5 ~8 X$ ^3 j( s* y; e/ m! n+ f* x
                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}; _8 `! {- t+ M: J5 g/ W; b6 I
                if(csym[1]=='*'||csym[1]=='/'){: s& \$ y+ b* w  C' o5 D" C
                    GetExpValue(t+1, csym[1]);
% Y' ^! A% Z6 j+ g4 h                }* @: a7 B7 G' W( y
                else{
7 T% m) B# a# g; v                    GetExpValue(t, csym[0]);
8 \6 }( C, r3 Q4 }+ ?                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;
, o( f3 m8 q. ^3 r: Q" x                }+ l& v; A0 J1 ?7 e9 K
                nLevel = 1;! M9 l; _  }7 B: Z, K" k# f5 ]
            }  T8 ], i/ Z9 z) C/ i+ s
            else istrin.clear();
! S, f1 ~& j1 R$ i        }* L/ d( U) B( r- l1 q$ e
        else{nERR = -1; break;}! C0 K7 R3 R6 }% Q
    }
0 k  B# d, w4 q, E/ l3 ~+ C( I! v    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);& S  C- q2 |. R$ k; }$ D
    else nReturn=GetExpValue(t, csym[0]);
$ W' @7 N1 h  v" p& O8 t    return nERR==-1?1:0;+ N% K; i4 E+ W
}}) L2 L+ U: h- n4 t
% V3 h" c9 u  l  w
0 w- F  ^8 U9 D) P, |
1 [% M& b6 L/ n
函数模板使用示例:
$ c! E3 }$ d, a  p/ B在以上那段代码的后面加上以下代码:
9 b3 L" r7 G2 \  Q9 @/ w$ {2 X* V3 R! K
5 o  N& J, d& R+ T8 H7 w

: [3 ^, U) l. t程序代码: / d2 E0 I8 p7 F+ m7 }# \0 c, @

* W) I+ R* ?$ B9 w( _#include<strstream>5 }& C) W. [. O9 Y
#include<iostream>
4 k3 ?. R$ O6 V6 R  m# I#include<string>
; s, f$ F0 h: r2 p+ Z  Vusing namespace std;4 |$ I$ P7 ~6 h, y6 w2 q
int main(void)$ E% u; |) P- a# y8 p4 {
{
2 n6 d# u4 E9 ?+ A: P& m    string s1;9 K( U2 o% S2 Q* @
    while(cin>>s1)
8 C3 O# f$ Y; }* K3 o+ ~' o    {
7 |% L7 W1 G3 `+ A+ d        istrstream isin(s1.data());# I  q* u& j$ a# E. _
        double d;4 f+ v* m' a3 X; {, R  c
        if(fy_Exp::GetExpValue(isin, d)). S8 j9 a- Q% b
        {0 N" ]. P* [" g  Z
            cout<<d<<endl;
. c7 E" r& L- x* A( V- T. d7 f        }
2 P% k; S+ ~% r6 }4 b* J* C        else- S4 S6 P4 m3 i3 ~7 u9 K% ?
        {
; D9 i7 {) s9 N8 T* p, S            cout<<"ERROR"<<endl;
* j  s' ]! A+ B+ D' T+ Z9 p+ z        }" q: w7 Z9 O4 L; F
    }9 J9 z+ C0 M+ O/ f
    return 0;0 S$ ^9 r- o* X( m- C4 t
}
$ j7 Q$ C! n8 ^- L0 t4 o
8 t. U/ ]/ i% v/ G9 Z6 O
2 c* ?; l4 e% t然后编译执行就可以了(*^_^*)* s# i0 V( O* j' D: L
其它:TC++上一定编译错误,不保证在VC6上也能通过编译2 o/ q4 I9 T2 q3 K6 |* y( U
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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