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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
8 e% ]. i8 d0 S, S9 v一个很方便的函数模板,可以并且只可以计算含括号的四则表达式0 O/ }+ j9 I3 R% }1 ~! u
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
6 t; s7 Z& X% g* Y: x+ G8 r! ]9 j参数解释:
( \* b/ x. v, ?) c5 Y' F; bistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
# h ]3 |7 P" g3 E+ m: U- V- o% ynReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
9 y5 N! x9 y5 Y. P, r! P返回值:8 x0 W }0 s9 { E* n8 z, t
返回非0表示计算成功,0表示计算失败有错误( K( {2 k' ]; l$ ~/ c
* O, v, p5 ^' D* B; t. i) N
, H; g2 o B L
3 J4 C3 R/ t2 S程序代码: ( l0 s7 y+ Z) W# o; v
& S! t$ a6 K" O! X- ]; W
namespace fy_Exp{
7 e4 Z C5 N$ J2 A& l& bnamespace {template <class _T>5 p7 J+ E0 g4 |# S" G" b2 r. m
inline _T GetExpValue(_T t[], char& csym){
3 S. o6 [# u6 O) }2 D! c2 e char c=csym; csym=0;
' t1 `( Z- [ e5 h8 G switch(c){
8 c; J8 c7 t( p; M2 E* o7 g case '+':return t[0] += t[1];2 o. F9 i/ O/ S$ n* _/ ~
case '-':return t[0] -= t[1];
7 i& }* v5 V/ b: Y' T2 [1 d case '*':return t[0] *= t[1];. Q" e/ W8 e; L. f. H0 c, B7 U+ i
default: return t[0] /= t[1];//case '/':
5 r, h- v4 Z1 r }
0 [/ l7 K0 U: B$ K5 Z! u}}
' j: k- K" m& S$ C' f/ @$ C! btemplate <class _T, class _Tstream>
. S7 E( A9 c8 g2 D# d' v' n8 \/* _Tstream: inputstream, _T: get return value: t0 I# D Q' f# Z. ~9 @: Q
* Return nonzero if get value successfully */% u$ l8 c. `$ J+ i$ e
int GetExpValue(_Tstream& istrin, _T& nReturn){, J: e% `4 s. @' H) f3 ?' ^
_T t[3] = {0}; //雨中飞燕之作
: g5 D) z! G, i; G; P' T5 Y- J' M( t8 N char csym[3] = "++";
& G- r, s$ c1 W6 P5 Z& w: F) T int nLevel = 1, nERR = 0;- ~, s1 U4 m( L
if(!(istrin>>t[1]))istrin.clear();! G. I9 j8 H3 u+ N
for(;;){
- O8 K, w( Q) f1 e$ Y" O if(istrin>>csym[2]){1 f" _9 P1 W" c
switch(csym[2]){
_- P! N. O1 _9 D5 [+ C case '(':/ m9 A% Z' ]% J8 s
if(!csym[1]){nLevel=0x100; nERR=1;}else
" T( S1 Z+ n L" F1 j if(!GetExpValue(istrin, t[2]))nLevel|=0x10;. V, ?7 s5 K7 \
else{nLevel=0x100; nERR=1;}
. [! S5 G/ C; s4 S/ S break;
1 R# Z* v! o9 |7 n% T- t+ X0 @3 A case ')':4 A/ _2 j5 A. I
{nLevel = 0x100;}break;5 X5 D0 ~4 `% |: q2 c
case '+':case '-':case '*':case '/':
' L2 o: f7 B5 B$ W' L {csym[nLevel++] = csym[2];}break;
. m$ @3 c/ }* L* ^/ a3 l5 M case ' ':case '\r':case '\n':case '\t':continue;& j8 U; d2 g9 T Y. x# k
default:
( F7 b/ s! u. u( w% u6 n {nLevel=0x100; nERR=1;}
. z- r9 F5 n$ _; j+ L& U! a }
5 c" I) R6 t6 _. B R$ | if(nLevel==0x100)break;- i" e" U+ c2 e8 A
if(nLevel&0x10 || istrin>>t[2]){( _5 U7 S8 k3 j5 M @
nLevel &= 0xF;
- Z: B5 A2 f4 b2 X7 t- N if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}) _5 |% E: Q9 M( H& [
if(csym[1]=='*'||csym[1]=='/'){" O- t3 N/ P' j7 @
GetExpValue(t+1, csym[1]);0 @/ p( ]' B/ z. l/ I( |2 ]
}6 k- E# A9 _" a( a+ _. X* q2 z% `
else{/ E1 e4 T7 ~7 d- S* `
GetExpValue(t, csym[0]);
& A2 D! q$ ?) t9 Z/ L5 Y) a; j t[1]=t[2];csym[0]=csym[1];csym[1]=0;2 M5 D' k" M( c3 g
}
. O. G. }6 s% a7 t$ M nLevel = 1;- P9 g" w8 p$ [- |
}6 P; V+ G% u4 ]! O& @ E
else istrin.clear();: [9 L9 o/ \' e
}, \- A" B2 u1 n( P9 Q- V
else{nERR = -1; break;}
6 K$ M+ ]+ o5 h" n }" M7 U3 _( J: F2 b# P
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
+ Y9 y& h- Z5 q. g" i \1 a B else nReturn=GetExpValue(t, csym[0]);
$ b' U8 u& `! Q* c return nERR==-1?1:0;5 n* I, x+ q0 ~; _/ W
}}% u3 ?* c2 J$ u, Q& c- h( K+ `
5 v" r5 e4 {* M8 z" f. o
. u2 d8 E# P2 s l5 J+ P. m. e* k
* u& D; |% D) g5 C- l/ R! r5 b函数模板使用示例:
9 O9 l; @7 \, @' j9 k在以上那段代码的后面加上以下代码:- I8 E2 _! P0 p2 n# j& Z
+ N3 \. j1 W4 ^% g+ |$ z 2 r$ L) y5 X) p; e) c. q
. d4 B* F1 i7 r+ H! M- s/ I
程序代码:
0 {6 ]0 D7 n) F* ^( l+ U5 P! a9 P; K5 r8 w( K* B2 N
#include<strstream>$ e# U5 a2 H& {* \: i2 T
#include<iostream>
+ u, D. M2 A$ ~/ e$ D5 Z#include<string>5 {$ s& v( k7 {, o$ x
using namespace std;
1 w( C& w! _% ^& Z: x4 t( n% Z" sint main(void)! f- b6 G* W. Z8 p
{
: a! n5 \1 l( v string s1;
" i' s# z% S F3 A' m' M& L while(cin>>s1)
9 j) k# `, w6 F% @+ R' l( |% o0 C* C { F$ E' C5 |5 Y& }
istrstream isin(s1.data());3 \7 l' K0 }1 f* g) v8 Q9 P$ f7 x; d
double d;
* q' n+ i: h. s7 t if(fy_Exp::GetExpValue(isin, d))3 i% E2 C v- ]& z
{0 X: K _ e# c4 g& r) P$ ^
cout<<d<<endl;( p' A: S# p6 Y* C
}
" a3 K$ K( Y& h% h& Y: e else) R1 `; V- D6 K' M: h2 c* N
{( T/ o( S9 j3 k, r. q( \- Y" }6 x9 _: l K
cout<<"ERROR"<<endl; U6 u/ |7 e% N' v+ i( y% g! `
}
+ K+ X4 c: C, o. _ }
, P1 ?& Q1 J' s8 T% V& ^! |9 w return 0;
( h1 l9 v2 [& z, w7 r}; G$ A0 ?! i/ O' m2 Y* E5 T
+ n# ^: Y, b' s- M0 w- t, c2 s* R& E: M: E4 r& E* K
然后编译执行就可以了(*^_^*)
1 n4 t# a7 ^6 U3 e0 Q m其它:TC++上一定编译错误,不保证在VC6上也能通过编译5 N/ c& o# c' b8 H+ \, C! l
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|