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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
" J1 P8 O1 y# F7 f9 `一个很方便的函数模板,可以并且只可以计算含括号的四则表达式 n- A. F9 ]! p3 R' W7 I
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
) x# V* ^ ]5 x# u参数解释:
7 y" ~. C2 R& t8 J( vistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
' c7 ~8 n+ ~+ Q( a: D- wnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
' q. ?: M1 C y1 U返回值:
- x) L* Y7 W; b: D+ {8 ]9 r返回非0表示计算成功,0表示计算失败有错误8 X. m6 v. j% n' @9 L/ {3 @
& N6 |9 ]5 i( h) n6 u1 J9 L ) d) E7 @! L& n" v; n
: ] S# R0 _8 \9 R9 u
程序代码: , d* u. F, |4 C& f$ Q
1 Y: L2 b5 b& a, B' Q/ [3 X
namespace fy_Exp{
) ^& X9 O) y( z0 N) m- `0 unamespace {template <class _T># \% [6 W+ S) J: o
inline _T GetExpValue(_T t[], char& csym){
* ]2 h1 ~ E) L2 ` char c=csym; csym=0;& ]3 v t9 T3 }/ J' E! l
switch(c){2 v7 c3 d' ?, \4 B
case '+':return t[0] += t[1];( Z3 F, |* c2 `2 P
case '-':return t[0] -= t[1];
K" v) F7 L( X' f) e2 E& ^) K; q* ] case '*':return t[0] *= t[1];
; ]3 a* {8 ]% `3 E; ? default: return t[0] /= t[1];//case '/':, }, r( {5 u# j0 D7 |
}1 L9 P% }# f3 a# t4 [
}}
, c( ^5 r4 V! m" b/ ^4 y& p- A1 t1 Ftemplate <class _T, class _Tstream>
5 F5 W. e1 L3 `7 y/ q/* _Tstream: inputstream, _T: get return value
- k( U; P3 I3 \/ I y; [- S/ u* Return nonzero if get value successfully */: l% G5 B. s8 `7 F
int GetExpValue(_Tstream& istrin, _T& nReturn){
. i0 q5 s' E1 W. D2 c" [ _T t[3] = {0}; //雨中飞燕之作9 j- m) n3 Q) O4 ]" u; \
char csym[3] = "++";2 ^2 J% O) V: g, S! p& A
int nLevel = 1, nERR = 0;- l0 Z' l7 W" y9 u. M9 u
if(!(istrin>>t[1]))istrin.clear();
/ _1 S4 U' y* w" I) k0 m! Q7 B for(;;){" M7 h0 U7 w; o9 u/ W/ |4 r
if(istrin>>csym[2]){
5 H; q: k8 _/ J switch(csym[2]){, |2 J$ B7 A( N7 r7 r
case '(':
" @- d. J( v9 t8 t+ J6 Z, B if(!csym[1]){nLevel=0x100; nERR=1;}else
T) t7 `! ?' f! C6 ?$ k if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
( C- H, A) K) A# J5 Q' d else{nLevel=0x100; nERR=1;}8 r* q& D. l1 z! I. w
break;& ~- ]8 e E1 z. L. G
case ')':2 t* k2 ^ R2 r9 S
{nLevel = 0x100;}break;/ c7 k6 ~0 |9 u x# u
case '+':case '-':case '*':case '/':
2 T" [) }) k! W: N4 n) H9 ^ {csym[nLevel++] = csym[2];}break;
3 ^, N* z8 N9 B. Z. ~& c2 a* d) { case ' ':case '\r':case '\n':case '\t':continue;
) W" r% \0 l* y" c) {8 C default:0 E! u- _* ~& F; m
{nLevel=0x100; nERR=1;}3 j9 P0 W( b2 `# D% w& _9 R( ]7 z
}
! ?5 e- Q. U: g6 G2 p if(nLevel==0x100)break;9 l% N; S" R% K0 C8 m2 u
if(nLevel&0x10 || istrin>>t[2]){! |0 r3 @' G6 @5 n$ a9 D
nLevel &= 0xF;
4 }+ C" u% C6 {( p if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
: X* G/ Q5 P1 U: u0 T. z! S$ t+ H if(csym[1]=='*'||csym[1]=='/'){; {+ v5 ?. O# O' h
GetExpValue(t+1, csym[1]);
$ l! h4 ?8 f- Q! y6 T7 b0 R( W6 S }+ z% J! k" l9 B# j: Q
else{
3 ~ k- g' z6 T) {6 W' e2 C GetExpValue(t, csym[0]);
4 w1 b: z. ` h2 i, d0 w4 ~ t[1]=t[2];csym[0]=csym[1];csym[1]=0;$ S4 t8 v$ N2 `$ j2 T" \: J* }0 _
}/ z% r7 R; S3 n5 H n% v, W3 C; K
nLevel = 1;) F' b/ f& @# A2 v. l) X
}
1 T5 n8 Q; }4 D" H+ M1 j. ~ else istrin.clear();
4 P. x# B% r) u& F% L }2 A( {/ U6 Z0 G' b4 Z0 ?' _
else{nERR = -1; break;}3 L" q" |* l6 g: I( c" W6 ]
}
; H1 b! E6 f, S if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
7 D0 J! q; m) d5 L9 d+ T6 k else nReturn=GetExpValue(t, csym[0]);
/ m1 J" k: c4 v. ? return nERR==-1?1:0;
2 C; `5 }+ H4 L6 S" X2 M& E. q0 i}}2 i8 c3 @/ v/ u/ ?! _; `3 i
& r u. A/ c e8 d
5 } i# C, i, U2 Z8 t* I/ F
9 ?4 Y& e- b5 v0 n- r/ B$ V) @
函数模板使用示例:& z+ N) K3 }+ v' S8 q( G2 c8 `
在以上那段代码的后面加上以下代码:
- N# G& K9 ?5 J+ H( M
F8 i" _) b1 M1 k' ^+ a, X
9 N5 B( p+ Z6 K! Y4 a. n- E. i, C( ~% p" W: f( ]
程序代码:
+ O: O: ~ v" K3 h! N8 }
' |! K% ^& Q6 l2 E3 C( `; I- L#include<strstream>: k) X- T/ P$ L- `( \/ ?
#include<iostream>
3 A8 z; h, ~; ^- _4 R#include<string>( z% T& g' w: a, ]* w
using namespace std;
! }* ?9 j6 m. |' A2 D4 g3 D, Xint main(void)
! b3 S3 K- c) h2 u, u0 ~; c{& {5 e5 j n4 y T! p& B
string s1;
1 l# e% G$ S9 _+ v0 e# J while(cin>>s1)
v! T) N' b9 L5 B) e/ |; v. q7 J {
" w- Q( |3 `9 w2 K- m7 V istrstream isin(s1.data());, d+ _/ Q! c, S" }( b% M
double d;: q2 q9 D* f' e6 n
if(fy_Exp::GetExpValue(isin, d))- O! E- B7 Z/ }8 c& {
{
6 Z5 A/ L- M) ~( z1 H3 Y2 r# [ cout<<d<<endl;. d {# v C' m' L
}& X4 l9 Q0 w8 H5 }
else
5 B/ I) C* Z' B! W" x1 [ {" w$ B, |3 a7 P4 e7 _5 M. C( K" G
cout<<"ERROR"<<endl;
( Z0 s/ \7 z0 X' b& k( G6 B U }
+ k% Z: P. Z! @+ {% N }
" L" @8 o3 l5 q8 [5 p0 k return 0;2 d! }- X9 K2 l- l
}
2 {! E. m% H+ P, I: U/ }5 E) i+ l: q0 j% Y( ~8 t
9 P- V6 o( E+ E, [+ r
然后编译执行就可以了(*^_^*)( o( u% R2 @9 r+ ^6 Q2 r! q: [( Q
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
7 j- {9 u1 |$ \+ u2 [ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|