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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,5 w+ \" W- d8 Y. o$ x
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式$ I; P" C9 D& [7 }+ p/ `7 f+ T
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)0 y: J$ M0 B! w5 q6 d2 q
参数解释:1 M7 \$ U1 g' G9 W1 k0 @5 M: C
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
1 _- l& d+ ?" i8 W% jnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定/ x. I7 R/ x8 E+ j$ z7 z: a
返回值:
* |$ f* a0 F3 I; d2 e+ \ e4 j d返回非0表示计算成功,0表示计算失败有错误
$ ?+ d8 m6 y) C. N4 n. w. z& S5 ]- F: y
( w. x I$ |2 m
8 E* \* n% o1 [' S( P/ N; ^5 \' h程序代码:
/ }( F3 ]& l' ]* Q2 ^- d; h" H% x. [1 V4 \0 U
namespace fy_Exp{
7 W# _) n, G! a! |+ P& ynamespace {template <class _T>
- `' L; S8 E5 _- y% G/ ninline _T GetExpValue(_T t[], char& csym){' C2 x: x5 M6 X: n, t# s
char c=csym; csym=0;& K; v6 i+ \# r2 p, `4 |. _$ ^
switch(c){
' _4 |0 z# k- D. f! H/ [ case '+':return t[0] += t[1];
: b$ p4 V- H7 b9 A! n- o case '-':return t[0] -= t[1];
# j# H, l- g# _' c0 e. |/ P case '*':return t[0] *= t[1]; u6 U2 T3 m3 u9 n' o
default: return t[0] /= t[1];//case '/':
5 s/ c2 K* x: p- @6 f+ G. {2 B }
. u1 W1 i4 h2 B; S; m}}
( B& W$ g e9 [5 {% a# ]template <class _T, class _Tstream>
" l1 x5 \8 D- U3 U7 e- E/* _Tstream: inputstream, _T: get return value
2 f# Y ?: t1 p: ~4 F* a4 u" e* Return nonzero if get value successfully */
# Z1 g. F0 E7 ~1 j; Fint GetExpValue(_Tstream& istrin, _T& nReturn){; B. }! k l5 K. B/ S5 L
_T t[3] = {0}; //雨中飞燕之作
0 l2 ?0 b& O5 c9 }8 T: J char csym[3] = "++";
0 P" f, I" o& l1 I int nLevel = 1, nERR = 0;/ |. G. A9 _3 m* X
if(!(istrin>>t[1]))istrin.clear();' H# R) ~# v1 k# w. E8 c4 z: a: I6 m
for(;;){6 |9 Z+ T ?( Q" O/ I( f3 z
if(istrin>>csym[2]){5 g$ a! |' n8 b/ T" m4 E1 @
switch(csym[2]){
6 I- `# U( d, S case '(':) Z* b" M2 o& {3 v" n9 B/ H1 A/ [1 e
if(!csym[1]){nLevel=0x100; nERR=1;}else
' {2 R% ] z1 Q/ t b if(!GetExpValue(istrin, t[2]))nLevel|=0x10; X% B' `* h9 ~; V6 H7 M
else{nLevel=0x100; nERR=1;}2 M, i% V9 z5 l; o/ x b Z
break;& y% I; b" J& H+ l. Z
case ')':( c# f6 V: j6 @( O! [, ]0 A3 l
{nLevel = 0x100;}break;) r/ J8 W: K- K- |- p
case '+':case '-':case '*':case '/':
- ]0 ]9 ?! @+ ]0 b! u' S. v {csym[nLevel++] = csym[2];}break;! b$ l& M+ y t0 F
case ' ':case '\r':case '\n':case '\t':continue;% [6 \. L$ o8 c
default:
3 e9 y& _2 u$ v7 m! M' o7 G {nLevel=0x100; nERR=1;}/ a: K) t \$ `* l; O; k
}' g6 u- z* I& Q* o
if(nLevel==0x100)break;
' o0 D- X1 o" W" \# i: ?5 B if(nLevel&0x10 || istrin>>t[2]){* w8 Q3 s2 w( W* G
nLevel &= 0xF;
. v( Q7 C# z1 I# v$ p1 n$ E if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
2 W5 L% O0 u; J2 { if(csym[1]=='*'||csym[1]=='/'){
" ?7 T1 o+ s; Z9 B' N5 E GetExpValue(t+1, csym[1]);6 F) J0 P. Q9 h8 q$ W
}4 z+ e' ? L9 x" ], ~
else{
8 C/ R) ~: H: D' c5 D GetExpValue(t, csym[0]);- c9 u3 d2 z, ^# u/ A3 E
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
" C$ n3 c! C0 F8 k- t }
; R. ^6 J& L! _( P9 a nLevel = 1;' Q+ e. x- a3 T
}
+ o; `1 b5 N* F/ u+ l7 W else istrin.clear();) q, k- S ^- _. c
}5 B: J* V7 m2 F' D+ [# Y8 a" j% j7 {; L
else{nERR = -1; break;}' E1 a9 A6 V0 J4 H! G/ |
}
& D, G( Y+ Z# p if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);3 l0 v" H5 Q9 v2 g- F8 \% v: m
else nReturn=GetExpValue(t, csym[0]);
. T" z0 @: d! ?/ b return nERR==-1?1:0;$ B* v5 x5 U0 }+ N$ `6 Q
}}' \. ]0 W6 v8 d9 F1 D
0 |8 U) E7 Y1 P- Q) p M' h5 Y
" D, Q! }- e3 s5 ~. o0 [: U! z
7 q9 _/ L' L Q3 A! l函数模板使用示例:9 G, f$ ?! ?* [5 U8 p
在以上那段代码的后面加上以下代码:0 c- W0 D* q" L. O( ~5 j0 Q
4 M: a( c! |/ w4 W; v# F* v( O" {
_1 q% @" E- f- `; o V% @3 F7 b0 Q7 o! Q. X! z& R& ]' z, x
程序代码: ' B9 f t5 m) G, J: d" _7 V
7 K1 z- I8 n) P/ c( ?
#include<strstream>
& `9 z4 N3 G6 K/ B7 c% s Q#include<iostream>) K4 ~; `1 `6 u3 {1 P
#include<string>6 u2 U% A6 {8 u3 y5 r
using namespace std;
2 t }1 [! [5 M# \int main(void)9 E; r7 A4 Z% L) \8 H- I/ Y
{
2 a- y5 D8 I* p string s1;: O6 F R! k$ J7 q4 G' g& A
while(cin>>s1)
' r6 i/ i' w! z5 R {! s, t; s: \) ]6 X% e- c8 {% ]
istrstream isin(s1.data());
& L7 N: b+ m, ?6 w) K7 x double d;/ N/ ^! T9 p1 D7 C
if(fy_Exp::GetExpValue(isin, d))
# H3 A- A% T9 |% }& K% o i# O {
( b9 C! e$ T* l9 M }: U cout<<d<<endl;
1 {. H" y% {1 Y E2 b }6 t( I9 Q7 ]. `' A$ b
else8 r3 y$ ?. L( @+ x% [- }
{9 [/ q, i) U* b
cout<<"ERROR"<<endl; q/ X" h& x e& [0 ~5 L* W
}
1 c3 A* h# c1 R/ p0 d! j# N }
E+ {* ?1 ~9 t6 c6 s return 0; C0 U& I- @7 e/ \" \# j2 N
}' s) g( O0 I- |4 |
$ |/ O: |6 \% j& K; @. d& Y
0 c& t* L/ C* l1 g; J然后编译执行就可以了(*^_^*)
- M+ p* u& u1 }$ d( ~; s+ c其它:TC++上一定编译错误,不保证在VC6上也能通过编译
& f4 ?% I8 J: U 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|