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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,( A' |# E' L, V; }8 F9 D
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
& j1 l0 ?4 t; a* p只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)4 w9 Q3 h7 D. R7 l, k, g, L8 y8 @2 O
参数解释:! l# r6 Q9 Z7 E9 b
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
- I6 g/ \5 Z. fnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
0 T: d9 X: Z8 ]# i" H返回值:% G" C4 b- A' a. X+ h
返回非0表示计算成功,0表示计算失败有错误9 ?, i8 @& P' B" W- u
. l( K; f7 l# z: ~( C9 R+ y: _
+ w5 F2 ]: ^/ B$ S# k6 c
- b: t/ M8 E# q
程序代码:
# K& N' {5 N, q% L7 e6 M v% ?& K8 U0 S) p$ Z
namespace fy_Exp{6 z8 y2 Y% W" J9 e
namespace {template <class _T>/ p6 a) t' N" H- l
inline _T GetExpValue(_T t[], char& csym){
% J% z, e* e9 R' V5 ?& Z char c=csym; csym=0;
. X' G2 L9 e ]9 P& } switch(c){
- v9 f3 c+ n/ E9 V. E% b# K case '+':return t[0] += t[1];
: C# B) U2 g G) b2 X case '-':return t[0] -= t[1];2 i( E e. |3 a
case '*':return t[0] *= t[1];
$ y* e3 g _( C) f( E- m) S- J) L, G default: return t[0] /= t[1];//case '/':- y# Z% v# O* o3 H
}4 s) l9 E5 O2 L! |% T# Z
}}. R6 ~. j* z4 W0 V: ^
template <class _T, class _Tstream>& R4 a, r1 J. M, K
/* _Tstream: inputstream, _T: get return value
: o" O+ C! Y% Y& U% C* Return nonzero if get value successfully */. o1 \8 i; r0 Z
int GetExpValue(_Tstream& istrin, _T& nReturn){; M9 R& d8 ~4 q* E. t( A: G- U
_T t[3] = {0}; //雨中飞燕之作
) v6 Y& l) ]" W& z% H9 v. G. Q8 o char csym[3] = "++";- x. ]+ U, t: m" n9 i& D
int nLevel = 1, nERR = 0;
/ d- V4 o- _' ^7 I" u if(!(istrin>>t[1]))istrin.clear();9 V q3 S; y6 P( n1 d* }
for(;;){) }5 O3 D3 Q; `7 e7 D; v
if(istrin>>csym[2]){
# Z& u8 @$ l) |# E; `4 X switch(csym[2]){
3 z2 H( x# g/ g, c. S8 A case '(':% M: m$ V5 J! ]. T" U% b8 O! p W
if(!csym[1]){nLevel=0x100; nERR=1;}else
4 b8 P) p/ b! d5 _. a. U; V' L if(!GetExpValue(istrin, t[2]))nLevel|=0x10;9 G/ c3 {, D# _) q2 h* `
else{nLevel=0x100; nERR=1;}/ w1 G( C5 V6 _* t" l
break;
- ^6 ^. }- O6 S8 ? case ')':
# V7 S0 {& }7 ^5 \ {nLevel = 0x100;}break;
2 F% d1 Y' @; [0 N ]3 R6 V case '+':case '-':case '*':case '/':
( ^, I. V( ^9 b/ O5 E) W5 f5 \$ N {csym[nLevel++] = csym[2];}break;) W! X" u4 b5 ^
case ' ':case '\r':case '\n':case '\t':continue;7 q! q, V. E% o# A
default:
$ Q: o& K3 c; M- S4 o, H K! h {nLevel=0x100; nERR=1;}
5 |6 U- n/ V/ f- } }4 y* o d, W1 R. p
if(nLevel==0x100)break;
, k% g5 t+ ^. u; W% m if(nLevel&0x10 || istrin>>t[2]){
; f7 n# Q* _ {! R+ ?5 o nLevel &= 0xF;$ i$ l3 ^) T2 _4 }( h% F
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
9 e. f2 s- w, `8 b if(csym[1]=='*'||csym[1]=='/'){
1 p+ [4 j& u6 x$ P GetExpValue(t+1, csym[1]);
/ a+ @$ U* e; v7 F. L2 k" v }
, j& j' I x+ x' G. v( _" P8 L else{: ?0 ]' x2 v! {
GetExpValue(t, csym[0]);
; ^- Z# ]+ A; B" q# u1 M0 O t[1]=t[2];csym[0]=csym[1];csym[1]=0;
6 m( {# e* }3 Q2 C W4 I4 X9 E }
( T1 c! i' s# W nLevel = 1;) Y" c! Q/ x' |4 S# v2 S
}5 u2 W- y* r' r' Q7 U
else istrin.clear();: w. [* z3 ]2 ]
}+ }6 W2 Z3 j( h3 L/ i% p) {' T
else{nERR = -1; break;}1 D. K* X8 n$ j
}
6 y( S$ i' p4 R( {# K3 c if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
/ ?* Q. d. L* x else nReturn=GetExpValue(t, csym[0]);& i$ a) a8 P2 n
return nERR==-1?1:0;& m) N4 D* n" K
}}
) A% b& { _* e1 o, R5 n8 [2 G
% }% e [/ F) k+ B% y3 Y: U- R/ b5 o: X' n' j
0 l7 {, P1 h" V$ f( B
函数模板使用示例:
: g+ c3 s8 P: {+ L4 W" @) ]; u在以上那段代码的后面加上以下代码:
" G2 k# h% K( f& e+ \6 e% m, v4 C
6 Y, @) O, S) h7 g) O8 o' j
6 a0 Q5 S" h# ]
程序代码: - {0 r* O) f2 P% z* F" ^* L
4 c" e- b* ^. n
#include<strstream>
# C2 W5 F" r1 Q- e4 S#include<iostream>1 A- \" F4 b9 s
#include<string>" V* U' N" t6 a& y# U5 e; _ ?
using namespace std;$ R6 P7 K7 |9 g$ q3 _& t- s
int main(void)
: M8 o2 ]9 }& D) q }{
* W T$ X8 ^$ V. F string s1;+ a4 |0 |% D& ]- _
while(cin>>s1)
4 Q5 O* Z3 m- f7 p5 m5 v) D7 } {
' }) v0 V$ [% E6 Q# @, ` istrstream isin(s1.data());
: O- w! A# J( ~2 Z; B9 S6 i double d;# [$ F7 w& p' z U
if(fy_Exp::GetExpValue(isin, d))- a7 Z0 k0 Q; W( C
{' Z" q* Q7 ]9 J
cout<<d<<endl;
! C6 k! c. I) f }% N- l5 r5 w& b& R( \+ s
else* F/ m5 h- t8 ^, |1 F8 U! v! d; z
{+ y$ v6 U) C4 j9 {: x+ X3 {
cout<<"ERROR"<<endl;
. l, M9 S' F# d( G+ ~, O8 q: E! V }2 X X9 Y9 |* V
}. h) Z$ `9 y+ x
return 0;
0 v2 ~8 Z. t7 o. y}
7 E5 O$ \: H' c$ M8 d0 c7 Y
2 g1 a% H6 H2 ]7 _+ K3 c
+ I8 i/ k5 R& g; J5 V' A. H然后编译执行就可以了(*^_^*)
1 T$ F+ _' t: K3 }8 {4 b- M其它:TC++上一定编译错误,不保证在VC6上也能通过编译9 _" S1 V7 N" A4 l5 e" [
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|