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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
) w, n4 D! N9 o- P7 V/ a8 V3 k) [! m一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
- q$ G# X% h( o j# c只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
F7 c+ P/ \6 z/ x, A参数解释: M# \# S* ^8 C8 I
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
1 v3 y v; b3 nnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
* F# e0 ~8 v, y% E6 ]- p( E返回值:2 x" c9 l- d1 Y/ W8 `1 R) ~
返回非0表示计算成功,0表示计算失败有错误
3 X* p# r3 o4 A# U$ p" O: U, F3 Y: V
+ Y9 l* F$ }1 C5 `6 M+ `/ a
6 B9 z! s! H( A) h, h. `; x; z- p3 d( ~% N k% D, i
程序代码:
, R& p& C( J/ p$ y: B0 i0 \! l
6 L5 o+ T+ ]0 X: H' D" S" R5 o, s& v! snamespace fy_Exp{. ~( ?0 ^& l) {1 ]
namespace {template <class _T>
9 z& ~* [( R" J) Y- M' i, a' Minline _T GetExpValue(_T t[], char& csym){
9 B o6 h( |! }% K char c=csym; csym=0;
' ~! ~7 q) w6 k5 N: M switch(c){. F9 T. A! w/ N; N' P
case '+':return t[0] += t[1];
1 k6 b1 w* R+ w* @ case '-':return t[0] -= t[1];
. h4 {( c5 \3 C6 Z$ G; ~( R M case '*':return t[0] *= t[1];
' s! ^# T; p1 n. B# Z- r default: return t[0] /= t[1];//case '/':
+ X+ e! R# ]5 H }8 N4 j1 Y8 e$ K
}}: Y5 C! c2 z I J& l
template <class _T, class _Tstream>8 Q8 X6 k1 I/ j! u' D% @$ b4 s$ v) e
/* _Tstream: inputstream, _T: get return value, n: A* K: `4 J( Y. _" a& R' f
* Return nonzero if get value successfully */% A7 Q/ Y, g( g1 I% I# g! _) Z
int GetExpValue(_Tstream& istrin, _T& nReturn){/ K5 h J; @' G7 P/ W
_T t[3] = {0}; //雨中飞燕之作
8 O7 U$ b+ M( Z6 F7 G2 h+ @8 x char csym[3] = "++";
6 x5 e. A! g' b. M' W int nLevel = 1, nERR = 0;
) ^# G/ M, o8 p6 G if(!(istrin>>t[1]))istrin.clear();' E, _& t, i7 q5 p
for(;;){) w7 w9 ? B) e- J
if(istrin>>csym[2]){
& t6 d7 s' |+ V switch(csym[2]){" d3 J6 }6 l+ D0 ^+ L# }4 l
case '(':
3 z, G# D- t! w' O1 w9 G( T2 ~ if(!csym[1]){nLevel=0x100; nERR=1;}else
2 Q* D1 ^7 H: q if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 Z3 z5 M) r, }' |+ W( \! H
else{nLevel=0x100; nERR=1;}
8 y, N$ I+ D9 F5 D' {( W' B break;
1 g- P/ A6 p- U- j9 Q7 k6 g; ~ case ')':4 l( G! C* b/ N* y# ~
{nLevel = 0x100;}break;
, G8 y$ J1 c6 e) s" u& r: x4 N2 H case '+':case '-':case '*':case '/':. x5 S! [- I3 ~ J
{csym[nLevel++] = csym[2];}break;# }' s* `8 O+ B8 H- ?) d
case ' ':case '\r':case '\n':case '\t':continue;7 g5 Z; b, Y0 Z- B1 f
default:% z4 i' c% ~" t# ?. W% M1 Z" _5 G
{nLevel=0x100; nERR=1;}- w' _' ^, g! s& p( A
}
4 O; ~* x* p Q0 b if(nLevel==0x100)break;" K0 C5 \- m# U" {; S8 @9 c
if(nLevel&0x10 || istrin>>t[2]){. u! Z) u! F' O' ~: R* ~
nLevel &= 0xF;* X( R! t: l6 s- X/ U# y& x
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
& q/ C1 O$ ~6 E) F0 s if(csym[1]=='*'||csym[1]=='/'){- n/ ?/ p5 ]8 P8 a2 v
GetExpValue(t+1, csym[1]);0 n, B5 c! U7 J9 Z
}
( k/ C u* u9 G3 ~, T [3 O2 } else{
# n( k' g [/ d& t6 v GetExpValue(t, csym[0]);
' p9 L( k9 Y- [3 x2 B' Y k' C t[1]=t[2];csym[0]=csym[1];csym[1]=0;+ L4 I: `$ G% ~3 p1 s& y, `
}- S* e4 y2 J( q+ M# w! p' i
nLevel = 1;
" n0 {3 Q: h4 D, t- x- \ }
/ t- W" P. D% i- o3 [ else istrin.clear();, s6 `) F8 g. M1 B: W( U' Y" P% F
}
# v. _ p9 t2 v9 h# ` else{nERR = -1; break;}( B8 G4 L ~/ ]
}
- ^% G' [* Z( j4 D9 O6 W6 x2 c if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
2 g/ C @' M& h& {. C& J else nReturn=GetExpValue(t, csym[0]);
s8 k: w0 X3 i9 B return nERR==-1?1:0;
, o; N4 p) |; _ p}}
2 s6 m3 z8 y7 [) _) U8 p; L( R
* W: S* o$ O! f! ]' O+ Q
- Y# B! L [: E: B
5 W: n" D0 w3 X/ R* ~! D函数模板使用示例:: C# h1 l+ V+ H) ?, L
在以上那段代码的后面加上以下代码:
8 V4 r7 [: D! h7 G
) D8 V9 s3 O: R/ o7 P! E3 p$ o& X, o
+ `) b4 r+ l5 @9 l* R( r, E& S; Q1 d. i7 f! Y! Q
程序代码:
7 P3 p( C+ W+ d5 d z* x6 E) K4 r0 ~$ X' M
#include<strstream>: X( X2 Z. k4 Q
#include<iostream>6 g) c: `. |2 X, v7 R! R8 O+ d
#include<string># B9 l" _& i' ], m1 O( O
using namespace std;! W; c9 D' S. u$ z
int main(void)) s9 D8 C6 y5 ?# t4 q
{
% d$ i2 S; [* X string s1;% Y0 T/ `5 [4 x4 b/ Q$ ]! k! ~
while(cin>>s1)
5 F/ v7 ~9 H) L6 I( s! m4 [ {
; u0 D" K6 }1 |7 ~2 l7 ~4 [ istrstream isin(s1.data());
E0 [# J8 ~, _5 d3 ? double d;# G' i4 @- E+ U! {1 W
if(fy_Exp::GetExpValue(isin, d))
& g6 k! ?7 T) Z9 C {
0 z' N1 Z7 E: n7 N6 V* N, V cout<<d<<endl;
- m$ L- H# I9 g }
6 M( B# L7 q$ ~. T: x else2 j1 k2 \% J/ Q& L& g0 v% U7 I' N
{
3 K* ?% \' ]5 ~% K! Y/ Y cout<<"ERROR"<<endl;
2 W [; G, _- x: e- v7 o! E0 D }0 n% {. N8 f. ^: w' {
}
A3 z. Z* `! m0 s return 0;" z: F4 u. J+ v( j) m$ C
}
( @: d v, T' G4 A" D
2 Y! b! h$ ^, i5 B" O+ H" h+ e( K. n8 \+ {! N. n
然后编译执行就可以了(*^_^*)
& O' I Y3 P/ g+ V其它:TC++上一定编译错误,不保证在VC6上也能通过编译
+ H: Q! R; ]: e/ z$ _3 p8 ~; m" p% y 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|