获得本站免费赞助空间请点这里
返回列表 发帖

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

在9月8日那天我特意编写的,给大家分享的,
( t4 g2 o9 \6 k8 r' E( ]一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
2 l* `1 g% }8 Z只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)6 d, X. l6 X1 ?  ?2 {
参数解释:
; Z6 a8 N2 R: {/ \& mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流+ I  p+ y4 s2 N* H2 O
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# C: K4 w  U" w' f- ]返回值:
" `) v; w2 T. ~, y7 P返回非0表示计算成功,0表示计算失败有错误/ E9 `8 m" E" m; U3 |. L: `# t
8 }6 \! |" L7 d  S/ w5 [, E  m$ A

* n, a' u+ t4 z( A
4 A7 t2 s9 @, |5 F6 d3 g程序代码:
3 M- ^( ^; I. `# |3 U6 U  r1 @; E' M' c
namespace fy_Exp{
2 m" S, C! y% J% Y( x1 jnamespace {template <class _T>0 [9 R$ q5 r# N3 N
inline _T GetExpValue(_T t[], char& csym){
" y1 W5 J) G; w  u- t    char c=csym; csym=0;
; b4 O- w7 f& @5 C8 y    switch(c){
8 B7 I: d& G8 |/ [: H, }8 z  y) R9 }! z    case '+':return t[0] += t[1];& k0 z/ V; W( Q) Z, S4 ?
    case '-':return t[0] -= t[1];
9 [( E- \6 V- F    case '*':return t[0] *= t[1];
) S# i! x9 X* ]' ~    default: return t[0] /= t[1];//case '/':
+ h* I4 A: \: n& a3 o- w/ [    }: W; i( |( d; U8 ^' J/ ]+ T; V
}}
! T! C: n+ G0 d( r) otemplate <class _T, class _Tstream>  y5 t$ e4 n' E2 N! ~# `
/* _Tstream: inputstream, _T: get return value7 F' |. D* e  x9 }3 z& u3 _
* Return nonzero if get value successfully */- g- h5 n- I% l" l
int GetExpValue(_Tstream& istrin, _T& nReturn){
8 E0 ]* t; B: s' l    _T t[3] = {0}; //雨中飞燕之作
% z# Z5 U/ D3 _# ]6 y9 z. a$ b    char csym[3] = "++";7 [. b( v# C+ a
    int nLevel = 1, nERR = 0;' v  Z' ?  B, n2 w# k
    if(!(istrin>>t[1]))istrin.clear();
# F* R1 V' z6 ~) |2 E9 ~- ]    for(;;){
, m, z9 }" O/ B( k+ L! I4 N5 H        if(istrin>>csym[2]){
# M" G- A0 X6 M9 @1 H! o            switch(csym[2]){! B% I) [/ Z, y0 Z) M7 Y+ W6 ]
            case '(':: O& X8 l% W$ v7 v" I: q
                if(!csym[1]){nLevel=0x100; nERR=1;}else3 ?4 ^  q% m  s( q, l
                if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
7 p2 B' y$ _6 L5 Q8 Y                else{nLevel=0x100; nERR=1;}: G+ G% a( Y  W. f4 B- }2 T# y- g
                break;8 f/ F5 E5 X  Y0 b( r. D" R
            case ')':: b" H* H9 t7 P, H, f
                {nLevel = 0x100;}break;4 H, Y+ Y# ?% G
            case '+':case '-':case '*':case '/':
. F$ N! {# `, n  F7 _" |7 M# _& I                {csym[nLevel++] = csym[2];}break;5 q. X9 z4 h8 U0 L& s
            case ' ':case '\r':case '\n':case '\t':continue;4 I, a4 S8 V: h. u
            default:3 E  Z  r6 A# i7 d7 K* T- z
                {nLevel=0x100; nERR=1;}
/ S- q. {  B$ E6 r" A            }
0 p1 }: R: o4 G6 ]            if(nLevel==0x100)break;6 n8 a) g1 |. x* M
            if(nLevel&0x10 || istrin>>t[2]){# r( s! F- ]  E8 r; d+ r- ^
                nLevel &= 0xF;
, f! I) r: z- F+ W7 j% H: ]                if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
8 @5 R: W# G; y3 B8 }                if(csym[1]=='*'||csym[1]=='/'){! C' z/ s% k1 z7 a# u1 U
                    GetExpValue(t+1, csym[1]);
( m3 O' Y7 ?/ y  G: W; {                }8 U9 O, [4 M7 z, e* d! Z3 h6 ~
                else{
; t% J+ O# M& L, r- Q8 g/ s                    GetExpValue(t, csym[0]);
5 l1 Y' D( c0 L6 T( m                    t[1]=t[2];csym[0]=csym[1];csym[1]=0;, Q* d3 E2 v* r4 _
                }7 `: o' n: ]" }
                nLevel = 1;6 l0 W4 d) X, f1 S3 J6 ]
            }
/ p" w/ u* ?  s$ e            else istrin.clear();
, b( V7 }2 [8 K7 `1 `% }$ w. u        }+ h3 A3 _; |9 ^) I
        else{nERR = -1; break;}' P/ T+ @; s' l/ o
    }
0 V* l; {" N# _    if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
2 ]# G4 D/ ~( i/ u- p- N- J    else nReturn=GetExpValue(t, csym[0]);
) y! N) N3 B" N- H, P, F4 g    return nERR==-1?1:0;
7 [! t" }3 h# e9 m2 L" L/ R2 X7 O}}
+ C0 ?* q8 l) t: _3 |& R" h! F. Z& z1 s- N* r) ~& N$ i) ?
4 ]9 f  K; P' B' z+ o9 k

# W1 l+ t5 I# p+ p3 J5 ?- L函数模板使用示例:( B/ F6 U3 Z8 K0 F
在以上那段代码的后面加上以下代码:2 n+ k9 [/ x% b- \5 N8 E
2 l. h. J. F8 r
% S# x. v4 t6 d- B- D% r& E

& N* Q' A2 n- U1 U# Y4 T* k( V. u( S8 {程序代码: 5 p1 ?. X4 f1 B

! ?$ q. I! e1 Q6 N5 q( n#include<strstream>
! S5 W' b8 o; e* P3 Z6 v5 D0 s  L#include<iostream>
6 x. h: g. s7 c5 Y( T0 v#include<string>" u! t2 f* q$ }$ P) ?# e$ S9 S- k! s
using namespace std;4 E% b& y/ q) [6 j# a  J
int main(void)
) G2 f- W* P9 m+ b{8 ~" z" Y' i; ~' z, s3 t
    string s1;& R" ?# k5 N% d8 Z' d
    while(cin>>s1)
" c. L2 R) g2 d$ {; B    {
7 m. w& Z5 c# ]) o        istrstream isin(s1.data());; g1 }1 M9 y/ x. E% N
        double d;
' H8 a, G1 N& |4 k4 u8 a        if(fy_Exp::GetExpValue(isin, d))
/ Y5 s/ Z( [% M3 e' S" Q6 O        {
8 W8 [! n) \% _: o5 p* b( f            cout<<d<<endl;
& R$ a6 L: a/ g, \        }
) w1 y$ q* i! s; p6 L+ ]2 ^* B        else
% s/ K% R4 P1 F" @        {
  q  B9 g  M, v            cout<<"ERROR"<<endl;
% q( @8 i2 l. d) m& f: W        }! c: t( w0 m. S2 z+ z2 T1 G; W0 N
    }
, H- V% n' t/ q( ]2 ?    return 0;6 u1 k2 V) M6 G  L2 {5 x- u( i
}
& _" {! B, P, r$ t! ]' B3 L# S7 {' [
5 Y) w9 ?9 V4 F% \- D( o& g- w/ j9 B% ~# f( H8 A8 e; @
然后编译执行就可以了(*^_^*)
, O1 e- L. k4 t5 F6 _+ z6 x其它:TC++上一定编译错误,不保证在VC6上也能通过编译: m3 \% |9 V( }, a2 d# V$ J0 t9 s
      建议使用VC7或VC更高版本,或者使用GNU C++编译

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