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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,9 s4 |' R5 x3 ?2 O2 _' `3 P
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
) c0 E: |/ G$ T. |只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)) x5 p/ _8 J* [0 E! _5 m
参数解释:8 E+ v: D8 M4 f8 u/ w
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 Y) z! Q3 ^7 ]% F& J( \ enReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
) A" n1 ]: K: r/ q返回值:+ n0 \" k1 H8 N" j8 l
返回非0表示计算成功,0表示计算失败有错误. i f+ ]: f) ~! y
0 k' I" B( f7 G9 ^+ ~3 k
/ o1 M4 A! |6 `
7 S1 t" @' h9 w, A8 c程序代码: 1 ], P1 E2 r8 b4 S
2 ~1 V5 G6 H# A/ N0 A5 |" A& Qnamespace fy_Exp{
3 l; ]* ~0 e9 `9 ?: xnamespace {template <class _T>
& A) x* w( C) M+ X- i& Dinline _T GetExpValue(_T t[], char& csym){
3 j/ q h7 S0 n char c=csym; csym=0;% P$ n5 H1 I$ s3 w1 `! {" R
switch(c){
0 H$ [: f7 s N. z6 ]9 b& B case '+':return t[0] += t[1];2 y* I- z* r. ^7 T, Q
case '-':return t[0] -= t[1];
! g; z3 m/ n) t9 K/ k case '*':return t[0] *= t[1];
& n3 u# z% S/ e- i! Z% B5 U8 r1 x default: return t[0] /= t[1];//case '/':
# e0 Y% h- [5 [0 K) B. g }
0 x" a, b' j) h0 Q}}
3 ^* [6 g8 T- N% X2 x( ^3 k- etemplate <class _T, class _Tstream>* a" R5 I' U" I5 M7 T& _% v" j
/* _Tstream: inputstream, _T: get return value* E9 `5 |5 b/ r5 m7 l
* Return nonzero if get value successfully */
8 P' M% W3 E" i& t( [; s7 Yint GetExpValue(_Tstream& istrin, _T& nReturn){
" M U0 y Z8 R0 J2 b" C _T t[3] = {0}; //雨中飞燕之作
" C, n" q. \4 Q9 Y6 ]! Y char csym[3] = "++";- j8 P! {6 y+ u, E
int nLevel = 1, nERR = 0;! o1 x# I, J0 J( E( I/ O; u
if(!(istrin>>t[1]))istrin.clear();) e. S; H2 |' k% U& A
for(;;){
, Z! F9 a) s+ F1 M- s if(istrin>>csym[2]){
( @" H' x+ @6 a4 A1 v# u6 m U switch(csym[2]){
# c3 u: m. b2 ^) d" m; R3 R6 b case '(':$ a% p9 X6 u7 Z* }% w
if(!csym[1]){nLevel=0x100; nERR=1;}else
3 G% W( c- w* f; \# e% c if(!GetExpValue(istrin, t[2]))nLevel|=0x10;. j1 L+ ]4 T) p L$ y
else{nLevel=0x100; nERR=1;}( {& x) s6 e. ~* Y% a" r
break;
1 j9 ~' m5 Z4 H: x1 ]' L case ')':! ?0 X, ~! Y6 z
{nLevel = 0x100;}break;
+ _ o$ E) }0 t, U0 o) T case '+':case '-':case '*':case '/':- g: J7 v( X. [0 Z$ P( p7 J2 W
{csym[nLevel++] = csym[2];}break;4 v- R$ P% h' t, j
case ' ':case '\r':case '\n':case '\t':continue;
/ X" u0 ]8 o5 w6 c2 q% k* ~ default:
% @$ G0 b* m7 }7 K {nLevel=0x100; nERR=1;}
+ h( ^0 w+ l7 E# d }
A; B2 l% B$ w9 g' B if(nLevel==0x100)break;0 M1 F, ^; j9 k* D) ]- a" J6 D
if(nLevel&0x10 || istrin>>t[2]){* @0 \' U* G% Q, E8 F* J/ r
nLevel &= 0xF;
# p5 ^4 Q$ N( L0 ? if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}) p, V; K, g) g
if(csym[1]=='*'||csym[1]=='/'){
9 P; ^% S7 W) U4 I GetExpValue(t+1, csym[1]);0 z4 Y8 O- _) W$ u# U' ^! _
}' K5 ^" |! Z5 W( C! X) v0 T4 \
else{4 H' o0 u9 L9 ~& R. o
GetExpValue(t, csym[0]);. I% M* \, d' o7 J
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
* g! Y8 [% H' Y6 W( T }
1 w2 @* G+ l0 A" Z. w nLevel = 1;. o# C! s6 r$ Y1 z5 z9 G. o4 [
}! b& v# h! V1 ^( U
else istrin.clear();, j2 v Y8 W$ @# W
}
& x) C+ R3 h# v else{nERR = -1; break;}
7 J/ ~! `0 ?6 G- K1 b9 u( q }* i. n9 s( {1 U3 N
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" V' ]1 c9 Z: _5 n2 y7 T4 O1 D else nReturn=GetExpValue(t, csym[0]);) @8 ]5 |9 A/ @) s& u
return nERR==-1?1:0;8 y1 w2 [/ }1 m k; }
}}3 W3 n0 ^+ L0 y: |2 x8 S9 ^
U9 O6 A. e2 v- V- O5 t8 {8 e+ D( A1 _/ y7 C3 J
& Y+ Y! F3 j% a' y3 }% n: l4 \
函数模板使用示例:9 q' T( K* i. J5 o# M9 _9 g9 G
在以上那段代码的后面加上以下代码:% `6 M- ^$ U. J( S9 I( y
1 a) g( R% d1 v' b7 ` . O: R1 T( s6 d
7 [* w; l+ ]4 {& b- E" g2 i
程序代码: " M3 x8 m# n8 H: ^& E- p0 q
. H8 s, o' _. j3 \' S
#include<strstream># |3 V% l8 h% h, P
#include<iostream>1 M( Y! \. d& c9 B' L( j
#include<string>2 u" v) @* i7 O+ `3 F
using namespace std;8 H. w$ u5 u9 i$ M
int main(void)8 H& O* L# I0 ^1 d
{. s* }, Y! Q9 u
string s1; r! M9 [& d7 V* m
while(cin>>s1)0 x8 |0 @& T$ d# |) C% Y
{5 w. X. J$ y. x7 m/ G
istrstream isin(s1.data());! M" S+ C3 m/ ~- b. k, u
double d;
# a7 n7 y) U+ z if(fy_Exp::GetExpValue(isin, d))
' k0 B2 O4 m# n {; q# n5 |$ r2 z. D J4 E
cout<<d<<endl;
+ y+ |! z! F# K6 M" B; l, O$ n }
) @- f- G, {9 V& [9 v3 ^% } else4 G8 Q. l* X( c- b9 N% j
{
7 o4 P6 V( F1 ^ cout<<"ERROR"<<endl;( T+ A% Z# v: M3 c% ]8 Q" a
}8 b) K* ^ s! e a& i" M$ x7 E( y
}9 c2 d0 h- r( q9 @3 j
return 0;
8 y/ T( Y& r! ^}4 i. s& ?; X% M/ M% i+ g' x
# L* C9 ~0 n3 N& @' _& f Z1 u
+ H r& F' E4 E然后编译执行就可以了(*^_^*)! W4 N! {$ U: J; c" M% ?
其它:TC++上一定编译错误,不保证在VC6上也能通过编译& O( w4 ] S3 @& R$ N/ {* o2 d
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|