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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,4 M/ H# g. A! O4 x
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式7 N$ ]# L; `0 t# o
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
1 b8 ?' r, a! ]9 o5 d' H& N% H参数解释:( B8 \! a$ U2 S3 b1 O1 R
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流2 r$ N" ]2 K1 b( h- ?5 J
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
9 d* b" f- Q% y! v返回值:
: Z& c4 r8 U. y% @返回非0表示计算成功,0表示计算失败有错误- s, j& A6 K$ e7 B0 u, q9 k* I
' d' c# Q1 r# L( h2 w
* {$ ^9 x3 a- O3 X" l, G4 e2 Y- Y$ d7 s3 A0 d- L# k
程序代码: / C! ]; F) E4 H4 r9 s' J
2 ?0 F6 P5 F0 X1 D. o5 d4 Nnamespace fy_Exp{. k5 P+ U5 I$ [; ?" |0 d$ k
namespace {template <class _T>
# U3 k" m' ^4 q$ g0 Zinline _T GetExpValue(_T t[], char& csym){* A# T; F+ A0 ]7 S7 M T
char c=csym; csym=0;8 D8 s( Y: _' i' w! u
switch(c){! u/ w2 Q4 [2 |5 n4 ^* W8 |, Q
case '+':return t[0] += t[1];
+ K* e% Z- J6 j1 m, Y5 T case '-':return t[0] -= t[1];. ~( ^& F' b: T7 B
case '*':return t[0] *= t[1];
f& S# u1 X0 G: j. I% m- n default: return t[0] /= t[1];//case '/':4 E' ~% x/ j l; J
}! ]8 x9 o8 w+ o+ d
}}+ a2 \" @3 L [4 v. Q" n
template <class _T, class _Tstream>6 ?8 i* s6 B( O- G: \8 t
/* _Tstream: inputstream, _T: get return value- S4 h5 p7 z G2 @/ B* H M
* Return nonzero if get value successfully */
$ W& V r8 E4 c+ Fint GetExpValue(_Tstream& istrin, _T& nReturn){
/ @$ X* v7 X; F1 G* K, Q _T t[3] = {0}; //雨中飞燕之作
. g& L3 R6 x$ W8 V! Z; A7 H& x6 a char csym[3] = "++";, i4 q9 a5 H4 f! p
int nLevel = 1, nERR = 0;
7 Y- t- v. |5 m" w1 a if(!(istrin>>t[1]))istrin.clear();, n6 H# Y, ?% B6 P8 b
for(;;){
" J% \8 `2 J7 h) ]& N if(istrin>>csym[2]){4 X1 e( v$ x2 H" z
switch(csym[2]){
8 w- C* \, e6 c2 z case '(':
6 {) Q8 y: Q! ? if(!csym[1]){nLevel=0x100; nERR=1;}else
: E/ S( X5 l6 Y if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
* j* k5 B: w1 Z$ O% U else{nLevel=0x100; nERR=1;}
+ X* n9 Z7 N8 K# I& K. Q break;
3 @7 _6 Y ~) y0 T' T& U4 F# ?- G case ')':
* W0 p6 e3 e3 R( q# b {nLevel = 0x100;}break;
# l7 `: X9 x4 [- |* \; o* ^$ V# g7 L case '+':case '-':case '*':case '/':
+ @* V- r9 N% m% g8 [3 k {csym[nLevel++] = csym[2];}break;
( b" V- ^) w& X; H# l2 o3 \ case ' ':case '\r':case '\n':case '\t':continue;+ t* q% k. F+ q" S& U. @7 Z
default:
" @2 F2 D: @4 a" N" x {nLevel=0x100; nERR=1;}
9 N/ v3 o2 J9 I8 r }* {0 C0 K# ~( ~ }
if(nLevel==0x100)break;
' i3 \1 u) E' @2 f0 ~1 ] if(nLevel&0x10 || istrin>>t[2]){
6 k' u+ p( O6 z- k/ p nLevel &= 0xF;
" d; I9 V0 [* G( A2 l S) Q5 ^ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}) E" ? l( y0 S i1 q- r2 j! e% f
if(csym[1]=='*'||csym[1]=='/'){1 P# x3 a) w$ N" }
GetExpValue(t+1, csym[1]);5 q; ]8 n% h" b5 ~# f
}
& Z/ R \! |+ M! R. m' L else{, K6 ?. E4 A) B( S, J/ u) A( D
GetExpValue(t, csym[0]);
9 J; e/ L- I; M t[1]=t[2];csym[0]=csym[1];csym[1]=0;/ I: h+ ~# v$ H: x" R s% c
}3 Y- G& R; O" U# T) I4 Y
nLevel = 1;# |. r/ l, K) x% ~; ~
}1 s; q- v+ ~/ V0 K( B; ~
else istrin.clear();+ N$ I. U2 d s( `+ h4 @
}
$ S; M3 S" S$ m& G7 N( r p else{nERR = -1; break;}: T' C, Y& w, I7 |0 G
}( g; z6 M; [$ S( s3 x# z
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
9 `3 o ]* z2 m else nReturn=GetExpValue(t, csym[0]);' O0 T# A5 X; b# W( K
return nERR==-1?1:0;3 Z4 E2 }: X; S
}}0 ^3 q+ N3 u" _2 z
1 x1 {' w! K" }! e
) O& h8 \. q; ^: Q' [! y
7 u& G6 i: Z+ c6 x* A7 c2 Y/ \函数模板使用示例:, j% v, {& ^2 J* D8 Y
在以上那段代码的后面加上以下代码:# D" U6 a f9 c. Z
: }& D. N; y w$ n Y% o
. u; [# W2 f* \( P+ ?8 \. X, e, {: v1 w, {
程序代码: . \8 a: g' w& H& n, ?) w8 b7 w& K
* d2 W( d. A7 E5 x% f#include<strstream>
( ~: h7 ]( c7 u) L2 U9 B) {+ i#include<iostream>
W/ t. n6 ^6 [; _+ T# Y& |) J4 f#include<string>
+ l. p6 [5 {3 G' L6 E( X) A; [using namespace std;, d" D: S+ ?# V1 P
int main(void)
- k! h0 E6 T% X b! }{7 a6 k1 l; Z8 _; R# D9 e
string s1;
% w- b. `$ J" b6 Y$ e& E6 t* G while(cin>>s1)
# c5 k1 B$ L( f' K) F T {5 w% _! n& \+ }3 b* d4 Q% L p- h
istrstream isin(s1.data());
* z8 X! |9 t1 E% w7 z5 w( g8 v double d;9 A- @( D, K, H) h
if(fy_Exp::GetExpValue(isin, d))( E8 B6 T- Z" C
{, Z& ]! y' Q9 ~( P& l& F
cout<<d<<endl;9 P- Y9 l4 o# X3 @ K
}
; r5 Y0 x) u; y, s else3 z5 D1 T B9 X8 g0 ^! t) x
{
' i u8 g6 p) W# d2 n cout<<"ERROR"<<endl;
' R: r0 |' i4 {- ?( `# p }
2 w% }$ o& E3 {. z) V0 ?: g }$ L9 n8 M( N7 S# Z; C& `: C1 k. j
return 0;! R/ |9 D8 d! ]+ {0 O" {
}
6 g+ }; ?9 r% C
4 G! j) Z2 M2 W0 t; U5 M: C
8 N* D! I9 K" E1 [+ A然后编译执行就可以了(*^_^*)( r s& ^ k3 A5 `2 O1 d0 S
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
) F' G4 K& M V- N 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|