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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,# @7 {! ]0 @5 B5 c* t7 u4 f
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式$ G- x. s, U% ]$ E8 v
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn); [5 [1 c% P" d {8 v, J4 O
参数解释:, }! `8 J$ b( ~7 @4 F
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流9 i1 U% s' A& X& V. e' E
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定% j8 o q) J6 Y3 F! m
返回值:
: u# u6 X7 D: u: Q! m返回非0表示计算成功,0表示计算失败有错误' K( Q6 W$ H: X' s; m/ P
9 O; z! K4 s# w, z, N6 h
! F/ i5 T3 f3 n. X: r
6 ^ G3 V3 Z% J0 v9 H7 n! k
程序代码: " N8 _+ v% m5 {2 {4 G+ X* {
/ S! o" U: h) W5 v/ J* {
namespace fy_Exp{) O4 s7 e: S) M, z1 I
namespace {template <class _T>
4 R0 N9 Y9 F/ J# zinline _T GetExpValue(_T t[], char& csym){# G0 X( `& g9 G- ~' c/ e
char c=csym; csym=0;
* n! M$ D% W0 \/ @4 Q5 s switch(c){% n5 V7 a6 B! R4 D- m, p7 N
case '+':return t[0] += t[1];5 x. |0 T+ e' H* L) C% ^
case '-':return t[0] -= t[1];% H( M3 b) I/ z" K
case '*':return t[0] *= t[1];
& P% I6 r' ^* f4 q default: return t[0] /= t[1];//case '/':
9 D. K0 @( U: [6 O# t" m4 _5 n) @ }
4 i! B; t6 }( p. `# t. |) [% s}}
6 e) g( ]- F% O1 Q7 |- ytemplate <class _T, class _Tstream>2 D9 d( ?6 Y5 f& w% @+ U( Z
/* _Tstream: inputstream, _T: get return value
9 H/ W( c0 j o) [' Q5 |/ Y* Return nonzero if get value successfully */
( u& _) l/ W& ^4 C) l+ `6 fint GetExpValue(_Tstream& istrin, _T& nReturn){
2 C5 `( q% i+ o7 V+ b+ M _T t[3] = {0}; //雨中飞燕之作
& @6 B2 g' N# p" z6 N) G( Q char csym[3] = "++";
( j E' N+ w. v% G2 k int nLevel = 1, nERR = 0;. v. z+ o: C5 j1 t
if(!(istrin>>t[1]))istrin.clear();
! ?2 w+ B6 m- b: a/ D for(;;){1 @+ N7 g+ k$ ~4 G% W+ {$ f) p
if(istrin>>csym[2]){
# Q/ F/ x f7 m/ M3 u! v switch(csym[2]){7 j9 h: g; M8 B" ^& u. Z6 l8 j- m
case '(':
8 E8 u' K7 p) c2 k. k+ T1 _ if(!csym[1]){nLevel=0x100; nERR=1;}else- C- I. o% i/ I4 x
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
`! V8 G% `% E) W( |* l else{nLevel=0x100; nERR=1;}3 j6 t# o* q( e3 }* m: m3 t
break;
3 M3 P7 N5 l7 _7 n7 ~* r1 }5 D$ D+ Q case ')':
( c4 u7 G4 f5 M: ^5 Z {nLevel = 0x100;}break;. c$ B6 D8 n3 R6 h. E% P" C7 S: @
case '+':case '-':case '*':case '/':
! i2 P, w; w* R7 U0 a2 v- ? {csym[nLevel++] = csym[2];}break;- ?/ G0 V- |" m
case ' ':case '\r':case '\n':case '\t':continue;# t. {; S9 H1 |: x7 ] d" v
default:
3 ^3 X3 M4 p8 H# @9 {3 Q {nLevel=0x100; nERR=1;}
. i _( f0 ]) L" D' @ L }7 h/ B: [' E% P z8 h$ B7 O
if(nLevel==0x100)break;6 c5 n4 K3 j& P1 U
if(nLevel&0x10 || istrin>>t[2]){
7 u3 t, S6 C8 G! ?* d nLevel &= 0xF;
" O8 G. w q: s) X) x! a1 \ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}& x4 U- {" |6 e8 Y7 u
if(csym[1]=='*'||csym[1]=='/'){
+ E8 e: c. x0 i! W4 V& w GetExpValue(t+1, csym[1]);
+ D7 |# w* |4 ~0 f* O& i }. ?* @6 f% G6 R) P B1 f
else{
! A" _1 c" l, I0 T/ m! \- { O GetExpValue(t, csym[0]);2 H1 z& y6 W% C* Y( u
t[1]=t[2];csym[0]=csym[1];csym[1]=0;% B# w! V) k% {; q6 C0 Q
}5 ~( o6 E2 I! N, [
nLevel = 1;
2 m8 w, U* A. g, a5 a/ u/ x }4 A/ y1 V a7 K! Z" I2 C9 s: Z
else istrin.clear();
( I: w. v+ r% m( A }
' ~% ]) b% C: K8 C* M8 ^( \ else{nERR = -1; break;}* q2 E; ?$ R, S! {9 l! X
}
. i8 n$ O* O& @( J$ f if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);, ~5 Z. C6 z! p0 }/ v( l& g
else nReturn=GetExpValue(t, csym[0]);7 f7 b! b3 X1 S& i% M
return nERR==-1?1:0;' ]5 M7 r* l& q; A
}}
' {9 {+ `* N6 [7 Y; T6 N: M' r9 k7 k
" f1 L9 w( L7 i% V
* C! s$ D* \( G0 w) G函数模板使用示例:
: y; ~( t) f( }% [* C! D ^* K2 U1 O在以上那段代码的后面加上以下代码:
: E9 r5 L: Y, i2 }7 {% T0 T
5 Y* |, R9 w' l/ J
- i, A9 @5 A4 s8 E# S+ Q% L4 L/ R
4 Z4 f3 o" r6 `6 Y* P程序代码:
" F0 n% e" K' \8 ^8 b) O- [, |8 k( t, a$ E) P" ~4 f
#include<strstream>
2 v5 H: t0 t7 B3 r#include<iostream>
+ Y+ _. f0 E; F5 l9 ^9 `) n#include<string>
* m% k9 a( N. q7 y% \! Uusing namespace std;8 K+ j' h- W. O1 z
int main(void)
8 S3 z- n' J; c [ n5 `5 I! P{
2 p$ R5 Q, H1 m) e6 a string s1;
9 @( _ H# k5 ]- H& \, [( O while(cin>>s1)8 y0 \" }7 h2 Y4 R. O+ h% U: c/ C
{
* L' u* |) X( ` istrstream isin(s1.data());
* ^; n1 I0 K. I1 b% [; {1 G) h double d;
3 I% _* a# x4 S if(fy_Exp::GetExpValue(isin, d))
1 V: v. x" D' F! C {
% Z4 O1 C; I$ f1 f cout<<d<<endl;
" }1 i) b8 G7 t+ d6 X9 l }
4 [6 w: b" R) z+ T8 M6 T$ n6 D8 Y else/ C8 ~; f1 x# v4 W2 f% W& B J7 T
{- q3 D- U4 h) j0 v' s6 K. s
cout<<"ERROR"<<endl;' p5 `( B. f) k( C
}+ n4 [! \0 v: n
}
. t; e& @ g& C7 W; c0 g2 j+ x* \& _ return 0;% I+ w0 b" ?% A. ?2 V
}
# x% q, K- j! k$ ?) E, X' ^- O2 ]9 y* g& s" ^5 |
5 R# G& H% |9 h然后编译执行就可以了(*^_^*). |' N8 {' ^ E; T Y
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
* e: @0 c& ~" T6 f9 N 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|