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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,8 s- c4 ^! {0 f4 @8 i; r1 o
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式, }( M% Q7 V% n
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)" Z) Q: T) D2 u9 G
参数解释:9 n" C; b& s# Z g: Z; k
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流" |' V, Z @/ B2 K9 g% l
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
5 g" e/ S d0 U5 @) ?返回值:* ]$ f Z9 l. v1 b
返回非0表示计算成功,0表示计算失败有错误: j! I0 M2 k3 `& }1 R- D
. _5 @; t: J$ E7 Y9 `. [: B1 J) p
3 ~1 K0 L) M4 g7 f7 ]2 P4 [
& o; Q* g+ ]5 ?3 p8 s
程序代码:
1 R& G* c- {& }8 _5 V, m* N! q9 _3 ?/ w- w z
namespace fy_Exp{- S9 E1 ~" f+ q4 J) j3 j
namespace {template <class _T>
4 j5 N" |7 k: }) jinline _T GetExpValue(_T t[], char& csym){ h7 u, B* q9 ~( v8 v8 E: m% f
char c=csym; csym=0;
2 ?$ l( h& J4 h5 z6 n, g switch(c){
/ E; V3 }& P+ ~- f case '+':return t[0] += t[1];
3 n, B, g6 ^, P" L) v- e4 ` case '-':return t[0] -= t[1];
$ B$ C) x1 c, F3 B! G( a case '*':return t[0] *= t[1];
8 [$ x3 N' P+ w% R& Y default: return t[0] /= t[1];//case '/':
r6 V( ^# G7 v7 f4 _+ y }
1 |' n S3 r+ y$ T- s}}
3 l q" ?- P5 `0 Ftemplate <class _T, class _Tstream>
: Q! Q/ B/ [$ q- E0 O. G7 C/* _Tstream: inputstream, _T: get return value
; k. S! A0 C+ H* Return nonzero if get value successfully */
& o* a2 f( |( A5 X% e. M" hint GetExpValue(_Tstream& istrin, _T& nReturn){5 K( G: d/ M+ ^+ c: z
_T t[3] = {0}; //雨中飞燕之作# J& d2 X3 A4 ~( p5 J/ s6 K5 {
char csym[3] = "++";- x/ r3 p( x3 n* d5 ?
int nLevel = 1, nERR = 0;
8 e* L w8 P4 ?4 N. ?& M( N if(!(istrin>>t[1]))istrin.clear();
5 X% b& d, `( |& l% I for(;;){' Q' N' L. o1 x, q- K/ n D1 p
if(istrin>>csym[2]){
5 D# J; V& Z4 c+ x, Y2 J switch(csym[2]){$ L2 k, |5 k3 w) p
case '(':% `0 M7 X! i2 p, S( I" k8 b2 d$ x
if(!csym[1]){nLevel=0x100; nERR=1;}else
N4 G8 X/ @0 I( u if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
, S# C; ]$ c1 k J else{nLevel=0x100; nERR=1;}
2 Z" H2 G/ C$ }" W$ i% d* R break;7 y/ h; J7 K( t: U; ^8 Q/ J3 V, T( w
case ')':
$ ~% |5 {; g2 e6 O* J" \/ L1 Z; c. | {nLevel = 0x100;}break;8 @5 ^ v. ^2 i9 R( L; h l( t* n" {
case '+':case '-':case '*':case '/':
R0 D, i$ R2 `9 v) u; p {csym[nLevel++] = csym[2];}break;
2 Z7 u' D- E0 M) w, J% P Z! j case ' ':case '\r':case '\n':case '\t':continue;
9 U* g! g$ X3 M9 N0 F' ~3 P4 @! U9 P# D default:$ [" V( U- r- t! y1 ?1 I
{nLevel=0x100; nERR=1;}
8 r0 T3 p+ R* Z# a# c b5 \) o: X }; G: G; u4 C+ G! Z6 ~8 }
if(nLevel==0x100)break;
7 d0 s$ L# v: p4 j if(nLevel&0x10 || istrin>>t[2]){
; U3 ^6 Y1 k: Q& A/ z6 Y1 p nLevel &= 0xF;
0 J$ ~" D1 n1 Y% Z) A if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}, w& O+ c- D' S" x* ?; m. {9 g e1 }
if(csym[1]=='*'||csym[1]=='/'){4 v; c6 ]5 ~3 r. G. t- P* E& g
GetExpValue(t+1, csym[1]);
- a2 l, p: X( t' K, Y: R( E2 c }; p9 h) O' f9 v2 |
else{
) I1 J! P* _/ g0 E! \ GetExpValue(t, csym[0]);4 w7 g! a. T# [8 E$ k* {4 j" l
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
: b0 D+ T; y2 q' ~9 N2 T }4 i8 E7 q4 e3 g) O9 B, e
nLevel = 1;$ @2 |' d- U" E# I2 u( _4 O+ h
}% h# v: d% m. Y4 B7 H
else istrin.clear();- x$ K( {/ ^: D5 i5 v
}
* ]4 h/ u% n/ v; `* I1 i% M else{nERR = -1; break;}
8 V5 M% `1 E; T" y/ G/ C }
2 v% y# D1 y# N: x if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
! u6 s- D+ Z! ^0 \: E1 D0 Z; z else nReturn=GetExpValue(t, csym[0]); @4 E/ b7 {* ?9 X$ O/ @9 M' _
return nERR==-1?1:0;
0 D9 l) F# H0 N. G/ u1 x5 L3 C}}( D4 O5 C* q. o
) g b$ W- W% G+ T2 ?8 m2 v6 J: }/ R9 l
. d! t0 w2 G, k
函数模板使用示例:
4 F4 D1 x2 c& l; F4 K( s; f3 v0 n在以上那段代码的后面加上以下代码:- Q6 Q9 o' M3 x4 N
5 G6 x- u$ R5 j& r. s8 ?
7 Y- }( [& N+ Z% g* t/ E0 ^3 ]
3 i- @, |9 ]$ ~
程序代码:
+ w; I5 ]+ g& [. N
" a1 }# d3 f4 U#include<strstream>% d3 K% \7 j. F+ H; A9 {
#include<iostream>) s% j3 W( g/ G+ ?! X6 @
#include<string>' n0 F1 X% m2 L) @3 `! e; U' \# n
using namespace std;" |7 b6 t+ V, K' o, S
int main(void)3 N) D" x5 V4 G7 |
{
: l8 J& B' _) D( R8 u, I string s1;" H7 L* A1 C' y. H o. h" S
while(cin>>s1)
/ A( m/ w! T0 @. H' j* y- b4 @ {- Q2 ]% L! V/ n/ M# Y9 L
istrstream isin(s1.data());
4 R) R( z E0 j double d;/ Y- z" U2 \) f$ u( Y5 L
if(fy_Exp::GetExpValue(isin, d))2 V1 r! E4 t% h# c# D6 l
{
6 m; f7 f2 A: a/ l. L& S2 E cout<<d<<endl;$ I+ J6 A; b1 X( _0 \, t
}9 f# R& |4 L+ y2 A* T
else
' k' s- A' y4 T" ]5 F { k* @+ j4 b( P0 d5 U! r
cout<<"ERROR"<<endl;
2 K$ z( R8 p& w* e }3 _; @ _& m( C5 c7 P$ }$ Q" I! R: c
}1 C. d9 Y2 A% a3 O6 F4 U
return 0;! Z4 ~0 a4 p* l9 ~) H+ H6 g
}
1 s! H6 A% B" [# g) d9 ^! n5 h
7 Z: \8 a I: A) p1 u' [( U5 q: R
然后编译执行就可以了(*^_^*). d! t$ z* F5 x+ V
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
5 m! A: {2 B. \/ u 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|