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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,) P+ L# M. O/ K5 v9 C/ [* v2 X: P5 [* C
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式$ `9 a1 b) v' h( {) [ E' I, \. k5 p
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
! \& h6 [* d! d& U- R# m参数解释:. T; U9 U, p. ~9 n) m
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流+ G! g0 D! @$ t
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
, o& u* q# G: i* h+ G返回值:8 S' O# T* a# m4 y
返回非0表示计算成功,0表示计算失败有错误
R+ ?9 E$ T( t, H1 `6 `" Z3 z) \
9 I* U$ y$ a! }$ x d 9 K" |1 f4 _6 g" U" {
3 j' M+ E- x5 e( S7 t! ]! Y程序代码:
+ O1 M, C& z: d# V/ g8 b& C3 r6 O
9 s& O: z5 [" b0 n7 I2 Hnamespace fy_Exp{, i( i' ? {6 Q9 Y+ E6 G3 Q. ]; ~
namespace {template <class _T>
+ @. }. x; ~: K* ?, k: r6 hinline _T GetExpValue(_T t[], char& csym){
1 C& Q8 n1 v A char c=csym; csym=0;
0 ~5 M; h$ `$ |& W6 V switch(c){
2 ]9 _& O7 u: v) o case '+':return t[0] += t[1];3 Z+ U) O6 \( _8 i4 s" g
case '-':return t[0] -= t[1];
( l, h8 U0 e! `/ _0 P4 t9 D' P case '*':return t[0] *= t[1];5 J, U" a) Y+ _2 v5 n3 r$ f% X0 S
default: return t[0] /= t[1];//case '/':8 @3 q' G, |3 M7 m& h6 n6 H
}: s. T2 Z7 z7 ?+ s/ X
}}. u8 D# ]$ ?. |8 s2 T! e+ b
template <class _T, class _Tstream>3 l5 h% ^" w& e5 \/ a
/* _Tstream: inputstream, _T: get return value) ]- a7 b3 d1 Q { W
* Return nonzero if get value successfully */
# f ?0 w' x) r& h9 l/ ^int GetExpValue(_Tstream& istrin, _T& nReturn){
5 W. q+ ]2 f% S; z5 R/ `$ M+ P9 z _T t[3] = {0}; //雨中飞燕之作
! v2 [2 q4 y1 E& L char csym[3] = "++";
! c* N/ F3 d0 z$ m$ c7 n int nLevel = 1, nERR = 0;
9 [: x2 S; e8 R$ [2 W! m9 r if(!(istrin>>t[1]))istrin.clear();% M% S# z9 o3 l( c+ Z; Z7 N
for(;;){
" V- E8 c, k' x" S# U- N if(istrin>>csym[2]){) L q1 t* ?6 h7 Q& h' T
switch(csym[2]){
+ b% k3 P/ M- \6 j case '(':
x( A) f' c: T% K if(!csym[1]){nLevel=0x100; nERR=1;}else$ X$ G. Z! }% s
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;; f9 W* a3 w: l6 p
else{nLevel=0x100; nERR=1;}; g" a, o- ]# V0 [& F. A. Y
break;
6 } A8 e/ j2 { case ')':
/ }! N$ L; s% g) B7 d' R {nLevel = 0x100;}break;% S C' R5 j( w; I% C6 G
case '+':case '-':case '*':case '/':
8 \6 ^$ L# T% D+ \0 w6 E$ ? {csym[nLevel++] = csym[2];}break;
3 p% ]9 T; Z: x; Y/ s7 a case ' ':case '\r':case '\n':case '\t':continue;! K+ Q0 j2 l- f' q; p" ?
default:
0 A# K4 d& e6 j5 S; t {nLevel=0x100; nERR=1;}% _, Q; t5 n% G; W U* x) p
}
9 R( ~- ?6 M" E0 @5 l1 R/ ~ if(nLevel==0x100)break;- F/ P- `( ~. V
if(nLevel&0x10 || istrin>>t[2]){) Z6 Z) S& H L: M1 W
nLevel &= 0xF;! @; G# L. \6 U8 v. N
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 |9 k; n, L" x& N {! e if(csym[1]=='*'||csym[1]=='/'){& z2 B& B& e( E, Q
GetExpValue(t+1, csym[1]);
; C! R) Y. A; F+ i }
|# W, i8 F. ?$ c else{
; }9 U+ |7 z7 O8 t: _ GetExpValue(t, csym[0]);* l: u4 J9 B& A- j
t[1]=t[2];csym[0]=csym[1];csym[1]=0;# v8 a4 H8 O0 x5 i( b% Z7 H
}
- L5 U0 v$ D. R( T. ?" \ nLevel = 1;! }* j9 I$ |5 i/ l) Y
}
' p2 @6 v2 g3 N7 A4 f5 h$ m9 \ else istrin.clear();8 X- A( N* I8 Q) l" d2 q
}2 T/ Y3 g8 `/ d+ g
else{nERR = -1; break;}( ]* x" Q! J# D0 x. i+ Z
}5 f, \" L* Y9 o$ s8 D9 S1 \4 S
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
/ d; \, P( w& \+ W! b j! F else nReturn=GetExpValue(t, csym[0]);" k; ] R/ T6 f! c
return nERR==-1?1:0;
, D) k v/ h4 P u* p! O6 N7 i2 P}}& [1 I7 r6 [8 t. g' ^
# F2 J8 ^/ b0 a
8 g6 {0 _9 ^: t4 ~$ [
5 Y; L6 F" K. R& A2 y0 O, G C函数模板使用示例:
& h9 h( V/ d* ^" {) X1 l, }. [' X在以上那段代码的后面加上以下代码:$ L2 s. O( ^3 H7 X' j9 x1 B$ a
. u; E: D6 G& w& K" P+ J
3 @( O$ p/ P3 ^: a' q. H: p. S
& G+ q9 L: Q( f) W* P b' {4 Q: }程序代码:
% }) _0 ~5 E- `8 ?; _" o" [
( u4 U& d# I0 C5 v. ~#include<strstream>6 |+ ~( \4 u" w) ~* [) v+ f
#include<iostream>
8 O! g/ d7 [; N5 m) x' A#include<string>
" Q; X6 w! p# ]! Husing namespace std;
{" Z# D- \: ?! E: `+ r( n) Iint main(void)
. h5 [! t* |6 ~! {- w{
" Z( Q. o6 b ?/ m2 Y* ` string s1;; @6 d+ V2 S" Y: q' Z9 ~
while(cin>>s1)
& m7 F; [6 c/ o# D s( W* r8 R1 A% ? {
2 G! s) B, B4 v( k3 s istrstream isin(s1.data());' d' y# I/ v% C& j6 `" V
double d;
8 {, }( Y8 f% [$ W; Z2 W if(fy_Exp::GetExpValue(isin, d))
) G) I* C. c% H {, L: ]) W: a# E0 C& r5 t3 G! ~
cout<<d<<endl;9 K; J( q2 u* n/ ~+ d
}5 L0 s; d! v$ R% d' ^
else3 k" z2 R$ d3 g' Q9 _$ Q$ Y
{ }, s0 [8 z$ `" |4 b1 \
cout<<"ERROR"<<endl;. l6 z0 w u, w4 }* Q8 ~& D
}# t3 f% `. w5 M" e- K" m$ }
}
8 f: S0 v3 Q! C return 0;! Z. M2 z5 {: J/ r+ Y* T
}
1 X7 c( m/ G! p/ F/ \; A: h+ t; k! B5 V# i
/ x/ Z3 o, Y) \
然后编译执行就可以了(*^_^*)
. G% [1 ]& F* Q* P1 {( }+ J8 c其它:TC++上一定编译错误,不保证在VC6上也能通过编译+ b8 R' o( [/ c
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|