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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,$ A @0 f! S# Q2 D8 K6 b
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
" z, ^ z7 w- l+ o6 X Q只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)3 p/ o: r% ]$ W5 r" E
参数解释:7 J) F6 L. N! ?6 K O* C; F6 o
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
# e$ p0 D! ?. K: W: S/ EnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定) _3 Y. Q( ` J+ H8 U1 Q: ~
返回值:# I1 X, [7 a, k) g5 V+ z: r
返回非0表示计算成功,0表示计算失败有错误
3 c3 ?5 a) I( N
5 L( J" G `) Q% c- s) X7 Q
/ t' ~( t" w' F) [$ M2 {/ S/ a( J: L0 f) X! o* ^, {9 ?3 {; B }9 ?
程序代码: 6 _/ _( W3 L* ]7 Y/ ?! r6 d2 {3 {
, T: O0 Y' @( P1 x ]# [namespace fy_Exp{7 B! q$ r# A' K& T( I
namespace {template <class _T>$ c# a* }8 q7 ]' G
inline _T GetExpValue(_T t[], char& csym){
+ q( F, H/ C+ M char c=csym; csym=0;
! W2 p% Z! ~: }7 Y switch(c){
& d6 S6 |4 `0 u9 j case '+':return t[0] += t[1];
/ z! V7 V, f. F0 w+ R! D* y7 A case '-':return t[0] -= t[1];
( ]) r( o7 T) O4 D& p1 Y& s. _5 T case '*':return t[0] *= t[1];* R0 T: k2 `% c# C' n
default: return t[0] /= t[1];//case '/':
! y4 D! h& @ u. S }- b" r1 a5 B/ W" E
}}
$ R: E [! l1 T5 N4 E1 Q& ntemplate <class _T, class _Tstream>* {- L8 Q0 x# \# c s9 I& h
/* _Tstream: inputstream, _T: get return value" `9 T1 {& U1 L L- M' w
* Return nonzero if get value successfully */8 i$ P8 `& K' }4 f5 f5 ?* m3 \# |
int GetExpValue(_Tstream& istrin, _T& nReturn){
; }0 g& \: ]) }% O3 C/ i- [ _T t[3] = {0}; //雨中飞燕之作
7 i4 y8 e( T4 g char csym[3] = "++";2 C9 v1 {- z' }4 p2 j% X1 z
int nLevel = 1, nERR = 0;
& ]8 U% T i! k if(!(istrin>>t[1]))istrin.clear();5 G8 E* ?- O- w% @
for(;;){
& j: C' }4 M; U3 b: { if(istrin>>csym[2]){
) ~- c6 d3 s; L1 @ switch(csym[2]){6 v. @* G9 m2 N! w% K9 H
case '(':2 v1 L4 C2 _ E1 Q& N; D, k
if(!csym[1]){nLevel=0x100; nERR=1;}else5 ~) L3 ` P ^2 r* j5 \0 ]
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- o7 l: O! d9 }* p- X; k
else{nLevel=0x100; nERR=1;}
+ \! p& o9 a0 y2 A: |5 ] break;
% }6 t/ M& l+ q/ Q2 Y8 m case ')':
5 Y+ S* O/ b0 z+ o {nLevel = 0x100;}break;
. \3 C3 D% E3 P, r( U1 C case '+':case '-':case '*':case '/':# g; O- E6 C& y/ B4 x; T* R8 Q% Z" ^
{csym[nLevel++] = csym[2];}break;- f! U( x- t$ A, S
case ' ':case '\r':case '\n':case '\t':continue;
! S- h* j; G; g& t+ { default:
+ U* P2 K+ p! [; D$ U {nLevel=0x100; nERR=1;}
0 b. G7 t( h6 o$ M1 q }4 d; j9 O0 I& ^0 x A9 L
if(nLevel==0x100)break;: Q6 W+ d. F3 _' C( {6 J
if(nLevel&0x10 || istrin>>t[2]){
1 M% _; _4 F8 x' e- x2 Z. u nLevel &= 0xF; O3 h/ Y% o; d& b) e
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. m. u) `' N) U$ I, h& a if(csym[1]=='*'||csym[1]=='/'){
# {$ P. B: R( ?3 a0 N GetExpValue(t+1, csym[1]);
9 o# e1 _# A+ @3 p, | }) C( O* W( f- F
else{% N; j; X' A9 b6 x* x4 G
GetExpValue(t, csym[0]);5 z+ t) j) E5 N! C5 U6 L
t[1]=t[2];csym[0]=csym[1];csym[1]=0;! \6 k' Z- @- u; f& j, D. r
}
* t- e! ?7 o; Y7 H. R2 C nLevel = 1;+ m: ?# t6 U; J& \7 ]. w
}$ P& l: N& H& ~ N
else istrin.clear();
: a6 q; D3 E3 o2 o/ I }
/ x$ z0 I5 [. N1 e else{nERR = -1; break;}, `# `- q! t: X) T# x6 }$ d
}
$ |0 s3 i& S6 p) E. I) ]: X if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
# U" P1 z M3 o! s7 i! x2 ` else nReturn=GetExpValue(t, csym[0]);* B) Q# V0 Y: C
return nERR==-1?1:0;. w/ ~, R# }% e, J3 f
}}
5 F3 W- o" S& W! N6 p3 Y5 Y* C1 O/ [" Y0 Q, W0 h6 R9 e3 O
# U5 c# i: `) u( h- z3 G
0 V/ p, F5 P, ^函数模板使用示例:
, }! A a' F7 M: _, |4 T. P在以上那段代码的后面加上以下代码:
4 m( s. |' @( ~ U0 J$ ?4 A3 M
1 ]5 H" x7 @+ U: {% [# x" x+ G6 F , a9 ?9 E- d8 V7 c# e
* j5 B0 _6 a' C6 H5 M* \2 T2 X5 t1 S程序代码:
- I t/ Z: b: K" N7 d% o. r4 \% N" b% o5 F7 \ ^
#include<strstream>
5 U; i8 o# \# O: I2 W; M7 R#include<iostream>
8 K3 e: A+ G6 A: P, A2 y#include<string>8 ]3 f+ H9 j% }: G9 x1 b Q
using namespace std;
8 c) o4 F% t; l, J' p! ^. K: bint main(void)0 a0 q9 ]* L6 v! j) n
{+ z/ p" ^0 u. O! c/ v- E
string s1;
! _# M9 C" g: U$ c- t7 s while(cin>>s1)
# G/ a, Y O+ v3 z {2 a1 C+ v5 {! W# z! ?
istrstream isin(s1.data());
% |1 w, f1 f& d( L6 \ double d;5 O6 w! H" z, k: c/ `
if(fy_Exp::GetExpValue(isin, d))' l7 l! w6 k* v+ V% v" i' Q' C6 M
{( i2 [, ?% ?1 \2 o+ W! ~' I
cout<<d<<endl;. t* h: [8 z& Q3 c; Y; q
}
+ G, a" i) T% @: [" |9 h else
7 c; ^7 ?1 Y& ^- o6 h5 H8 p {
6 p/ B9 N4 t1 q8 o. H# G cout<<"ERROR"<<endl;
& t1 ^# x& F" ]" |( | }
! U( h: w( \! F" p* V; F }% U5 h: V% E* s% b$ |$ L8 g/ a# ^
return 0;
4 Z3 t: H$ i2 d}
* i7 q; M3 V, |3 ~- l7 t! u3 T1 f4 `# |$ } w. n5 P
7 A( e2 p! h8 u1 ?# e, V1 g/ \# r" V
然后编译执行就可以了(*^_^*)
% d) P9 ?6 c# X) D: Q其它:TC++上一定编译错误,不保证在VC6上也能通过编译
/ a/ t; z* `3 Y& z9 B 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|