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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,. |( t0 b# r) P$ L
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式7 D$ s1 m2 p) d u3 n
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)6 s5 }* v2 _* Q
参数解释:5 H; G0 i; f+ Q
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流) j, g9 w. O( _9 R3 R0 C
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定& M6 O6 F" ^% ^2 S
返回值:
( m" o) U# `& d8 `) }" R返回非0表示计算成功,0表示计算失败有错误
- J; g6 Y) l1 ^# W8 D+ Q
1 N( w; U3 {/ m4 N8 H; I; p
& T$ Z( C$ [ Y" i
9 B0 O, E/ z. N0 d0 E- k程序代码: , g% ~% Y$ @+ T
8 a; u$ z2 V: y) I! ynamespace fy_Exp{% `2 C8 e) ]4 K
namespace {template <class _T>
- l" w) H, i1 Winline _T GetExpValue(_T t[], char& csym){" T) |) E7 ^3 y- {% B+ ~& P/ f
char c=csym; csym=0;5 x7 T; Y T( L7 C+ L& O1 R* Y
switch(c){/ D# \% i+ E/ p" }+ a: t; n
case '+':return t[0] += t[1];8 O. o o0 ^1 Q* E$ E* n: P
case '-':return t[0] -= t[1];! |+ S* c* ~) a# d9 \7 e
case '*':return t[0] *= t[1];
2 F6 B. W5 e3 s, E/ Y default: return t[0] /= t[1];//case '/':
: @- A, q8 C4 X* |5 g }( T/ _' o. p- a! l6 L
}}) [3 q! l( y# D2 S- c* e8 c0 r1 m
template <class _T, class _Tstream>
1 L% j& O2 z) X0 v3 M# K0 |/* _Tstream: inputstream, _T: get return value
# _2 R: g& M. s, @* Return nonzero if get value successfully */$ y6 f+ L1 l' _9 o2 \
int GetExpValue(_Tstream& istrin, _T& nReturn){
9 ?: z" y3 d4 s. s" e- k8 L _T t[3] = {0}; //雨中飞燕之作6 Z x8 W2 F& V5 H8 O; r( h; ^
char csym[3] = "++";: B# q7 a- j4 @% b' r# l
int nLevel = 1, nERR = 0;
" j9 ^8 C& T- Z" ^; Q- C2 H; c if(!(istrin>>t[1]))istrin.clear();( G% V* K3 Z( S* p& p
for(;;){% L9 E. J* `, `
if(istrin>>csym[2]){
6 u5 ?! \/ L" E% m$ R* ]% i9 g: ?$ v switch(csym[2]){' _! Z. q$ s" E9 E8 L0 o$ r/ @
case '(':. |: W5 S( m# E
if(!csym[1]){nLevel=0x100; nERR=1;}else
. P% S2 x5 D% v& h6 w6 ] if(!GetExpValue(istrin, t[2]))nLevel|=0x10;$ q f2 L% K; C9 S: H2 J
else{nLevel=0x100; nERR=1;}! F3 S4 G/ N. _8 q. n. s2 T
break;- n: M; N; c0 U; Q9 R# x
case ')':* K' P/ v: ]' g7 F5 s9 R
{nLevel = 0x100;}break;
9 _8 z. r- \0 j2 H case '+':case '-':case '*':case '/':
" u8 Y* D" a+ `7 V* m# @+ o" _ {csym[nLevel++] = csym[2];}break;9 s3 q7 Z( ]9 I! ?2 l
case ' ':case '\r':case '\n':case '\t':continue;
" g" z( ?) H9 T$ J* b; t% Y+ z+ y default:( r/ e, k0 {& Z- E
{nLevel=0x100; nERR=1;}! ] h( V* D2 `
}: C' k, P s6 U/ O2 ~( r
if(nLevel==0x100)break;
; \& |) ^# E/ t! p if(nLevel&0x10 || istrin>>t[2]){
0 ~% r; @5 _$ S8 b$ P nLevel &= 0xF;% X% w0 m9 {; P9 f
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
& T" B5 T2 a: ? if(csym[1]=='*'||csym[1]=='/'){
7 }& M, t5 q! h7 ^8 B9 B, i/ J GetExpValue(t+1, csym[1]);
& v4 s" u( l# B* _ }
8 `5 C' Y% R9 s else{
6 {3 R) ~% [# @7 y. ^ GetExpValue(t, csym[0]);6 _+ J& D/ ?! k' ?' T' T
t[1]=t[2];csym[0]=csym[1];csym[1]=0;# ]$ Z, `2 I- ?6 }( B
}
' a" n0 c" F. i* G# V8 x nLevel = 1;
. [3 P: j; Q5 f) @; r$ E8 S* m }9 Z! j8 e5 F/ p, a) S
else istrin.clear();( p$ ^6 z% y8 a" [5 N& G$ K
}' i# c1 }. g- L5 h# w
else{nERR = -1; break;}! S Y* P/ j0 b$ o' [
}
3 y8 h; e+ E9 A* [* } if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);( s V! T! u* ]
else nReturn=GetExpValue(t, csym[0]);8 |/ i7 y4 U! Y' Z
return nERR==-1?1:0;
5 T2 k' f# Q9 w3 ?/ i3 D$ n$ \}}
+ n& p! Y5 t K& {/ G9 N7 W& U" l1 V7 F3 q0 I/ S
4 `, V" t8 N/ Y* w& _
0 p5 T* R$ ~1 \4 @( A, x函数模板使用示例:
7 o2 O8 f4 F4 H, {在以上那段代码的后面加上以下代码:
2 S6 U# D% x6 c
4 E8 m) @5 e0 l: K 2 y6 U7 ^7 {0 ~0 v
( n# Z% R) g% q/ n/ F程序代码: 9 D* x: o- n/ X4 M
: D3 }. n/ I- L
#include<strstream> P3 U# a8 R3 J, x$ C
#include<iostream>; ?1 B- ^: q7 |, j
#include<string>
# j3 z5 T; u/ `) Dusing namespace std;; ^) h% b( M( c
int main(void)
( j! D$ @) O1 G5 L0 g: ^{
; B( }$ g; H& N6 H) C# [4 _ string s1;& Q" {+ ?. h( n0 c6 ]
while(cin>>s1)" r! |0 V8 j6 D- d0 ^
{( `! j( ^. l4 I% d2 q( k1 c
istrstream isin(s1.data());
& U. p- K2 c7 E% |+ p" J, t double d;
, o8 ^9 L- {0 N6 k! D( r# s if(fy_Exp::GetExpValue(isin, d))6 ^& ?) s2 j& p* a, [ o
{
8 h! {1 j7 e. J* o" T cout<<d<<endl;( E3 G0 y- O- ?9 h
}0 x! C5 C9 ^ A% c
else8 m, E) u, O% H: s& w3 P+ f6 j
{. m1 k2 d* Z) @8 Y; n
cout<<"ERROR"<<endl;. M! p& L$ ]: C" n
}
" i& h, [/ o8 B% _ }
* m1 U3 p, S1 M- L return 0;7 L9 r% R8 o+ q3 @& j0 }9 Y
}
" z" V$ R) O0 g+ R
* U! T1 {& U+ s$ O/ g: B" U. y) Z
) f8 E- n' v8 T然后编译执行就可以了(*^_^*). ?$ P+ Y6 S1 t% i9 a
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
& Z# i8 n+ V* H% n: u* B: K" t7 D: G 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|