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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
' a- p# E+ b* L4 d" b1 [' `( A, a6 Q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
* N9 |0 H+ _, m. h. b只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" l G0 F( x, o+ O参数解释:
5 j' s* \6 W' mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
7 O g0 |$ c& B! n0 ]* AnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
6 U0 M( _$ t- d返回值:2 K7 K) M0 `- N
返回非0表示计算成功,0表示计算失败有错误5 z: e3 Q4 y# m5 [( |' z
, @ a7 F S) C h2 s
' j# p! j$ ?6 X# p- ^& u
5 Y' i# m1 M+ s' M" G! N
程序代码: 3 f7 r0 k- n! M
h6 e ?) S# Z) G7 u2 w( unamespace fy_Exp{
+ x& S7 y7 `' L/ B& Mnamespace {template <class _T>
, G ]' l8 T N! |# ?! p" O/ }. X) ainline _T GetExpValue(_T t[], char& csym){
4 Y- r5 Z& G1 c- @# b! c char c=csym; csym=0;
$ D" L% W0 L* v4 u* P% I5 k3 k6 ] switch(c){5 y; _9 q4 {2 `" }6 u
case '+':return t[0] += t[1];7 X# V c9 Q9 ~) \
case '-':return t[0] -= t[1];+ k2 G4 T* b$ M6 ?% A) g* Z
case '*':return t[0] *= t[1];1 L' B! {3 P6 \; U D- |5 C
default: return t[0] /= t[1];//case '/':
7 b- l, C. k% [# O& \- Z }/ N; L/ x: q5 E0 Z7 @
}}
4 F% b% L6 T- r/ Etemplate <class _T, class _Tstream>
2 j4 N. z$ f+ X, l" _/ d% \" H" w/* _Tstream: inputstream, _T: get return value/ i: ~6 {+ K _9 O0 q$ h+ @
* Return nonzero if get value successfully */
8 K8 g+ Y$ M& s# _% x9 M# dint GetExpValue(_Tstream& istrin, _T& nReturn){
- I! u. M& w7 _9 m) h M, I _T t[3] = {0}; //雨中飞燕之作' b) M) |, m# y+ v8 X; |3 {4 p
char csym[3] = "++";# v3 s n) \6 I9 v
int nLevel = 1, nERR = 0;
8 ^8 P- b x; ?& ^4 v if(!(istrin>>t[1]))istrin.clear();0 C1 A9 p p: Y
for(;;){
0 L1 ^8 C1 }5 t) X; J& \ if(istrin>>csym[2]){0 C6 h/ g' C5 {3 A' }
switch(csym[2]){
( n f; T' ~0 B* m1 s3 E4 k case '(':- }! f4 d4 J/ `" B
if(!csym[1]){nLevel=0x100; nERR=1;}else
, u7 S( M3 J; V6 _2 B( Z if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 z! M! w# V9 ~+ F3 Z% _
else{nLevel=0x100; nERR=1;}2 y5 y. Q" p" p' k/ s
break;( i1 A* h s8 e% q" ?
case ')':& F& r1 Z; ]& y
{nLevel = 0x100;}break;
6 [& }# ^4 ]1 P5 l8 S& X+ V case '+':case '-':case '*':case '/':
. p9 V- a3 i7 W {csym[nLevel++] = csym[2];}break;- c- ^) z3 l' N8 ?/ H
case ' ':case '\r':case '\n':case '\t':continue;
' H+ j1 n+ T. m3 k/ @/ Y) F default:
* D- r' x; K H! K7 c {nLevel=0x100; nERR=1;}( m) J. Z `' J- V9 g) n! C
}
! ~! e8 W& {, a# w if(nLevel==0x100)break;
+ L: f0 z. h# _4 w if(nLevel&0x10 || istrin>>t[2]){7 G" W5 `* ?! H- M
nLevel &= 0xF;( I% y% L0 [6 b8 r7 j
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 v% d& d+ A" w' g+ {5 M
if(csym[1]=='*'||csym[1]=='/'){
; V- z1 K) K: H2 C- a2 R GetExpValue(t+1, csym[1]);" o* c% E. G! e5 p* s, y1 f
}4 x L% r& c. `0 u2 V
else{3 \/ ~8 \! {# _2 O7 m# b
GetExpValue(t, csym[0]);5 ^( V# J" R3 ~" k
t[1]=t[2];csym[0]=csym[1];csym[1]=0;4 V) |" V3 E5 h1 t' }3 `* M8 d' m
}
" I* R Z3 y9 t, i& B, R nLevel = 1;* a% ~' J3 h C' l
}# c, w9 B1 |# {
else istrin.clear();$ \2 w# ~ ]$ c& j
}
* i6 p1 Q. J' s w- _ else{nERR = -1; break;}
3 M% C, n1 p. ~) A4 G# f* f }8 g5 w8 p: V; v
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);% [0 _$ t/ G. O5 N" A; _5 ^
else nReturn=GetExpValue(t, csym[0]);
" e* h& Q$ s2 z0 X return nERR==-1?1:0;8 z2 n$ |# ]# x6 }5 A
}}
' U# o3 t% B0 I( T3 _, z0 M. ?9 R
! Y e5 p+ G4 h1 z
: I( i I# _* ?5 }4 Y函数模板使用示例:3 |# d, m3 |% @& Q0 m
在以上那段代码的后面加上以下代码:
+ G! h: k/ d2 M2 T! B' q
8 w( N) x7 f6 J- n# E0 X4 d0 ` * e& e5 @' _# k' ^) F8 N
6 } Y3 z" [; R9 v
程序代码: ! u, u0 z8 O& D) y+ e% T" _0 N
e, I C/ o7 K! v4 s% b#include<strstream>
- T$ } q' o v1 Q#include<iostream>
; V K9 ?/ E X1 q: a#include<string>
5 r6 P/ n) B5 b; B) v) Uusing namespace std;+ ]1 Y) g6 k6 Y K( I. @* i
int main(void)
' i$ _1 j( i" A; ]/ n{7 X7 D4 [" b0 t k& l, s C
string s1;
5 x" G6 G5 c% P; _# l5 F while(cin>>s1)/ w! G. h( w+ w) {! Q4 U1 V/ l+ D
{/ L" r8 s8 P& E5 a; \6 ?5 W
istrstream isin(s1.data());+ J! Q% \7 \" B
double d;
3 C4 i# ~3 Z; M& f' j& i6 V if(fy_Exp::GetExpValue(isin, d))0 b& b- ~5 F& @$ y
{1 E6 A \7 o, N7 N7 [, z% M% x1 R
cout<<d<<endl;, u- ^ V* J! Y1 m" h$ z
}( @; l7 Q& [7 ^& y, ]- Y& O
else
5 h5 u; a' O# s0 Q {
% t' j& E6 F7 P8 X: k! k cout<<"ERROR"<<endl;
k; }( i1 Q9 |: V3 O+ a. _ }( v; a' h9 a, |$ j
}; D8 u, ~1 O4 Y6 Z% y- W6 T1 q7 l
return 0;
- z4 w5 u# ^' a# Q0 T}8 V% G; z$ V" Q, r0 B/ R
% g4 G7 a+ l; T/ ?' R4 o! f: B* h3 d2 Q# f5 E
然后编译执行就可以了(*^_^*)
/ V" w! Q* H" `7 I其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 ?! X+ b( W9 @ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|