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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,' ~1 n$ x, f+ n
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
# _1 @$ K7 M1 q只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)4 {$ }6 m+ |( A
参数解释:
2 |" U2 |2 W- B T: e+ c" Xistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
$ D2 m5 V, q: x5 f' m+ ZnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
4 t9 R0 { @, A5 `, B: }# T返回值:
$ q9 n+ G) w W; c返回非0表示计算成功,0表示计算失败有错误( M! [3 V( a$ ^* o
" E1 j. [; U$ L2 P5 ^
2 M! A2 @3 x; S$ t; P' ^4 c1 [' Z) T* R# F0 p; T% B7 t' O
程序代码: ) w0 S9 A" Z3 U" k
( `% }" Z+ |: nnamespace fy_Exp{
6 N+ L. d w* L9 D- Unamespace {template <class _T>/ E; Z3 m$ A1 X0 W3 m4 [' _
inline _T GetExpValue(_T t[], char& csym){
. s- A- ?5 M9 U& X% n! Z char c=csym; csym=0;) O" u* R/ \% G5 w
switch(c){) a6 @% Q9 ^! c! y/ I* o
case '+':return t[0] += t[1];% j |4 P; i2 d0 _3 P3 m7 \
case '-':return t[0] -= t[1];* [; ]" j- L) u5 e. T0 q8 ]7 _
case '*':return t[0] *= t[1];
9 S; K" ~/ b \3 T) e8 T* y default: return t[0] /= t[1];//case '/':+ |% s% X- f- c7 o$ Y0 k, j5 x
}3 p4 H; V# `5 \9 e4 Z
}}
3 y% \( f% L2 w+ M# \6 }$ Ptemplate <class _T, class _Tstream>1 m; D8 u7 c2 @
/* _Tstream: inputstream, _T: get return value
0 x- q- i# ^+ `* Return nonzero if get value successfully */
. X/ F& V" [; F* k$ |* u fint GetExpValue(_Tstream& istrin, _T& nReturn){' j# Q* r% F9 H' s& M$ n4 \
_T t[3] = {0}; //雨中飞燕之作
" F% {1 g) c; ?7 |6 Q; z5 V4 c* Y char csym[3] = "++";
% |3 u5 G% J) u6 e m( C int nLevel = 1, nERR = 0;/ c% T0 N- \( w6 |6 J
if(!(istrin>>t[1]))istrin.clear();
- P' F* i9 A m for(;;){+ R" `' L7 A1 C0 ?# V7 X
if(istrin>>csym[2]){
' o% m' H& c; {/ M9 ~ switch(csym[2]){7 r: u3 C+ T1 `
case '(':5 c3 X! z0 ]- m+ d
if(!csym[1]){nLevel=0x100; nERR=1;}else
0 W! W# t3 Z# @ if(!GetExpValue(istrin, t[2]))nLevel|=0x10;5 R, x9 A. I& ?3 k- ?: u
else{nLevel=0x100; nERR=1;}$ t3 Z4 b4 b$ k& F; b
break;
1 v6 C) j% P( e; N/ x2 ]% F case ')':4 Y6 H8 ^/ i; |. h. r, u9 _1 l
{nLevel = 0x100;}break;2 C$ ? t1 E4 U+ e- D
case '+':case '-':case '*':case '/':
. g. k3 ]) a! a/ U/ f* N0 `- l4 M {csym[nLevel++] = csym[2];}break;6 s# |7 S0 V2 n5 I2 p2 b ^+ L2 G
case ' ':case '\r':case '\n':case '\t':continue;6 y" Y: |5 p/ }6 i9 z; b" ?: |3 b8 z
default:9 C# q9 H+ \2 B+ |- W2 I3 F) L5 E
{nLevel=0x100; nERR=1;}2 X _8 R$ {( @
}3 ~. l: `/ Q" l3 Y% x' `
if(nLevel==0x100)break;
. ~4 s! o, S: p, \2 K4 ]+ A+ j if(nLevel&0x10 || istrin>>t[2]){/ |( J1 Y& M$ \# |8 w# N" d: }
nLevel &= 0xF;3 N4 x r' i2 V" Y5 m
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
- R/ B7 s) w) x if(csym[1]=='*'||csym[1]=='/'){; j* {, Z- W% e
GetExpValue(t+1, csym[1]);4 s: B3 w6 C, s: ?6 o8 d% f
}6 _2 u& L p; Z2 `
else{
- V4 D! x" G* ~8 M GetExpValue(t, csym[0]); Y) F( ?* N* O; N
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
1 c: t; ?, X& D& F: ?, } }4 I! I! A$ C% p4 C/ _. S
nLevel = 1;
$ `, {3 I/ d7 w# V# |* A4 @8 x0 } }
* ~* q" S" k4 F; A" j else istrin.clear();
! q; P5 L$ l$ ] w0 V/ z }
p1 T! `9 z/ a! n$ t, V1 j else{nERR = -1; break;}2 D2 x( G; w7 z/ z
}
: k7 N$ \! T3 r1 m if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
1 F& c. p6 H4 \1 A: P else nReturn=GetExpValue(t, csym[0]);# T4 a# O: p. z& W$ S( L
return nERR==-1?1:0;+ ^( r& Y: u2 J! M
}}" O( h" d1 V6 L1 ^
3 C9 X9 ~; v, z1 q+ d2 C+ \9 B
9 i5 T9 W8 i5 N9 X
; `/ Z8 n5 O: u& r函数模板使用示例:& H( h' u: Z7 |+ q. `7 _. a2 z3 v
在以上那段代码的后面加上以下代码:5 R8 p$ J9 l& ^9 D. Q- m
% T5 E1 {9 l2 m 1 O. g4 w/ R% r
2 D, I2 V' e* _2 ?1 X
程序代码: 4 W6 W" S$ ]9 }/ n9 {/ I3 L
( I7 f8 Y& D1 a+ [9 E
#include<strstream>
% _0 m( N6 F% y& B! f) X, x#include<iostream>, d0 w6 |0 Q: e4 o% r1 J0 s/ {* u
#include<string>
/ p8 m) u; i; ~8 }/ iusing namespace std;
3 V$ p2 G) n4 F& P. Y# xint main(void); M& @; A. S+ u
{5 A( |' M- g5 G, p- r) Q
string s1;
4 W7 h* H( M) ?9 F while(cin>>s1)
: g6 G1 R$ U* a, }0 J6 N5 L {
" D+ f0 M4 U( |4 {, m istrstream isin(s1.data());( R$ @% P' q5 Z3 i' Q3 k
double d;
) ?5 n+ p- P% G ~7 ] if(fy_Exp::GetExpValue(isin, d))
6 n: n' A: V! F: X7 S! V {
/ W1 N8 _5 i% y cout<<d<<endl;
; ^) k: d5 J) m2 Z( Q) a }, b# X: B7 |% j
else
% v+ V- X2 {1 c2 x/ | q4 k {
6 {2 T5 _4 H \, h# I7 f& } cout<<"ERROR"<<endl;
3 \3 ~, S' V0 j4 V [ }
+ B1 |" A5 q3 x i }4 D9 C* N+ I! s: ]( w. {
return 0;9 Y- j- F8 V c' h5 j4 `& C, y
}
' v1 d, D7 e! G! x" E8 P8 T" P
+ C+ D$ ^7 Z3 h2 R0 x1 d
然后编译执行就可以了(*^_^*)( U! Q; q; a$ ]3 D2 m
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
8 q! b! d1 A7 _; O5 F7 I- S% D% @) s 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|