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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,4 ?( g# C, J( H; ^) W+ p) V
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
, B/ B, l! ?. J" n$ Q只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
8 y1 I' i7 u$ V- h: E参数解释:0 [. A2 I2 ` e1 a2 C
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
! K& A' U1 w3 j1 b8 Z! i0 E$ hnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定8 s5 @4 K2 R3 a/ w" ]! C
返回值:8 K l; v" y$ z/ e+ h9 j6 Y1 V
返回非0表示计算成功,0表示计算失败有错误5 W- w0 _7 f) b s+ E
2 Q. \( r m* o# \. W# f
# S$ ^! l/ ]8 [( h- X4 }
% K/ s9 J: e9 B9 i4 {. d
程序代码: / `$ ]5 q: c$ s' x
$ v! J% j; b8 P- e
namespace fy_Exp{
' z+ R6 a* L. N- Y9 @' cnamespace {template <class _T>2 W. V1 K! z+ @# c; u$ L
inline _T GetExpValue(_T t[], char& csym){ E; K% T7 g4 V/ F' f
char c=csym; csym=0;
1 e% q2 D# H$ a! X" l( M switch(c){# J4 m. `0 Z3 _/ {! ^- W, y
case '+':return t[0] += t[1];5 N5 A. O4 p A: @
case '-':return t[0] -= t[1];" Q. ]6 c( D2 G9 }1 a7 \
case '*':return t[0] *= t[1];( `7 u1 T& B g5 K& o8 Q& S
default: return t[0] /= t[1];//case '/':
+ |. w$ [8 A* d; k7 S5 M }
0 `# F) Z* E1 {# l# U C9 b2 N9 L* d}}& d1 R& g3 r; w
template <class _T, class _Tstream>
$ k( ~0 b: { [& e+ N/* _Tstream: inputstream, _T: get return value1 U' o9 |* c; w% X( |
* Return nonzero if get value successfully */0 T& a2 ^7 n, l6 ]/ X2 ^
int GetExpValue(_Tstream& istrin, _T& nReturn){' x* f; I {/ F" S3 M1 R3 Y
_T t[3] = {0}; //雨中飞燕之作. j, A: f8 p3 Y
char csym[3] = "++";
& d8 V6 g3 R8 ~6 T9 n! o int nLevel = 1, nERR = 0;# C+ C% J" r0 E4 f1 U: K2 W
if(!(istrin>>t[1]))istrin.clear();
Q9 Q3 o! n: y+ x. d for(;;){( l# F+ ?3 `6 t' Y
if(istrin>>csym[2]){3 T$ u5 ^4 t) R
switch(csym[2]){
* [, T+ g$ a" W# C/ }: {6 J case '(':; z7 g- b- |: L9 ?2 f
if(!csym[1]){nLevel=0x100; nERR=1;}else4 L% t0 f2 V G6 e" e
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
- g: ~* |8 h& r" W1 H+ l. A1 A else{nLevel=0x100; nERR=1;}
" y0 v; m( c' e; i3 U$ S break;
. ^: q' w: l, j' f case ')':5 b1 ]$ w$ i" z( i6 Z! N
{nLevel = 0x100;}break;4 N$ }* K! ~$ k! s2 P6 m7 n2 a, a
case '+':case '-':case '*':case '/':9 q4 Y. K/ v' g7 F$ d& {
{csym[nLevel++] = csym[2];}break;
4 \; X/ B; P5 C( `& I @ case ' ':case '\r':case '\n':case '\t':continue;
0 r; i, q# Q& C! S _5 v default:9 ^! G2 L. d j! d2 O
{nLevel=0x100; nERR=1;}
, \+ P g; ~2 E7 R7 }! p5 V }! i: q) `# Z: t: j/ V, a0 ~$ u! H
if(nLevel==0x100)break;
6 U+ H% E5 A/ Q if(nLevel&0x10 || istrin>>t[2]){
0 Q) o- [* D8 |; o# i nLevel &= 0xF;
' k# _5 U& K- H: Z# c1 Z if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}8 v" B3 y+ ^+ p4 J1 o/ H
if(csym[1]=='*'||csym[1]=='/'){; K' \( o7 p7 w% {0 t8 ]* ?
GetExpValue(t+1, csym[1]);3 o; h' F1 }4 S6 c5 O, x$ Q
}
0 m; R# H6 H8 P else{9 f4 F2 X$ T) |+ Y$ C
GetExpValue(t, csym[0]);- L0 j8 p9 l& q: E3 f" |) F8 L
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
4 U$ I: v7 I3 Q: Y; W3 q d! K7 M }
4 I5 }, x8 b+ z0 ~3 D* z nLevel = 1;
7 i/ h2 A: I" \/ F7 d W9 _ }7 w4 d0 Q' a: B( M
else istrin.clear();5 Y; ]0 Q6 S9 N; D! i1 A8 S/ r
}5 x1 _7 v: _, ~. R
else{nERR = -1; break;}$ A+ j8 [3 T# {' r& e' S1 G
}
+ r! q0 c; Z2 p% t# J( P if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);3 A8 }4 c$ N9 h- T1 y! m+ r- L
else nReturn=GetExpValue(t, csym[0]);) l0 E+ S3 h% o S. X% ]( c
return nERR==-1?1:0;
$ |) L/ a# H$ m7 K9 Y9 E) D}}
. g- G8 @! x( r$ N2 | X* [' y7 ]+ p7 D9 _/ \
* ^4 }* r- v4 |2 p8 C. ~! \0 k$ e% N- ]' Q0 O- D
函数模板使用示例:
; G4 \6 N! h6 u6 ~- N3 F$ _1 E在以上那段代码的后面加上以下代码:4 P# u0 e( v: Q8 [
+ c( h9 W4 l' W+ S/ }2 T/ R
* _6 V6 C0 V$ j$ ~4 T6 Q5 }) {4 I# @( f
- g- E( K* n6 ]& a% l9 v+ {4 S程序代码: . D# x, v6 a" _+ w; `
$ j) a9 [" [4 A+ o t) p#include<strstream>
4 r$ B! w4 z h/ ?; h2 J* e( x& n3 p#include<iostream>
+ y5 D7 O: O7 e5 Q#include<string>
0 Y) i- \$ R8 S& F9 k3 c) u0 Fusing namespace std;4 { E+ _! Z+ @! O Y
int main(void)4 F4 T: S) D5 P
{1 L2 h: P. Z! }) x4 O+ E
string s1; x2 O3 a9 X* ^3 t* ~: Y/ a
while(cin>>s1)7 o* C E! U$ k' g+ h" g
{
- l" |2 A& {6 l istrstream isin(s1.data());2 B* h3 K# w! }( t& \. x3 J
double d;
0 [/ {' ]: A( V1 V+ r, h if(fy_Exp::GetExpValue(isin, d))0 Z- x0 G% d( p' i4 s; c
{! v/ c M: E- w
cout<<d<<endl;$ r! W6 T' i! K
}
/ Q: \; P9 U: y2 z, ~$ ?$ l else
- v+ }( S& u9 r( y, e" D {
" K' |, a) U7 @+ R6 e& {; i cout<<"ERROR"<<endl;9 O0 | n& S( B5 G r- b5 Z0 l6 | F
}
9 T% Q, Z% V% e2 }! g, k# W3 M }
/ T6 U9 w# S9 @1 | return 0;* W7 ?7 g# X! T& n6 A8 d. S$ u
}4 p8 q: U7 V$ n
) {7 L8 G" I4 L9 K* H( q
% s- e) h# ~9 r# P! G! _; q V7 U& `
然后编译执行就可以了(*^_^*)
' B/ U: W3 u+ u1 B其它:TC++上一定编译错误,不保证在VC6上也能通过编译
0 b$ b8 V8 Q3 _$ D& `$ ]3 c+ N 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|