|
  
- UID
- 133
- 帖子
- 51
- 精华
- 1
- 积分
- 186
- 金币
- 55
- 威望
- 2
- 贡献
- 0

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,) b9 r) A8 r+ T) V; s3 V' V, p
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
" J) p- B9 E+ A. i9 a# s) {只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 }3 K& ^1 ` Y, Q9 o参数解释:
$ U4 V; B. N9 d' |5 X$ mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 M+ b0 A/ U2 }/ j% qnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
" P/ h7 x8 P8 O& M3 J$ [返回值:0 F4 f6 ?- v/ E
返回非0表示计算成功,0表示计算失败有错误
$ c& u( f$ q* }
& Z) G, K& y( R
2 H4 ~0 A/ b) s* @, ?' f
; `. e2 b0 h. ]$ }( P程序代码: . ^% |% G$ a( _
# g5 q4 F) ?! j1 t- Znamespace fy_Exp{
5 l1 |; x- q* h% m- B5 Xnamespace {template <class _T>
. D( q1 K. ^ j! ?. `5 p( X( n! b$ \inline _T GetExpValue(_T t[], char& csym){5 o) M) f$ f2 J, G/ _2 u! W
char c=csym; csym=0;
8 Z( R+ K1 ^' c' f6 k8 Q switch(c){+ A# B; b, J) m6 H. |# O8 e
case '+':return t[0] += t[1];4 ]2 |9 f# w- ?
case '-':return t[0] -= t[1];
% s3 |8 g" B; k" U0 F/ R case '*':return t[0] *= t[1];
2 k& U9 N. p* W$ S( _2 E default: return t[0] /= t[1];//case '/':
4 D, h) _) M! M }
- s. P! `: v% Y$ o* X}}" h6 ?8 ~( D. H- Q5 W: V
template <class _T, class _Tstream>
5 l, }% b) B7 G3 Z$ ~* w/* _Tstream: inputstream, _T: get return value
5 a$ Q. a& M* g0 e) T* Return nonzero if get value successfully */3 d- Y$ t& f2 B3 @
int GetExpValue(_Tstream& istrin, _T& nReturn){
4 x/ `- W9 ^9 t1 j; h! i% h _T t[3] = {0}; //雨中飞燕之作7 k6 C7 R6 {- D
char csym[3] = "++";( y9 G+ O6 p Y% x! Z! ? r R
int nLevel = 1, nERR = 0;( @; r, P8 u2 C* ^, t# _& P; W
if(!(istrin>>t[1]))istrin.clear();
6 h3 Q# P: t9 m1 G- D! b5 ~9 Z for(;;){
) r; q: |% c/ ^9 T; C1 N3 W& R if(istrin>>csym[2]){
+ W" [" u1 c; B u# h8 f$ K switch(csym[2]){+ c2 F$ i2 K! d- g
case '(':
9 `0 z) x4 ^4 s( f b2 u2 ` if(!csym[1]){nLevel=0x100; nERR=1;}else0 }1 M, a5 r9 X. {5 u
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;: f' e& X/ G, A
else{nLevel=0x100; nERR=1;}
) G5 ~; Z& |, Q! e$ o1 t: | break;
7 Z3 Y# `/ Y) e7 }# q case ')':
- r2 z1 Q0 A( o; b5 }$ y {nLevel = 0x100;}break;
& p+ P9 F% X' p3 _+ ~' S case '+':case '-':case '*':case '/':
* ^' P# H# `7 W) y$ J6 u# o5 Y {csym[nLevel++] = csym[2];}break;1 j+ ?1 l1 [7 m4 P/ o
case ' ':case '\r':case '\n':case '\t':continue;1 v0 X; {( {' F# B7 Z& B) g# ~1 U
default:
9 V, S! f u0 |* `8 {( F {nLevel=0x100; nERR=1;}
* y# n' J1 x( z, S. m) c, F6 U } Y) V# H7 I _0 Q) J+ l
if(nLevel==0x100)break;
1 _7 r) a4 ?0 V if(nLevel&0x10 || istrin>>t[2]){
7 |, J6 h" I( `/ v& W nLevel &= 0xF; O: M8 N1 r3 G/ G- z" S
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
! |" }. ]9 m% {( A$ i. t3 o if(csym[1]=='*'||csym[1]=='/'){
# g8 q# p' N; J, T GetExpValue(t+1, csym[1]);
" r$ M9 e( i" D }
- V( D4 @% X5 w$ k7 W5 A# L else{# e7 v) y- p+ S4 K/ m
GetExpValue(t, csym[0]);
8 N9 ~/ P3 G' R. h7 F t[1]=t[2];csym[0]=csym[1];csym[1]=0;
; }6 H4 c* \4 Z% M2 x& T }5 ]4 h6 f1 F% P5 I6 _
nLevel = 1;
" V1 _. k% {4 l- D }% `& K" F$ |" d/ V3 _
else istrin.clear();! C5 t& W( m$ s( w, k6 i& L. O& v
}+ r; x* ?7 e7 Z7 J1 Q! h
else{nERR = -1; break;}3 b$ A, F# D) p& C+ K4 E
}' w9 |3 R3 ]- F) I B( b' P
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
E% y$ }$ t/ u, ]% g# a else nReturn=GetExpValue(t, csym[0]);
. b" J$ W6 K7 u& H! \3 F* a) l return nERR==-1?1:0;
7 t" g W3 @/ e# }5 t}}- y% m. F6 U1 ?) y( Z$ h
X% a! R* r8 r3 l# t5 o& \8 `
# O9 v/ o% O9 o. [5 K+ t( z. ~
' r4 R/ I9 n# K& M函数模板使用示例:
* i) z4 A1 l5 D6 r/ V在以上那段代码的后面加上以下代码:
: o' A8 W1 A6 D3 p2 P1 P
4 n: N$ B* d0 w. }; f, I$ Q' g7 @ 8 l5 D' L+ e5 j
0 S# F+ A/ e( C9 g5 F: u& T/ I
程序代码: $ U) P9 j# k! X g$ R& w
. ]' x7 B' ]" P% j: s/ I: U- L. }
#include<strstream>
- \- T! ~5 l- D8 l" F2 W#include<iostream>
+ S/ h9 B3 s% r6 e1 K- @7 u) _. _#include<string>6 W" ]5 s% Z u9 C
using namespace std;
7 L( t8 G: p6 c4 z( I3 rint main(void)
1 B( ^( U; r3 T+ Y4 u{
% v" h+ ~7 K2 u$ I string s1;
- E# }0 b0 q3 a while(cin>>s1)
7 J) Q5 X9 u! A3 X0 W( x {; _ _. C2 f; n" p, h$ q5 A3 U
istrstream isin(s1.data());
4 C3 y, p* b6 n) N# `7 s double d;
/ F; {4 @, Y- b9 S0 e5 V6 e: z if(fy_Exp::GetExpValue(isin, d))2 m( c1 ]+ g7 b) P. @" N* g8 P! \# K
{4 T3 f3 |% f$ O, m( Y: f9 E) C
cout<<d<<endl;
$ h; |8 F( T" k( C, o }0 v$ g( d* T9 i$ n% g8 ]6 k& J) L% q
else4 {" @. C& O7 q4 u/ q
{7 _: j( a9 w2 O1 f/ `! f B" N# M
cout<<"ERROR"<<endl;
) _7 T8 r& E3 ]. u! i }! k% C. l- h- o" J+ a
}
6 F/ ^9 j% Q' W/ b& ~6 m C return 0;( T! A0 S; e2 O3 n9 |) |, J
} @) a# [( P7 u0 I7 K' T' \+ f
$ r# B; F7 s/ H: c6 j* H/ t5 k
# t8 ]; v% r9 h4 _然后编译执行就可以了(*^_^*)
% ^6 K& q- W$ |0 E* r$ I8 P其它:TC++上一定编译错误,不保证在VC6上也能通过编译5 f! o( I1 a- z1 }+ J s/ n
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|