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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
7 Y2 z$ E( q: z0 B3 \+ \3 ~+ s& Q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式* l/ E0 J6 Y8 Z! X
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
1 f; B* Y% V, `- M% c9 ~6 R; u参数解释:3 j2 `; u# u4 X3 F( h
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
7 z P7 H' T; w& H. d" p# U: f% znReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定* B& `4 }, E2 f' r8 f
返回值:
. r* ]% ^, ?! a; s, y, ?返回非0表示计算成功,0表示计算失败有错误. M# C& u4 B3 p! e# V- w# c' H0 _
6 X8 G1 k1 {! S) O( Y, A& F
% Z7 U) a" b: d0 a/ h0 T8 Y
- y) L, F+ z1 j+ _8 N! s程序代码: 5 D* f+ t- S6 ~$ C
! {. f) F @' {& ?
namespace fy_Exp{
" V$ W1 {& d% y( P% A. s. i3 ^3 z) H- Jnamespace {template <class _T>1 T# g, M4 I! N0 w
inline _T GetExpValue(_T t[], char& csym){
. G& m2 |; R) j0 c1 l- Q char c=csym; csym=0;
' ?4 F. d5 p* n* L0 y switch(c){
8 V2 O$ v: H4 t/ N \: \8 O! m case '+':return t[0] += t[1];
2 b7 n7 A! U/ C! c' i9 S3 r case '-':return t[0] -= t[1];
* r' @8 j: o( v4 z6 c0 G. p, C case '*':return t[0] *= t[1];
' {! I$ K3 m& W8 M. a `9 | default: return t[0] /= t[1];//case '/':
9 S$ ~& s% L' W5 b2 g& ] }% [# N9 V/ f6 k
}}- D5 G1 t& t4 [( @% \
template <class _T, class _Tstream>; `4 L+ A% g* z! c" F
/* _Tstream: inputstream, _T: get return value
8 c/ ^/ |4 q2 I* Return nonzero if get value successfully */
2 z: l( D1 v2 x4 f1 Pint GetExpValue(_Tstream& istrin, _T& nReturn){- l( e9 k3 L" i5 M: e
_T t[3] = {0}; //雨中飞燕之作8 [; N/ v! e8 }: c& k! d5 c( j
char csym[3] = "++";+ N P) x9 E7 \0 i% w D' E
int nLevel = 1, nERR = 0;6 Z/ C6 @0 I/ s4 P
if(!(istrin>>t[1]))istrin.clear();9 g! y# ~: Z7 z% i
for(;;){
6 u3 c: ^* X7 C3 W+ Y if(istrin>>csym[2]){
1 X7 f, n, \' X. z1 D switch(csym[2]){
* T- q- R) @- L& q6 } case '(':$ Y+ j: Q: W/ O5 f
if(!csym[1]){nLevel=0x100; nERR=1;}else& W* M2 Z6 n6 Y O" G1 X
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;# A% Q, Z1 ?) M Y; c
else{nLevel=0x100; nERR=1;}: S. B K; d1 O- f% a
break;0 s! L2 f$ h# ]
case ')':# E2 _7 e6 M; }$ V
{nLevel = 0x100;}break;% S _, g/ }& ^+ s7 i% h9 O
case '+':case '-':case '*':case '/':
0 L7 p, ]) d; `! m2 Z g {csym[nLevel++] = csym[2];}break;
( M. R: E$ s+ o n case ' ':case '\r':case '\n':case '\t':continue;
1 W( s1 k5 x+ {; l' e2 H: f7 T default:1 G7 ]; l( z) O7 M. i! L9 D# o# g
{nLevel=0x100; nERR=1;} S3 p' m: P" m8 ~1 S2 G1 C# W
}
4 J- {* Y4 @6 R+ h5 U& x if(nLevel==0x100)break;
1 r! ^* i4 f J if(nLevel&0x10 || istrin>>t[2]){
3 U2 x; T; R* l; U" U, W1 O6 S nLevel &= 0xF;& @4 l& x$ M# \5 S0 G
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
# |% ]3 I; A+ X2 ~ if(csym[1]=='*'||csym[1]=='/'){
' v1 N1 B/ U# x2 \ GetExpValue(t+1, csym[1]);! \' ]; h5 w1 b- I
}! ]. k. p }+ X4 g# E
else{9 Z9 E3 F1 C% w- ?
GetExpValue(t, csym[0]);, N2 H# u d. Y1 d4 n! u3 h7 P" ^
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
' @2 t# g1 S6 j( U% j }; B+ r0 V7 T3 v9 G/ o! [5 y
nLevel = 1;
S7 K0 q% U J `0 A }
2 G; s. y3 }; \6 f else istrin.clear();' H$ v' z( _3 u: ?2 }1 x/ y2 B
}- L, }/ U# w% T4 Y% S4 F ^6 |
else{nERR = -1; break;}
& g* d* `5 C. Q& w$ g# j! ^ }1 I2 Y2 g- q2 h8 q! d' a
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
6 |$ R' M- D5 v* J( O2 _$ h9 h else nReturn=GetExpValue(t, csym[0]);. J( |' J& ^2 {/ D! p9 S
return nERR==-1?1:0;
, }! }& B$ t" T: g}}8 X) G) ~* u* {2 Q- F5 v
; @' b; `, I6 \, q
/ D2 n* x: h: r2 `3 @# [
+ K4 q# ~0 r; d. Q函数模板使用示例:; f. D* ~/ ? P# A; I8 _0 L4 O
在以上那段代码的后面加上以下代码:
8 r; C) x6 M7 J. i4 P- O v( Q4 {; p" j3 F# {6 s6 |, ^& l) A% G T# J
# S8 D, M( y" x
; d) X& ^; z. j# D7 p: b% E5 z
程序代码: " C" f! w7 c) [, V5 u
9 T2 x1 i( G9 v#include<strstream>
, Z! k' f- a) X5 L& U* p#include<iostream>
. Z1 S/ k, T8 M. h8 S2 ]; H#include<string>
( B" F. _- x; dusing namespace std;
# w5 B# N; n8 tint main(void)
$ L) U7 O8 s: X( d* g{1 G# U! F3 ]7 ?0 V3 z( u
string s1;
( ^3 H- F- [& i1 H; o& |; Z while(cin>>s1)9 ?' _5 F7 S: ~4 M7 `% m+ C
{2 P" T$ J; M4 }3 D% k n
istrstream isin(s1.data());" V! T) a% A, q3 w
double d;2 b$ G6 Q* g9 |$ B- J
if(fy_Exp::GetExpValue(isin, d))
, |0 b" x+ Z% L, k) S6 I1 p' K; n {% \) Z; Q [4 {) t
cout<<d<<endl;/ u# q C4 ^! J. w
}! G, _2 c9 Z' T/ J- w3 J4 E7 b5 M5 v/ {
else
4 }6 U4 O! ^& Q3 M9 z) R {' n4 d& c0 M1 |0 A
cout<<"ERROR"<<endl;
' Z/ L/ |2 a- O1 e2 w$ b8 g7 A; ^ }
2 K. r- S; `* j: U* y }2 w, B" G5 \8 {* i0 t$ X! W: X
return 0;* f4 ^2 Y+ b' z5 I& s7 B8 C1 C
}9 t( l8 b. T' I" l4 @7 ]; M* l
5 F. D2 k! U4 R- {* a
3 z3 a" ?5 Z" m9 x' E/ u
然后编译执行就可以了(*^_^*)
}9 d7 X. D$ {# A其它:TC++上一定编译错误,不保证在VC6上也能通过编译
5 F5 t0 M( \( \8 M; T 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|