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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,, [: W0 Q1 O& ~+ z- L) `6 N% {
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
' Z% k- ?7 r6 s5 p0 _只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
2 P; R% h: }, j0 I2 T: Q( I参数解释:
- n! X9 w9 Q1 I4 S1 X% `istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
7 O2 ]- S1 e4 SnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定! X/ K8 i4 R0 ]% n- @5 w
返回值:1 t) ^) W* r; A" G( J- G- m0 V
返回非0表示计算成功,0表示计算失败有错误, s0 y# \, L4 U- g$ V! g
5 s7 w0 p# a1 T( m5 q9 B1 Q2 v) k ! [, N5 `% @# [1 e
1 B4 g2 m. N/ ^9 j
程序代码:
1 g3 |0 V2 e y5 j1 x1 s
, G- d# `3 n$ V0 c1 P, I0 \namespace fy_Exp{; Z E/ |* j* |4 D6 }8 @$ o+ L1 ?- d
namespace {template <class _T>* k. B+ B, {( M [
inline _T GetExpValue(_T t[], char& csym){/ ?3 }2 ^, }) V
char c=csym; csym=0;; C9 ^5 Q! p- @- Q4 n9 L1 b6 b2 W
switch(c){" t% F! `7 s$ e+ p
case '+':return t[0] += t[1];
, T! u. l. x0 M$ x0 O case '-':return t[0] -= t[1];: g( l- ]* q2 q& ?. x; ]
case '*':return t[0] *= t[1];
' n) y5 V- {, e" w4 L, R default: return t[0] /= t[1];//case '/':
6 @7 w: y- U7 B1 u6 o' \3 Y6 z. J }
9 Q! t' r9 l4 v6 j1 i' H* o}}
! t3 O p; V1 Y `/ g r( Wtemplate <class _T, class _Tstream>- [: a' a+ b4 b' ], W# [3 X0 ^! @
/* _Tstream: inputstream, _T: get return value
' n* k3 B( b5 s+ Y$ t. [9 I+ S- i- @* Return nonzero if get value successfully */
& _: I7 ] h' E+ i( j) e' dint GetExpValue(_Tstream& istrin, _T& nReturn){
' |) {6 V: U( e; x _T t[3] = {0}; //雨中飞燕之作
2 I3 b6 e% i; k B char csym[3] = "++";
* j4 I E* I5 ~1 H int nLevel = 1, nERR = 0;! u5 ~" ^. g/ c1 ]* I w7 ?: L1 y7 p6 B
if(!(istrin>>t[1]))istrin.clear();
) h- `1 Q! R1 a- \; f+ T& R for(;;){2 @% |) u1 E. e( a- ]! m2 T( h
if(istrin>>csym[2]){9 I" D, Z z9 Q+ H
switch(csym[2]){9 h6 T B Z" z- a, i8 k
case '(':1 B7 I) i: r+ n7 e
if(!csym[1]){nLevel=0x100; nERR=1;}else
p% S' s8 b- v) L4 q if(!GetExpValue(istrin, t[2]))nLevel|=0x10;; f7 _ T7 P9 o: q! {2 |
else{nLevel=0x100; nERR=1;}1 F" O$ z# U! l
break;
, ]# u: G9 G) \" k case ')':
! z+ p# X( R: ~) ?. E% t {nLevel = 0x100;}break;) i0 A" ~4 Q( [$ j' {2 B
case '+':case '-':case '*':case '/':7 _$ U5 B0 y* d F1 s
{csym[nLevel++] = csym[2];}break;7 h8 w- B8 L! c
case ' ':case '\r':case '\n':case '\t':continue;
/ l: C$ _$ n3 v: y1 K default:& l- }# i) w' x, w7 J
{nLevel=0x100; nERR=1;}* x& T' h" W7 `/ C* B6 w* l. q# Y" U* A
}
$ O: b9 Z" r3 }7 I3 `, L4 ~. K if(nLevel==0x100)break;% ` y7 }0 Z% q( w+ e* U
if(nLevel&0x10 || istrin>>t[2]){
' J9 ]8 Y- M2 V nLevel &= 0xF; L2 O8 n9 k* Z( l
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
4 G0 S! D7 d u if(csym[1]=='*'||csym[1]=='/'){( C, ~# b' I( \% e- Z* i) v7 ^
GetExpValue(t+1, csym[1]);& }" ^) R5 L( n
}4 l! k" f1 X* t w, a
else{$ v) _2 S6 Y0 O" C" U4 o: Z
GetExpValue(t, csym[0]);: g: _/ Y" p7 V, }. v) q" ^# q& T( [: h
t[1]=t[2];csym[0]=csym[1];csym[1]=0;. w* v, S8 y" @0 s$ G+ H$ W* }
}
" j9 u: P! z4 w; d8 ^) A" |8 _7 F nLevel = 1;$ r; d) J4 W; j" Z
}5 [" u3 Q5 Q* K3 D# B+ O8 c2 `' W
else istrin.clear();
* R" E0 ]) q% j2 f4 p8 B$ _% G }8 d4 A+ q) H) `; l( X5 ?. U
else{nERR = -1; break;}
: _1 Y; w) U6 T3 r( O }
+ y* t, @( K0 Q. N if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);8 g3 l5 i6 `) j# h0 x# [
else nReturn=GetExpValue(t, csym[0]);$ }/ H- [9 y3 ~% _- x
return nERR==-1?1:0;
5 l8 Z3 ~8 X8 }7 H}}
4 e0 t/ a% s4 q2 v0 S, p
6 B; Z; H* P( r- [2 E5 m; a) w6 Z6 V; t; M
+ S9 h: h5 ~4 A4 H4 J e
函数模板使用示例:
* z/ N8 h# a4 \& m$ |- f4 \在以上那段代码的后面加上以下代码:( w, ?% M$ ~8 Y7 @/ Y$ O; E- R# x
6 h, ^( b' k+ g! l/ v 6 O( S) p; @( I( M" O( S( e* h
) Y* c! ^7 |) {% J; h7 l
程序代码:
: ~# |6 W8 ]' R. ^! o, Z& z
4 L4 S( p0 c% D: j: ?#include<strstream>
# R) V" x3 ]- b$ \6 ]& P4 O9 G#include<iostream>1 K: I \$ L. ?- N; f
#include<string>, u7 ?& H) T4 d8 L1 C3 E- T
using namespace std;2 N7 O+ |& ^1 ~; P; j7 v
int main(void)$ I( V7 w, ~& Y6 h( U+ g1 |, [
{4 R) ^. u, l+ k# Y
string s1;
) ]- X) l* ^. C3 W% j while(cin>>s1)( d5 m% d7 P+ ~$ {/ S
{
4 Y/ p3 F3 P: R3 q istrstream isin(s1.data());
* ~: t( V- K# Q N) r+ U& K0 s double d;# B; X I, M- P2 {* |+ x6 U0 e
if(fy_Exp::GetExpValue(isin, d))
0 s0 D* Q" B W# r, Y% |% v, P; ] {. [ R/ t" H0 g7 N/ F6 q! |
cout<<d<<endl;
. C* A- e8 }( @( f! O& L" R }
F% E3 a# b6 o2 z$ Q3 r: _+ | else
3 B: @: t4 i. P; \2 { {
& K, n6 a# |( M. s# z cout<<"ERROR"<<endl;
/ s/ {- _& b$ X9 ? }
% w( b! F9 J/ L) t/ Z9 A }
. z: w' D' A$ m. i% P. [ return 0;$ ~, L( t! H- n$ N% r) P
}
' D7 D; }& k% |; z6 |6 a: I( q- `1 {6 N+ v( V) m
" J. F( w; f$ u1 J v1 X- D9 }然后编译执行就可以了(*^_^*)0 E: y! Y' _8 f- t
其它:TC++上一定编译错误,不保证在VC6上也能通过编译6 ^1 U+ X* Z7 R2 n6 q
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|