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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,* A$ [" B; u0 v* s0 m! F
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式) `. y- j* m5 V& q* a6 q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
( h0 g. T& |) E4 l参数解释:% V+ F2 y( @% [- _+ I
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
: j1 [9 f3 i1 N' AnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
: s' U* f8 p7 X/ F5 _( i返回值:
: s9 P# P6 v u! d7 L8 q9 O; r返回非0表示计算成功,0表示计算失败有错误1 B; {2 ]3 u/ |0 O D7 _
5 | D0 L6 R7 X1 \1 a. Y- ` 2 t' T5 M) T+ g
9 I+ `, ^) j+ A! n+ P程序代码:
0 }5 q: [" D! Y% N0 l! x6 \
4 u' L/ q* Z9 T7 mnamespace fy_Exp{
6 R* W+ K p/ c8 e& ?' C `namespace {template <class _T>+ E0 p* Y9 v3 N- {) X3 W. B
inline _T GetExpValue(_T t[], char& csym){( ?/ n; q! ]8 h6 u) y
char c=csym; csym=0;
, X/ N# A" i- F9 U+ c switch(c){3 K: Q R, n' F* w7 `. R' g5 w0 |
case '+':return t[0] += t[1];
. I8 V! }' p; Z8 R( w& Z1 q case '-':return t[0] -= t[1];% ?8 ~0 y1 E" z$ S) g B8 p
case '*':return t[0] *= t[1];
/ `& S9 ?. X. H' i# _; a; a default: return t[0] /= t[1];//case '/':8 D! n8 }/ D4 s" R s$ G
}: V7 j6 Z" m0 S- f
}}
0 U2 u: z* u& l4 o1 ~" h) ^template <class _T, class _Tstream>/ f, k9 D1 B9 S+ c/ S
/* _Tstream: inputstream, _T: get return value
/ u5 n- I' s& q. j* Return nonzero if get value successfully */2 @# y+ p- {5 E6 d* y
int GetExpValue(_Tstream& istrin, _T& nReturn){
+ M0 P5 D6 ~( n: {+ ]0 M2 h/ ] _T t[3] = {0}; //雨中飞燕之作
4 `4 p! s8 g, x9 w char csym[3] = "++";
# _, v; B% H: Q) Y; s! P/ s int nLevel = 1, nERR = 0;: K: j: h3 r$ S% |* Q
if(!(istrin>>t[1]))istrin.clear();
3 z0 o% J# ?$ t9 N2 O1 Q5 E for(;;){, ?) q; K: Y% H( S5 J f# j
if(istrin>>csym[2]){
2 f, n2 V" C% i3 D switch(csym[2]){7 H( n$ a+ i& U+ H. Y+ `, E
case '(': u' K, H2 } ], ^
if(!csym[1]){nLevel=0x100; nERR=1;}else
3 L6 J2 l* v+ E6 w7 ]1 Q if(!GetExpValue(istrin, t[2]))nLevel|=0x10;* b0 v& @3 S1 C" B! p
else{nLevel=0x100; nERR=1;}* K3 k7 |% C" P6 m2 x
break;
& y- O6 B$ w, k% I case ')':
- ?% ~# r8 w% S. G" P1 a' M {nLevel = 0x100;}break;' E4 [) Z3 h6 s' u" V% {& x! l2 A
case '+':case '-':case '*':case '/':
* n" v8 @! I. k% g {csym[nLevel++] = csym[2];}break;
0 o3 _* |4 X, l% _ case ' ':case '\r':case '\n':case '\t':continue;4 o& v3 I7 V$ @# t# r+ J' q
default:
- f2 z3 r% Y8 Q& I {nLevel=0x100; nERR=1;}# W w' J" T: p! l) h
}
, s/ ?. e* s3 s) v' w0 x if(nLevel==0x100)break;
, t9 ~4 f! f7 }5 l' t if(nLevel&0x10 || istrin>>t[2]){
2 |% M: ^; G% `$ F: Y$ z$ H) i nLevel &= 0xF;$ O- K4 _ s+ n& ^5 O, P; y1 t
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
- M3 C# j+ C- K$ J3 x9 O if(csym[1]=='*'||csym[1]=='/'){
. { ?8 n+ M# f5 C9 T, @) d GetExpValue(t+1, csym[1]);% [4 n5 d5 D e& h. E$ g" I( y' D) y
}9 b& M* D; n# \' ~: F! U
else{
" k" x$ B. W! n7 ~7 a g GetExpValue(t, csym[0]);
" N- j- S+ K( X/ b t[1]=t[2];csym[0]=csym[1];csym[1]=0;: }2 x6 z$ [5 S! ?9 s6 c% z& x
}9 ?# k! y* v. @3 W5 e6 ?6 c
nLevel = 1;! N$ v' n; V: W: Q+ ~4 s% V; ]! |
}" {2 @3 [6 [2 ?* I+ v
else istrin.clear();
0 H5 z+ T8 b! h }/ J8 S9 h" W. }* z: u, y
else{nERR = -1; break;}5 \8 P, J; f4 o1 q: k
}
* l6 ~+ I: o' j! ]2 C$ s7 o. @3 G if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);+ q- j& ?& ^( a' n/ r5 G0 U
else nReturn=GetExpValue(t, csym[0]);% V6 x' d) j R! C+ \4 t
return nERR==-1?1:0;% H9 z+ L& e9 M! {: L9 l
}}
2 a6 U4 {6 } b, H" k. ^& Y' l) N
8 P9 z/ |$ R4 d
+ O5 x& G& M& q2 {# A
函数模板使用示例:
/ O; n1 W( n; p6 O5 z( j在以上那段代码的后面加上以下代码:: ^' u) ?( A- m: x; C/ ]
7 N2 U$ n( [% j& q
: }& z) I; I2 r- B- i1 N6 _1 N- I
程序代码: / [9 e3 \8 w4 Z4 U9 l5 R0 M
# j8 d% l | V/ P i#include<strstream>% u& i/ `( s* d; y
#include<iostream>
1 i( ~" \ ?7 \- m#include<string>3 M! j+ T- H; n c0 [
using namespace std;0 z/ R, E2 y; g J, t: l' a, [
int main(void)# c# U8 }* g- H3 C, ~
{5 x: }" t& L H5 _
string s1;
0 B$ J8 Q3 N% O' `! B# m while(cin>>s1)
- S B+ b X; G* } {2 K. w% g) f; L' E" q' v
istrstream isin(s1.data());3 G( ]- R) g, G; x* `1 u3 [* H
double d;
) D- Z( _& ?" i9 b9 b; l if(fy_Exp::GetExpValue(isin, d))
# T0 T# p5 f, T6 E% l7 l {
: Y3 z! P5 u3 e5 p3 b# N6 y( l cout<<d<<endl;
T! J6 j/ A5 b F8 u+ n }
" E* [9 \; W1 f. H6 @: p* K else! Y* A+ @8 B w. i7 k
{
% N0 X1 ^( O! O* z' t2 k7 b cout<<"ERROR"<<endl;% H) D7 l7 w H6 j: D, _0 A
}
* X0 \/ Y% K: z7 R/ y% Y }1 ^* P4 Q3 x0 T, X7 ]* T
return 0;- f/ Y+ t! \. Y; k L
}
1 Z, O5 {2 j7 E0 T( {0 [4 N( J! g7 z6 G6 y' r: U$ S
" V5 p3 a$ L/ p8 u8 k4 Q N! h: B
然后编译执行就可以了(*^_^*)
+ B+ |3 ?- u9 S- r其它:TC++上一定编译错误,不保证在VC6上也能通过编译" s: |9 P$ W( A4 C" H9 q: ]9 t
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|