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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
8 i, s+ L2 H9 h) \3 X' q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
! }5 |1 q, l- C$ M6 |; j只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn); q+ ?5 j5 o, G7 P$ h% p3 u
参数解释:$ r# b9 M; L1 E h
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流. K7 S! K& V' d# b, [
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定7 v7 g& [, h4 g8 }! f( U7 A$ ~3 \
返回值:. O: `* E9 e9 t4 [
返回非0表示计算成功,0表示计算失败有错误
% H3 a: ]2 D( n. _( F9 F$ H9 `; v" P6 `4 q. O5 F
8 u* k3 Q, @1 X; V/ W" D
5 m- t( [+ [" g" F, r, l; k程序代码: 9 Q9 X3 ^$ N6 s8 H7 e
[& [5 d7 L& ^7 f! O2 g9 q4 ]
namespace fy_Exp{
. L9 @- @+ v5 O6 p; unamespace {template <class _T>2 w! _( M2 J3 ~0 E% j( n
inline _T GetExpValue(_T t[], char& csym){
7 Z& {. q6 W# u char c=csym; csym=0;
: c2 U5 m4 C! s( J' S; | switch(c){& }- R/ |0 M0 B7 X8 x# V
case '+':return t[0] += t[1];/ N2 K. C! R9 |, o# h
case '-':return t[0] -= t[1];; |: A% S$ g7 {2 `: J
case '*':return t[0] *= t[1];% k2 X# {1 v8 ?6 Q) ?: y
default: return t[0] /= t[1];//case '/':
2 s4 X% {! g$ W; e6 F, j }
2 D7 s& W! u7 ]5 s7 J8 J}}+ w0 `) L0 m4 Q
template <class _T, class _Tstream>
2 G' a i5 P" Y, M/ @2 |/* _Tstream: inputstream, _T: get return value- {" ^8 `3 |1 e# Q
* Return nonzero if get value successfully */
7 n l8 I X# w c4 iint GetExpValue(_Tstream& istrin, _T& nReturn){" t9 c1 I% r& h' d* \+ N
_T t[3] = {0}; //雨中飞燕之作
1 a1 ]/ D6 Q+ l1 J* M char csym[3] = "++";, r: I4 X1 i7 p( _' ]1 k$ T6 k
int nLevel = 1, nERR = 0;' Z% @2 K; r4 k
if(!(istrin>>t[1]))istrin.clear();
% w( j* B- X) Y for(;;){
1 ^, D! K ~ m! A0 e8 Y if(istrin>>csym[2]){
( X6 U$ g4 |& b4 y+ K switch(csym[2]){
, U+ i+ ]8 Q; w1 ~ case '(':6 ^. c j% N2 R* [7 v2 @8 W
if(!csym[1]){nLevel=0x100; nERR=1;}else2 G4 Z3 o% }7 E
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;; ~$ h( w+ }- e0 O
else{nLevel=0x100; nERR=1;}
6 K9 o2 a: r1 m7 ?8 A9 O \$ B break;2 a9 l0 P9 S' W
case ')':; H. C2 N v3 |* n7 q
{nLevel = 0x100;}break;
5 H$ `& I9 k* U4 s$ ?1 c% F- K0 r case '+':case '-':case '*':case '/':% ?% k2 L# J, v. p* n
{csym[nLevel++] = csym[2];}break;
; ]% J* R, k( r! r case ' ':case '\r':case '\n':case '\t':continue;2 d8 S9 S) y; K( K& j: H' o
default:% \$ h t' O2 P) C' P. r
{nLevel=0x100; nERR=1;}( j6 l- x3 F0 N3 d, g, M
}7 l2 _ y( _# W) ?
if(nLevel==0x100)break;
2 N$ W& q& \2 y6 [) R5 X" U+ T if(nLevel&0x10 || istrin>>t[2]){, D! ~" e8 ^# {$ p
nLevel &= 0xF;
$ n8 k2 q0 |( X. L if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}5 E; m1 m- g* A9 N5 s* ?% G
if(csym[1]=='*'||csym[1]=='/'){
3 P M2 H9 N t) C; M! w2 t GetExpValue(t+1, csym[1]);+ a) j, L: a! o0 H- ^# c
}' N! {: C( b; Q( S
else{
3 ` T, V& p8 e8 m( L0 j GetExpValue(t, csym[0]);
7 t9 G3 }1 _0 @! p2 z. r t[1]=t[2];csym[0]=csym[1];csym[1]=0;
$ s2 ^8 \" F" y8 d; e }8 c9 d9 `( N5 o1 ]1 F; q
nLevel = 1;% l& M; n* m2 e# A3 d+ a5 D5 r2 G# d
}
6 I6 C$ K @, G+ c ^ else istrin.clear();/ P+ ^9 A* n* K+ v
}) F- w0 z9 U3 m8 I* t, e
else{nERR = -1; break;}
. j& e' Z- h) V+ N, E6 O }# j' ]( p* y. M
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);4 E7 J) V! }4 F) ^3 q# M
else nReturn=GetExpValue(t, csym[0]);$ Y, L- W" t$ `$ _
return nERR==-1?1:0;
3 }8 |: b% x% k; B}}
0 f' H8 `! f7 F9 J3 q2 O2 h) v t$ G$ y; ?2 \# b7 U" J7 B
- } q* q* v2 `( E' Y+ C6 ^- W& S
: |- r7 |* X1 Y" T9 T函数模板使用示例:
' {& e3 Z/ y- v& s+ E( l在以上那段代码的后面加上以下代码:
, x0 Q; X0 |; H1 _
1 H1 o& b: @$ Y/ Y' ^1 l. v; w
" T! S9 e. |, b; x1 N4 q+ |& w0 e7 ]% b8 @8 G0 p
程序代码:
3 G9 p: y" H n! T0 z: d! G; D1 y
#include<strstream>
* H, f$ Q* q& E9 U3 b#include<iostream>
1 R9 x' m3 D+ ]3 U. l8 x#include<string>
& e# ?9 {: V( l+ s2 Ousing namespace std;
- |: m' o1 B; j2 V# lint main(void)6 j1 D4 r+ M S' ]5 e* U9 i( Z
{
7 f% {/ n% m8 R" \ string s1;% C1 b _" X& B" p6 d# @) H/ D
while(cin>>s1)
" k( ^: i2 }) m/ o {4 g; y& S/ Z/ n8 x; Q7 A$ Q* q
istrstream isin(s1.data());$ Q: k9 P; R0 r3 F0 T
double d;
% n1 z7 Q0 i( r if(fy_Exp::GetExpValue(isin, d))* Z) B( o# J& P. D. u; v
{
3 o/ o0 V' @$ U) D4 b cout<<d<<endl;
; F! _3 ~7 A8 [ }0 K0 H. n/ Q" ^- J n% k0 k5 I- P
else
& C# h2 @" O' n: N0 Q {
) c$ W; i( K0 K5 g e6 ^ cout<<"ERROR"<<endl;0 j6 [. p. k0 }" |1 R% e, B
}, v% G. V& t6 K. n+ d% x
}& p! |6 Z' |/ u$ u& K" p1 T
return 0;, L: B* g$ o5 o Q% E
}" [ D& S. ?+ Z) H( d; W/ [
6 d, x' U1 o* x, |8 L. @0 b( c7 g( r. z0 \) @( m* M5 g9 L
然后编译执行就可以了(*^_^*)
* F/ ?/ m1 x1 ?其它:TC++上一定编译错误,不保证在VC6上也能通过编译
+ T7 d' n2 O$ Q 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|