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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,& g: ~7 ]) w' v$ h" K( t
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式& p) o/ o* } l% A( \: M* H
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)0 ?6 x( ]" W* K. E4 [( R( ~6 D
参数解释:9 W8 ^8 }+ Y. t7 t2 [$ ]+ y' w
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
6 [* i5 l+ u4 K. X1 fnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定. W7 V# {% d9 g. u( t
返回值:3 O. t( N) @; c+ u7 U4 {3 M* Y: n
返回非0表示计算成功,0表示计算失败有错误* T' Q( Y; c4 l: |' z( `! f1 N& \
7 v! G8 b( j. E " O) v" }( Y6 Q7 `2 i
# o' U+ m* h6 F4 g6 y: a' f
程序代码:
3 }' O3 c2 B2 Y- N Z$ m3 ^ ~% @! {, I1 I
namespace fy_Exp{
, }# V$ i) i8 h# O! N$ b! Dnamespace {template <class _T>
D* H) ^' n ~ q" V: Tinline _T GetExpValue(_T t[], char& csym){
. G7 C/ I1 ^9 R" Q; N$ Z char c=csym; csym=0;- K; W$ L+ Q! n
switch(c){
, J& @4 s3 g3 T! C case '+':return t[0] += t[1];
; t/ \. J' s) l( l4 X' \' L5 U4 ^ case '-':return t[0] -= t[1];
$ ~. X7 p! |" a" N case '*':return t[0] *= t[1];' i; m1 N4 c8 d6 J5 Q* R
default: return t[0] /= t[1];//case '/':& @* V# P Q8 e( |
}8 `9 Q0 d0 }4 C' Z& q/ H
}}3 N( P# |, @$ o H# H
template <class _T, class _Tstream>
8 A) b7 W2 q6 k) K3 h: w/* _Tstream: inputstream, _T: get return value+ g& `7 R' t/ I! C$ n2 K: k
* Return nonzero if get value successfully */
* o9 J( ?. @$ P/ `. \3 ?% Rint GetExpValue(_Tstream& istrin, _T& nReturn){' _+ ~" r% J( y/ T4 W4 |+ [
_T t[3] = {0}; //雨中飞燕之作
4 G F1 F6 M, L$ M S3 ]8 N! w char csym[3] = "++";
9 @# m4 _; {2 \; e0 ~" G7 L! F int nLevel = 1, nERR = 0;
+ |. g# J' W* @ if(!(istrin>>t[1]))istrin.clear();
* E! j% [4 k% I2 P8 d& R for(;;){
- U* K1 g( |* k& M3 F7 A/ J z' `/ Z if(istrin>>csym[2]){
! b) g5 ^5 |) D3 q' y: ]; n0 }4 g switch(csym[2]){. ^* }3 x7 T; q/ q3 h
case '(':
. R% u% J* ~5 G if(!csym[1]){nLevel=0x100; nERR=1;}else
1 X2 v" k8 M) S. s if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
# a# B9 i3 ^$ M, G6 L else{nLevel=0x100; nERR=1;}/ O$ Q6 m+ R# f
break;
0 O! @" ~- s! q6 O* D case ')':& z, z6 }/ u/ K
{nLevel = 0x100;}break;
5 p, M1 d) u) R8 ]! S$ R- k case '+':case '-':case '*':case '/':
) Z5 U6 P7 x& \4 P3 b {csym[nLevel++] = csym[2];}break;5 q- J" I2 ~8 @% Y5 k8 m
case ' ':case '\r':case '\n':case '\t':continue;- N0 S0 N5 f7 N! s( Z
default:
, S. m7 N& D: y7 j, ^: M3 V {nLevel=0x100; nERR=1;}, v6 ~. Y/ a0 ^: ~* T
}8 j0 S$ H. w5 G4 U. A
if(nLevel==0x100)break;! u* m2 u0 N+ u1 B6 ^6 Y) @% I
if(nLevel&0x10 || istrin>>t[2]){/ [* G, g+ P' O6 q' X. }9 N( ^ t S4 d% |
nLevel &= 0xF;& ?) S" H( D) C6 N9 \' f
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}1 ^4 [9 l2 F5 z5 r5 i
if(csym[1]=='*'||csym[1]=='/'){
" F6 E/ V) i0 l! u GetExpValue(t+1, csym[1]);6 z2 g9 P, P3 ] C6 o8 K. ]% ]0 N) z
}" y0 M2 F2 F' x' L. b" V
else{( b, A4 H+ Y; N: P [( ~
GetExpValue(t, csym[0]);
( g3 a, t, d7 \4 \' A5 Z1 p0 _ t[1]=t[2];csym[0]=csym[1];csym[1]=0;# U) S ]. e c$ D
}0 s* G' ^" ~/ s
nLevel = 1;
- Z+ t) y$ _* |! t/ U: K+ X }
" ?4 J5 N2 m6 U else istrin.clear();
, ?/ I% e; _0 W1 M) s8 B }
( X6 K4 K: X) w0 A" p$ l: i0 { else{nERR = -1; break;}
I, Q* \2 ] v3 P9 ~6 @, u; J5 {- n }/ F3 ?! p# I$ Y! O5 _* ^; N `
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);+ ^& e. t9 l( a0 ^% ^ j
else nReturn=GetExpValue(t, csym[0]);+ F. S t* o7 y' y5 v' U, b3 Q: N
return nERR==-1?1:0;
5 [# | I) x2 {}}/ g, e1 M" x4 u" t i" }
4 Q' e- Q$ o: h0 V) w
+ w3 r; I9 d1 n6 [/ a* o( w% g& G
: d# B4 K/ ?* w: `/ Q函数模板使用示例:! j( p8 B, P! r4 ]5 T( g
在以上那段代码的后面加上以下代码:) W6 R3 i* G5 Q# Y& Q) w
: c! }' u- _. I" H
& X& |' N1 i9 V8 Q8 U b! M. N+ I1 Z4 ]+ t
程序代码: 5 M' s+ z( s( A, V! H4 L; q
, ~6 C y: F' I. l9 Z
#include<strstream>
* m; @2 j5 E. I2 M8 d#include<iostream>
; Z' i( q* o1 `7 e) B4 w5 q: g#include<string>
* ]8 I' U" ^; r9 L) x4 C( Susing namespace std;
: V8 a' t% a1 f- kint main(void) ^' _/ R' K$ X( k" O' U$ p3 [
{
, C7 E8 Y# N/ a- D8 T string s1;) n4 q" g! e8 t% R9 G+ P
while(cin>>s1)
' z* `6 u' }) ~6 g, l3 F {# L' M" V2 n4 A: B, H/ H5 S0 l) w m
istrstream isin(s1.data());
" @ h3 o T4 y! K double d;
% b: P: L! o$ m- H! F' \ if(fy_Exp::GetExpValue(isin, d))
( ^; Z% N2 _* S0 S6 m! ]. d {
( w* w" A5 q: [: H! Z5 g cout<<d<<endl;
0 e$ ]3 U8 O) T' j }
- K! I' a4 ~ f# M6 _- I1 E2 b" a else; J/ w; r; Y6 `7 j6 w* ]0 G. C' L
{
8 p' V$ F. h& Z) I; @8 b cout<<"ERROR"<<endl;2 D! A1 r3 E3 j5 b; J8 S
}
- S7 j4 `! A+ R8 o; R, r4 T# E) } }
$ _( I( Y- x) i$ F. U return 0;
4 t8 X) ^, a) Q4 P4 J}9 J& ]( E+ x Q ?& ~. H
( \0 J) D2 x7 @* n$ b* [$ |
$ n$ Q% o; R/ \+ N
然后编译执行就可以了(*^_^*)! ?5 a; C% X: z
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
) N) y: C* }2 q 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|