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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,2 ]: o8 c& E1 Z( `9 s% Q( U
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式8 I2 v/ O) ^0 P6 l
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn); v4 d2 U! o5 P/ p0 j% m
参数解释:
3 p& l: a+ |2 ^, {$ ?istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
4 W# f' T8 ~8 a& ]9 |nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定1 A! A8 u0 v% ]% x( p& E
返回值:
7 z" x, r( I6 N! s( Y" R返回非0表示计算成功,0表示计算失败有错误2 A- x) N8 }9 [" y
0 a, w2 l: D3 B* Z( |3 t( Z5 t
; e* F6 ^ C$ S5 u6 }
# J* O! p3 t" | A8 Q% @) \程序代码: ' c& m' E6 _# n3 [
3 O1 ^! Q/ D: Y& ]0 G) j- `( anamespace fy_Exp{: S9 l4 c6 [: x( x& K
namespace {template <class _T>4 n( X9 B+ B- g5 @0 z
inline _T GetExpValue(_T t[], char& csym){2 h3 M) k$ u' c6 R0 k2 w
char c=csym; csym=0;3 _1 B( b8 |% }
switch(c){+ D9 x1 ] @0 M( i2 {. Y& r. n* Z* v- @
case '+':return t[0] += t[1];
% x3 ], N3 S5 y case '-':return t[0] -= t[1];
7 i3 p, X) m' ?# @5 D; X case '*':return t[0] *= t[1];
. ?. T% A; Q. T. b; `. b default: return t[0] /= t[1];//case '/':
& M$ b6 Q8 H5 |1 Z% T }
8 Y" P, ^* K% C) c9 |}}
3 U" G! s: O4 Q* N. G5 ttemplate <class _T, class _Tstream>( l& t4 M& h' u( F: A i- u
/* _Tstream: inputstream, _T: get return value0 S; E( ^0 @2 P: p1 z
* Return nonzero if get value successfully */
/ |/ D8 {! \4 a+ t2 }0 j% P$ Wint GetExpValue(_Tstream& istrin, _T& nReturn){
& {& o- |& A4 I, I _T t[3] = {0}; //雨中飞燕之作9 A9 g4 m1 k( T7 w8 V& ^. u5 v
char csym[3] = "++";
9 W; @0 x ]6 R9 h1 S) S8 ^' H int nLevel = 1, nERR = 0;
- m9 @" i# B& t, q1 T+ k0 V4 l( y if(!(istrin>>t[1]))istrin.clear();
5 t8 T |" ]* \ for(;;){
: n2 ~9 [" s+ a3 j5 @4 N if(istrin>>csym[2]){$ G8 L9 e* H+ x) G7 `
switch(csym[2]){
1 U J6 A/ i1 x# @ case '(':3 E" }/ l1 M- [% x) o. X- l
if(!csym[1]){nLevel=0x100; nERR=1;}else3 H0 q8 D1 v, p9 L$ T; W% d
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;$ z. q- N+ U% E5 E$ I8 n
else{nLevel=0x100; nERR=1;}) r R* K& V+ H8 t+ R2 L- k2 G
break;4 W8 b) D! N) v8 {
case ')':
' y7 v1 x& v; ]3 j" h {nLevel = 0x100;}break;
8 R# [7 D( M; M* m6 O D* e case '+':case '-':case '*':case '/':" |/ f B4 Y1 A# G6 ]: X
{csym[nLevel++] = csym[2];}break;
$ A3 H6 s" W, S* E3 C2 d case ' ':case '\r':case '\n':case '\t':continue;+ C( _5 b- v1 O6 _
default:
$ P @9 v T7 ] {nLevel=0x100; nERR=1;}
5 G* `, U6 K3 |7 B# k- d }8 O8 q T5 ^6 d' d" K2 x
if(nLevel==0x100)break;
! p3 w+ ~" \2 t6 J. t% v3 t7 B if(nLevel&0x10 || istrin>>t[2]){
$ M6 F; V- J/ S5 ? nLevel &= 0xF;6 H9 k( z$ ~" n/ B3 i5 r5 k
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
# M- I* o0 U6 Z t1 `& C; @& _* d if(csym[1]=='*'||csym[1]=='/'){! k4 n5 v- l) @+ H) m9 ]+ G1 f
GetExpValue(t+1, csym[1]);
: }2 y/ \+ w7 F* E& _/ a, s }/ \0 l. |. Y, a7 r0 D/ y! S
else{
; c$ S4 j! J% ^* T/ S GetExpValue(t, csym[0]);
9 _) O$ U/ T7 B$ y1 f" r t[1]=t[2];csym[0]=csym[1];csym[1]=0;7 k3 b) c6 \# B* V
}
5 M( L# U/ f5 p2 @# E- E' } nLevel = 1;
, a" J8 W, H6 |, B6 y }
# s* |4 ^+ F5 q' V7 a else istrin.clear();
' `; {0 K: I9 E( x8 U6 k3 n }
8 H( L' I$ |$ M3 L0 A1 h1 o else{nERR = -1; break;}5 ^$ G8 u6 K' K
}
% X9 I6 q/ J9 D/ I% Q. B if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);9 g, e6 m2 Y( R# A, @) e
else nReturn=GetExpValue(t, csym[0]);
% ]; k$ _8 l* a" [$ S2 b return nERR==-1?1:0;4 C! I8 J5 Q v
}}
/ I- A X' B, R7 n+ |
* E- c; T T3 G6 M9 ~0 [) w2 i% X5 T% b# U1 R, [& L
3 I$ g$ m0 o# v; D, _ R e, D4 U函数模板使用示例:8 @3 E v( c* |# m
在以上那段代码的后面加上以下代码:4 m* O8 J6 r1 V$ j; x I z, Z
+ g/ b- r4 d5 @1 B, J
0 e& C3 B1 X. w1 a2 {9 B
! T; n/ p' ^& z3 I程序代码: 7 A7 q) ?3 a8 C4 A
! M4 d1 _+ Y& c+ b3 ?7 u
#include<strstream>
1 i$ G+ {9 O3 B, F+ ~0 ~#include<iostream>
/ J$ h5 A7 T8 W# M, N) ]#include<string>6 f" n2 y! I9 Z" D0 s* @
using namespace std;0 h5 l8 N+ F0 @* o2 N+ ^0 X
int main(void)
+ Q$ e1 w$ z+ m7 e: P- o; `{9 p; @6 D( e* {9 k& Q
string s1;
; @; {/ a# F- _5 J# S while(cin>>s1)$ R) d' e8 N2 ~6 {' E4 X9 w
{
9 a9 [* I- u' j! S( e istrstream isin(s1.data());- t- t0 W* j2 t
double d;- I- o2 k! w( f
if(fy_Exp::GetExpValue(isin, d))7 U$ D/ R& b h( e
{
3 s N' \$ ~1 I+ k! m1 k0 f; O cout<<d<<endl;
- N( r) X; \& s0 U: u" E& u+ ^7 r) S4 u4 N }
) a8 o& F% ]+ ~6 a; }2 f# x: Y else3 S v H! x# F
{+ s* `. m+ _* I% ?4 z& m8 Y4 K
cout<<"ERROR"<<endl;: q* t1 T! z& _, Y+ R: i3 ~2 x
}1 q$ C( W# f7 n) R5 W: R
}
6 W5 T% I+ k$ H9 d; G! ^4 l" L2 ] return 0;' W# l0 t- v' R5 I
}# e$ V* @6 Q) f4 W. u% y i
, @' Y- T: U# W) @, u4 [7 ?3 ?( @* b, a+ R8 a: ^) D6 h
然后编译执行就可以了(*^_^*)
/ a' `2 q$ N; j, {) W# q& f# z其它:TC++上一定编译错误,不保证在VC6上也能通过编译
+ d& S; x7 q0 b 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|