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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,+ f& L5 G" n. r, @4 [
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
J: V1 C5 X: D' m. T) Z只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn): d# M! C* ^7 L2 n* f/ U a* L
参数解释:& ~9 _5 A5 y9 b- v* o, m
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
$ m9 `! j. k! m2 C6 d* F8 l5 s7 A1 KnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
8 M0 Y7 U0 M7 p8 r3 j返回值:
+ p5 x, W% p8 @0 J% R返回非0表示计算成功,0表示计算失败有错误
6 y( g4 Z' F3 G5 u% v+ l
6 B7 z( m' C8 I( d: @
+ B8 B5 d7 {1 B6 y7 [. h* u! K( r
" e k" K6 a1 q* u* o4 B- \/ ]程序代码:
3 p9 h1 _2 W2 F" H1 k( M: T, B/ `( H: H% Y8 u- `9 g) R8 e
namespace fy_Exp{# [! [+ \; q) e) ?- w
namespace {template <class _T>' C3 g3 T/ |# f2 i$ X5 ~
inline _T GetExpValue(_T t[], char& csym){) ?2 S; E3 Q/ K- @ m
char c=csym; csym=0;
' f) O1 ?$ v0 c+ @7 `5 M switch(c){+ K, e0 \* ]5 @4 A
case '+':return t[0] += t[1];! G8 A+ C8 q0 V6 g- | Y
case '-':return t[0] -= t[1];% [0 K! o& F- ~6 _4 j m! i
case '*':return t[0] *= t[1];# b0 n" ^4 { l) N. z# o" n. `% S
default: return t[0] /= t[1];//case '/':5 l8 X9 j4 @/ C# g4 ?6 I
}
5 f' y. a" j* Y}}/ d+ K+ J4 z- J: N
template <class _T, class _Tstream>
8 F, |7 k. h8 ^/* _Tstream: inputstream, _T: get return value
1 [1 o/ j! g2 o) L/ D* Return nonzero if get value successfully */: d. a0 K8 g* P! O( T
int GetExpValue(_Tstream& istrin, _T& nReturn){
5 C8 F, t7 I$ l& o& s8 Q0 F _T t[3] = {0}; //雨中飞燕之作
; a1 @5 P6 m! @ char csym[3] = "++";
* l! T$ p! m& \( |3 ~2 l. C# }8 d/ C int nLevel = 1, nERR = 0;
, f) V& n" p, c: B if(!(istrin>>t[1]))istrin.clear();
3 P2 |5 I4 o8 {1 f for(;;){2 l3 ^5 d: u# V0 Q7 A
if(istrin>>csym[2]){
. V. g S; }9 @# r" s switch(csym[2]){
( C/ p5 }! B% E) R! A+ f case '(':0 a) R' }' `/ N" x
if(!csym[1]){nLevel=0x100; nERR=1;}else: X1 s1 f9 l y: U3 p5 c- s
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
* w0 F% ]& y6 W* l2 a% ~1 ~ else{nLevel=0x100; nERR=1;}5 y1 `" Q" R H4 J: h* K
break;
' V' J4 ]' e# o4 P5 N' v) w case ')':
! s3 s7 V" U1 P0 e& { u! R, t {nLevel = 0x100;}break;
9 K5 @ [0 g0 h- F: v2 {6 z case '+':case '-':case '*':case '/':
5 X$ f4 e( C# [4 g+ c- O+ D, s {csym[nLevel++] = csym[2];}break;
5 h8 R8 x. N( r @ case ' ':case '\r':case '\n':case '\t':continue;. O1 p6 w/ w$ ?6 Z' |# Y
default:
) ]- |' Z" b" |9 N/ F) ~: T! M l {nLevel=0x100; nERR=1;}: t4 ]% O0 i/ M9 {% g# f
}
5 L( I1 c) j* Q- ^0 \" `/ T if(nLevel==0x100)break;
4 D( [' \1 w& [" n7 G" e0 f if(nLevel&0x10 || istrin>>t[2]){2 _7 X, [* A; f
nLevel &= 0xF;+ n O9 b! o! h5 I0 ~* K# |
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}* \4 r7 v. E& d2 x4 {! ~, b
if(csym[1]=='*'||csym[1]=='/'){
6 A2 g$ Y6 {# d) N" W6 S$ l GetExpValue(t+1, csym[1]);
3 v: v' a; ?9 d2 r( m% A }
& Q! g1 D* V5 F4 n$ h else{( }$ i9 x6 N3 n7 _* `( d' `4 A
GetExpValue(t, csym[0]);% g1 i8 L; p' z8 L; a* H6 |' A
t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 ~% R' ]: `- g! v$ f7 O
}
0 T" ]1 X- y8 Q6 K. P& y1 j nLevel = 1;
5 \( M8 E) v+ K( C3 K8 D }8 Y% J1 k( x/ [
else istrin.clear();8 V5 A6 Q) \& V) G, u5 O0 j
}
, w- \+ Y# {6 |9 F, n+ U3 W else{nERR = -1; break;}
1 @3 W# Z7 s. s7 w/ w }+ p2 K3 K' y' z2 X; s( Z
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" I0 `/ e6 ]" { j else nReturn=GetExpValue(t, csym[0]);% g, S9 _' [; x' @& A& U6 P- e
return nERR==-1?1:0;
O$ A) {$ y0 _" D% C5 \) b# I}}4 m: k) o$ d( a8 W( F+ G
8 M- T$ B* n! \: Z% G6 B* |+ l
4 l8 H/ a( H% L r6 R* B
) P! ^/ a w0 v a, |
函数模板使用示例:: O: M! e2 N' p' P
在以上那段代码的后面加上以下代码:; {! w2 }7 \9 I3 F: I
9 |% B" E6 V5 C& \ 6 B. G4 N( j# f8 t1 q, s$ f
) ]6 r: X& N: Z# t程序代码:
) F6 M* @# }# X6 Y6 \, V. s8 Y5 Z$ h. a2 \: @' J
#include<strstream>
: t& c X) G0 [) t+ o9 V1 u" w#include<iostream>
) t/ E: p+ y: Y' f: a2 P#include<string>5 C4 V' m5 ]" W
using namespace std;
# b( G3 u- C3 q: Tint main(void)
4 F4 v6 g; @. T* h7 _/ O" h: y0 z{! n& @( r1 d+ P. R
string s1;) H, [( O0 i# X- {' \
while(cin>>s1)( T4 \8 P/ K* q& e" f
{/ k: B* x _7 Z) k3 K
istrstream isin(s1.data());
0 m6 O2 c, E' t% M* \7 p: ? double d;
: z2 }0 N% J- f2 a1 C/ g if(fy_Exp::GetExpValue(isin, d))
1 _5 D H. y3 e0 G {5 S, b, y5 [2 H7 L$ U
cout<<d<<endl;
- f5 V# g G1 c) ?6 ^ }0 @) D% m4 R3 i P% j
else
5 I0 q1 {% n/ C* k' U {$ \$ p; m3 Z6 }; l3 ]/ h( ?5 S
cout<<"ERROR"<<endl;7 y6 Q! l2 A: G3 B+ W4 H2 _
}7 m( y$ ^7 T! F+ n4 ~6 Q! g
}# O I! q* u' {" Y f3 ]: V; F9 t% Y8 _, B
return 0;* Y- m; F0 ^8 g* S2 U) Y8 w3 K9 D+ u
}) u- f. o8 U: ~
( d; v# X5 L, s$ s, K8 u: x9 L; Q3 o2 o. y5 Z
然后编译执行就可以了(*^_^*), E8 v+ P! T! g1 w/ G; f- k; e! ?
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
) F& g x/ H- S2 P+ e$ s2 e& ~ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|