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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
5 f9 n, |# J; i" ], o一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
8 K$ B: Z4 e( V% p只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
3 w1 p3 `" ?& F q& H4 Y参数解释:% A+ k6 C2 |! D7 O
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% D H: n+ U# [( m" A& f
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定: e9 }& r- g {' g* q. t3 t! k
返回值:
. B- R9 [# c: t1 ^- j, b B返回非0表示计算成功,0表示计算失败有错误
- M+ A: e, N+ `) a( \6 s3 i9 y5 l4 @# o0 V3 p/ d- C! o/ W# b
0 X% ^- v% L! h, J
4 M% E. s% K( K) c6 ]" N程序代码:
3 \1 J: B) l7 F1 V* W O+ j1 a8 n8 k- N- z! N5 L! _
namespace fy_Exp{. G1 H- X0 c* a/ o+ P7 H! C# s1 a
namespace {template <class _T>
1 a% h6 o& n7 \ K2 V: v! Ninline _T GetExpValue(_T t[], char& csym){
8 m2 E4 w' u: x* g5 z8 b char c=csym; csym=0;
2 K: }% E; Y, I0 ~/ t! S! |4 } switch(c){
: T% v" j* [) z% @ case '+':return t[0] += t[1];
( @ U$ }/ c, N& }1 M3 L$ @ case '-':return t[0] -= t[1];
; P x# Y) `. D8 H! @0 s) {; c case '*':return t[0] *= t[1];* r7 {0 r* Z- u7 W5 ]$ h& Q% Z
default: return t[0] /= t[1];//case '/':
% V3 Z( X! G# ?2 D' j7 X }. ?/ d% a. O3 A& G) j& M' x. f
}}
7 t$ K; d2 U% d! L. K- n& `2 o' etemplate <class _T, class _Tstream>
! v, p0 u/ s7 P+ r/* _Tstream: inputstream, _T: get return value1 p" ?# O8 v' G. a
* Return nonzero if get value successfully */
% W6 s5 N" z* c; j+ gint GetExpValue(_Tstream& istrin, _T& nReturn){: _3 ~) c) j* k
_T t[3] = {0}; //雨中飞燕之作
) \& k5 {2 j+ v: ` char csym[3] = "++";$ f9 n0 ~7 v6 I8 k9 |2 m
int nLevel = 1, nERR = 0;
- ^' }& W* p, s- B, u" {9 K8 h3 W if(!(istrin>>t[1]))istrin.clear();
6 F* S3 F9 E* s2 T' ^ for(;;){
B9 a o9 l/ L* y$ _' @ if(istrin>>csym[2]){% Y, q3 ^$ Q3 U, {
switch(csym[2]){
, ]) D7 X3 V' S. W$ n" u case '(':+ u1 c5 b; A4 o6 P
if(!csym[1]){nLevel=0x100; nERR=1;}else
1 O+ H$ k; Z+ [3 G# S! O( x if(!GetExpValue(istrin, t[2]))nLevel|=0x10;+ I# ~; x" i7 v' {- ^! w
else{nLevel=0x100; nERR=1;}# Z* I5 R2 @# n
break;
9 ]6 l$ @6 W' y! y case ')':
% E5 Y$ i% F* b. }4 L) P! F! _ ^' W {nLevel = 0x100;}break;
7 I, j* b: }+ ?8 P. T case '+':case '-':case '*':case '/':% i+ s& z) ?4 B1 Z. \
{csym[nLevel++] = csym[2];}break;
) C' G1 N9 N9 a% Y- w8 D: Y case ' ':case '\r':case '\n':case '\t':continue;: e, a- U2 [: r; f4 b3 v$ S
default:
( W) p) l# ]- U( V: P5 O7 q {nLevel=0x100; nERR=1;}
' `* v8 k/ D4 G0 r }" k3 D" m7 p' l. y& y( W- _+ }; s! g
if(nLevel==0x100)break;/ f% l$ q* a& x; g. `, t
if(nLevel&0x10 || istrin>>t[2]){+ X( q8 j: @/ Z6 T) l5 K$ E' e
nLevel &= 0xF;# c+ Q( O' \+ m5 Y: t2 Y- Q
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
$ [6 a5 q4 D/ `- f/ I; D% h; d if(csym[1]=='*'||csym[1]=='/'){
( v. f# c7 f5 B5 _ GetExpValue(t+1, csym[1]);& u* i! q( X; [( K0 y$ [: Q
}* t1 s: \$ M& q7 g0 l! V
else{
y; ^7 I5 G3 x GetExpValue(t, csym[0]);
, R5 O& a, l9 }! Y( h8 D* c t[1]=t[2];csym[0]=csym[1];csym[1]=0;
7 g3 Y N* r6 h X8 Z: r8 z$ m0 X }
& K9 w! c' V7 u- W6 v, ` nLevel = 1;0 m Z4 p6 ~) R/ V0 j% R
}
- Y T& \0 j8 @9 p2 m$ U else istrin.clear();
! }* X- |. j! V" _. f }- z" y* ?* Y' R2 B y+ `( z0 ^6 W
else{nERR = -1; break;}
7 V8 W8 }) N! @. @- f6 P y }
8 }9 e) _1 W5 C) P/ t; m, i if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);1 E* m0 I; `0 h8 B* Q4 }& m( u9 T
else nReturn=GetExpValue(t, csym[0]);
Z0 p! T/ W$ U/ U return nERR==-1?1:0;
4 R, s; o7 W: B* N" _! D6 q6 d}}" P R2 }) `3 G) F' V
2 L; j' G7 `& U+ x8 V2 c
) Y0 W0 f i3 J$ G- W/ v, U8 i8 H0 T0 `
函数模板使用示例:; C) D. R- U) a: @, l3 ?( v
在以上那段代码的后面加上以下代码:
9 |4 F, K/ _4 L2 @
2 I% y1 O9 d/ b( s! Y" Y. u
9 q1 ^! a2 W# O0 U+ e& W) u5 @
5 \9 H* q {+ @* z程序代码:
, G# Z4 p" X, ?% k8 p9 f! a1 X( N
#include<strstream>9 T4 D# ^* n5 y7 e
#include<iostream>) e1 t2 q: q: w9 v7 x( |
#include<string>3 I" R' L5 F, r, N r% z
using namespace std;
' u$ Q" U, d6 Y; K& z( Gint main(void)# w# x3 T% ~% |# m0 q/ U
{! _, d" b2 |9 K9 {( s( i0 J( L
string s1;- U3 ?& K5 R- c/ Z; g+ G
while(cin>>s1)! j3 `% f/ j4 d) t
{
# U* F+ p2 `, u4 C; u9 h [ istrstream isin(s1.data());
3 z2 D4 X. [% @) o7 _ double d;/ X/ I9 l7 W6 c- Q
if(fy_Exp::GetExpValue(isin, d))
; _6 @5 k) _2 V3 P! t {
, \' Y! i' x2 o9 Q+ q cout<<d<<endl;8 O- S# |2 P4 l8 Q w8 v
}( d' E* `' r+ P$ G. O) |0 A6 E
else5 Y) n. L% B& Z
{* J4 g. D7 F, D- e# I: d5 I
cout<<"ERROR"<<endl;
0 S1 l) T* p* O* M+ s }- T R1 G x2 |- _8 R. \8 v
}
4 j% j: W% G% {2 X/ k; I return 0;/ L4 r: y* t) S+ z0 T4 u/ L
}
* q4 D# s/ m+ q5 Q, K D2 n% {8 b5 ^4 q4 B
. Y9 j" ~% y6 {& j4 N然后编译执行就可以了(*^_^*)
+ I, f+ w$ b7 g1 _( A其它:TC++上一定编译错误,不保证在VC6上也能通过编译" u3 n/ y) q: F; B5 G2 d3 g
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|