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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,4 ^+ T4 S: ?1 R, a' [
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式4 Z$ n% v* g, d* @
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
+ w# T* t% O% b% x, [0 k参数解释:, c3 K& ^& d7 a8 w3 K
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流$ t" y6 \# _; C. g" _( ^
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定1 r" S: l% Z( ~: E1 ^: ^
返回值:. e( N- G: u; d1 n: K, q; g
返回非0表示计算成功,0表示计算失败有错误+ z2 v6 g8 q5 y0 p/ f
; u$ o7 W. ~, x9 r8 j$ n8 p, `# I
" R3 {1 c+ L# ~, @. \( g. V& a A
; e2 K3 E: z2 A1 M程序代码: ' n6 Y2 v. s+ c; r
4 g, c) b* F( J7 g% M9 x, n6 j7 U: }
namespace fy_Exp{
1 `* ~4 B: f3 m- t, K* S# \/ Ynamespace {template <class _T>
: W% r( V5 T5 cinline _T GetExpValue(_T t[], char& csym){ O2 a% x' Z( Z% h
char c=csym; csym=0;
: \& G) v, X. m" G, C; p switch(c){
+ m- x7 ^3 h: ]8 T. W! \3 l case '+':return t[0] += t[1];
5 t7 D1 u0 u3 d: h! ~0 t case '-':return t[0] -= t[1];; c2 y9 I2 Y; g
case '*':return t[0] *= t[1];
, t2 @) z6 O7 i" g# X& P6 U4 z default: return t[0] /= t[1];//case '/':" w- {* l, M: L
}
7 e: h% x/ b" \/ ~# r+ u}}
% ^+ ]6 O; ^6 ]& S' ]; W/ l, Stemplate <class _T, class _Tstream>
; V: O( L5 ^: G9 ^+ Y5 m( t/* _Tstream: inputstream, _T: get return value$ |/ `9 p* }) g, |/ @
* Return nonzero if get value successfully */& d' j9 y" [4 v: E. w! P6 H) ]2 v
int GetExpValue(_Tstream& istrin, _T& nReturn){
X$ k9 {% z' |( m! Y1 P9 v _T t[3] = {0}; //雨中飞燕之作
$ L- Y- P& i% Q' s6 }/ f- b q char csym[3] = "++"; X; x& F6 B3 f* {( b( r
int nLevel = 1, nERR = 0;) C. I+ Q: r" b, ^. u
if(!(istrin>>t[1]))istrin.clear();4 R7 b! O4 ~9 y/ }
for(;;){& K* {& i4 M4 E% q
if(istrin>>csym[2]){/ T% p! t) o( y
switch(csym[2]){! n* x r, T2 D# Z$ h
case '(':* S' h. b$ S! D. L) X, L
if(!csym[1]){nLevel=0x100; nERR=1;}else
" l0 N" S u7 I" c+ [/ S9 ? if(!GetExpValue(istrin, t[2]))nLevel|=0x10;8 H# k4 z, s% G/ K9 G: _# d
else{nLevel=0x100; nERR=1;}9 S, z) s J) l0 e+ ^; I4 D
break;9 i5 O+ ~) g! ?( {0 i2 E8 T
case ')':. S$ N: `3 z3 y; q& u; [+ T5 x/ h
{nLevel = 0x100;}break;
0 z% r7 Y( ^& q! S4 U; J' i! e case '+':case '-':case '*':case '/':# J- M: z. z9 O. U1 J
{csym[nLevel++] = csym[2];}break;; B7 K: w2 ~# `: P. r) J
case ' ':case '\r':case '\n':case '\t':continue;$ {* ?% c4 u; M+ l# A
default:, m3 k: w# ]' h U$ b( U
{nLevel=0x100; nERR=1;}0 W7 r% `2 H) x5 O. {$ x1 G
}6 f t8 U- I5 k: d$ K; U4 ~
if(nLevel==0x100)break;1 u9 K2 m$ t1 x
if(nLevel&0x10 || istrin>>t[2]){
* u x, K, v. U# w- @ nLevel &= 0xF;
1 a- T7 ?1 Q$ T) @& ~9 W if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}0 V7 p' j& s* k; X- r/ e/ D( c/ ]
if(csym[1]=='*'||csym[1]=='/'){+ {( X3 ] m0 H% [- t
GetExpValue(t+1, csym[1]);
3 c+ L- j1 B# E, N2 F1 c }% P4 p2 D- d6 l. z1 @
else{& i: @9 @7 ~) C7 e1 k2 l7 ]
GetExpValue(t, csym[0]);
% z6 ]- T- i% f8 G- V t[1]=t[2];csym[0]=csym[1];csym[1]=0;2 O7 O. }2 I; x2 I2 C, O9 R
}1 w5 q' s" \+ E; Y y; `4 u$ V
nLevel = 1;# V! W9 p5 y9 S
}
+ `. D& a) Y5 L/ ~' T# p* p9 v. x else istrin.clear();
9 {$ d2 |, l. G: ^% a ? }6 ~4 M6 T* n; q3 j8 _% u
else{nERR = -1; break;}
. p0 P' \! t: b/ n/ a7 [( @ }
6 \: E$ Z" i1 Q3 u9 t1 A if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
W5 T4 r3 A4 u else nReturn=GetExpValue(t, csym[0]);
( k. p3 l$ A7 }8 r. F return nERR==-1?1:0;
! _: e% w; X1 d0 Y% n7 y$ O) F$ _' P}}# G; t$ V8 n6 E) `1 H( i
6 {4 o$ ?4 y6 N+ {
+ _. o& w1 W3 H# `/ a
8 y: P9 a' t) Q
函数模板使用示例:
. E+ a8 A, [$ `2 k$ J3 v在以上那段代码的后面加上以下代码:
: l- ?( D2 _& D3 Z/ a5 N" v1 }4 d0 Z( ~9 x( Q0 ~, w: a9 p1 Q$ q( C( D
9 j% l& K G1 U3 V4 r- \
5 g2 [. Q6 t" F+ f5 E程序代码:
& j" t$ m9 ^" S
3 h) K g9 t7 P0 k9 U) O1 g* M#include<strstream>
. N) [, g: U S' ]4 ^5 X$ Z$ c#include<iostream>" ~/ D9 U9 A2 a/ ?
#include<string>
" z5 z' {) t- ~" Fusing namespace std;
- z6 {7 o5 _; d/ _1 t1 Q: Dint main(void)
3 W6 [ [8 g2 n, l! q{0 F3 f, P) B+ M" r8 s
string s1;
/ w* @8 H* o2 R1 o while(cin>>s1), g) J0 Q2 B4 l. g* [; ?
{4 w# o+ X7 p7 m l% F/ k" k6 J
istrstream isin(s1.data());9 M2 v9 r0 i, A4 S1 S$ E
double d;
W& B( a9 L6 x5 V if(fy_Exp::GetExpValue(isin, d))
- W7 E9 S# S$ @0 P+ V: X; H {8 e9 |+ F( o% A5 M2 b
cout<<d<<endl;( X2 D ]5 ^% c! \4 U
}
! |) I8 c# f, i4 C else
4 u3 {: l+ x2 o! r3 @( U {& t8 ^$ v" D! N% R- c
cout<<"ERROR"<<endl;( q F8 ?* l) B; Z% z& u% @
}
3 {" ~ o+ Q+ \$ t @& M4 x& a }
: h! D4 e! G# q b( h8 B2 a return 0;, B# e b) C" S! ^
}
; q+ D" Y' G: M! i) U/ u/ a2 a& ?1 X" P. [( }! m' N
+ ~, K/ M% g4 ?; y/ [
然后编译执行就可以了(*^_^*)
* K2 G' y+ o# ], m p" H8 s其它:TC++上一定编译错误,不保证在VC6上也能通过编译
7 y, x9 R' K) T# N3 j 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|