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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
# c2 F, U$ h: x+ x' B一个很方便的函数模板,可以并且只可以计算含括号的四则表达式1 S$ m) q2 N9 d
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn) R& p, K# h: i! c& v! g8 c* S
参数解释:
. O( C5 f2 v% Q7 ? m1 Zistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流; O/ T/ ^5 j3 F6 n# \- b0 K
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 }9 W& `3 d6 {# v- I
返回值:( Y3 r& R0 ~0 }6 t6 y
返回非0表示计算成功,0表示计算失败有错误
$ l* S& ~/ `, `" j+ P/ v+ h9 W- X, Q7 B) h) x# m" |" F
, F$ q5 u) f. Q& O
6 m/ A$ p% p4 W" P' I6 v( A) F7 {程序代码:
( r3 M; e9 x: c3 d+ K& h/ O( D: F4 b$ y4 O2 r" b: n
namespace fy_Exp{
# d7 I* |4 l. b! r) K4 k) |namespace {template <class _T>: Y% J! O( p/ T7 q1 g) u! C8 [! I* w
inline _T GetExpValue(_T t[], char& csym){
3 @* J7 J+ ~; t: C char c=csym; csym=0;
8 d- }; L1 r2 N, Z2 A switch(c){
8 Q$ W$ G# x. @: j, E q; M case '+':return t[0] += t[1];
$ h' Q, ~; ^' v. O$ I* f/ t case '-':return t[0] -= t[1];
! j$ `2 x6 K% k$ i2 H# i+ I6 z case '*':return t[0] *= t[1];
# t2 C' Y/ O$ J4 ^0 I" p default: return t[0] /= t[1];//case '/':
( T0 [4 {: r( N5 f! T: O }2 [+ K E0 i8 _& H: x$ i
}}9 i% \/ M! O$ R& B' y- [5 ?
template <class _T, class _Tstream>5 `+ t- A: M- D& q; d8 X- D6 Z6 }7 [
/* _Tstream: inputstream, _T: get return value
4 r4 J, K, K/ I1 O* Return nonzero if get value successfully */4 x% H: S/ Y' ?% t2 c- {# p Z9 G/ h
int GetExpValue(_Tstream& istrin, _T& nReturn){: v7 b* _7 `- M* l; J
_T t[3] = {0}; //雨中飞燕之作
4 B$ l( ^3 g' o# m3 {4 T7 V$ n char csym[3] = "++";1 n6 c2 Z$ S; O1 k# v1 r/ O6 H
int nLevel = 1, nERR = 0;
8 K: d. E+ u, w1 P if(!(istrin>>t[1]))istrin.clear();' x& ]2 c! H8 [4 o2 V
for(;;){( {1 M) y) D' J! T1 T# b/ g
if(istrin>>csym[2]){* d- r! Y8 J, _1 Y5 l+ I2 e
switch(csym[2]){
/ Z3 N1 @+ `! Q: V, G- w case '(':9 d7 ^! Z) H3 i% u5 `+ R1 F$ o1 d
if(!csym[1]){nLevel=0x100; nERR=1;}else
! \* u1 ]! o' k+ C$ s9 k/ i" C+ o if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
5 x5 ^5 p1 Q) p( |5 y else{nLevel=0x100; nERR=1;}6 I: j c, u0 P( n5 X1 ?5 X
break;1 r0 O7 d! M/ G9 M
case ')':
, `6 Y2 I, s B: v1 j {nLevel = 0x100;}break;: u6 D% r/ v0 `3 Z' H& W r
case '+':case '-':case '*':case '/':
: ~5 b8 [1 _* V* w {csym[nLevel++] = csym[2];}break;' R3 M6 i! i. @
case ' ':case '\r':case '\n':case '\t':continue;2 A" n- L" V& f' i7 r0 `$ w
default:: w7 r/ k, y) G
{nLevel=0x100; nERR=1;}
9 o* x! w0 f% Q: M( N. g8 Y }
: ]' @! H5 s$ F T if(nLevel==0x100)break;
2 |) a* Z$ A/ n( o5 L% Q3 B if(nLevel&0x10 || istrin>>t[2]){
! M. Q6 Y$ a* v* X nLevel &= 0xF;
) k& Q# K$ B: M1 Q! E) o% T2 W" \ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}5 t- X9 D: y. u5 b: u
if(csym[1]=='*'||csym[1]=='/'){) w5 X# M# q9 j4 V" y3 P
GetExpValue(t+1, csym[1]);/ V a7 J$ ]" w" J; d
}
2 h$ a+ l. F0 z$ L9 _% h else{
/ l3 [! l+ s. M8 x$ |% X GetExpValue(t, csym[0]);, D0 F: k& G+ T8 e7 z/ y5 U
t[1]=t[2];csym[0]=csym[1];csym[1]=0; ^' K5 E( ]. I+ b
}9 P7 r; O( M" \! y
nLevel = 1;# `2 O" U6 c: k* T n" ?' s* i
}
1 D- x9 r5 m. p+ @" [% A* H else istrin.clear();
( g/ G _- _/ N- _% G2 {: D& s }
4 x; B! u) l% o& W* X else{nERR = -1; break;}
8 T3 l6 M1 |: X9 F }
! }. T% b% O3 K' ^1 Y2 M if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 y+ u1 K1 Y: }3 `8 M) i7 o: t5 k else nReturn=GetExpValue(t, csym[0]);7 K/ m7 o9 N& x, p! O8 `
return nERR==-1?1:0;5 @7 x* h" N3 H1 i4 e9 f
}}% w4 `. s/ o2 L& i5 P7 [, t, {
+ ^: ]; ?9 K$ ?; p4 y ~9 ]- D8 G1 W
& c4 B) B8 P( j+ L& G函数模板使用示例:
' |+ Z1 j, J# k7 @1 v6 [& a4 k$ s! k在以上那段代码的后面加上以下代码:
" d0 s, Y7 }) H0 B0 o& Y0 j
( c* T C! H: Y 0 {- S* `, F$ O) J- M
$ x- v# k* r& U0 g# w
程序代码: % c, @2 q5 \: S/ e4 E
( A6 {: P* i" ?' Y$ R. r#include<strstream>
: n( H$ D) f- j1 O D#include<iostream>
% B2 J( Q9 s! k0 M9 e9 |#include<string>; L* y% t9 q/ j3 n f) }
using namespace std;
& S8 o' @! T* s( j2 J4 K. rint main(void)6 ~; a: f3 K6 G' g
{+ t3 z% P. ?: Y* r" a' v: A F
string s1;
7 ~) N7 E. c. ?% F4 { while(cin>>s1)
2 }4 i z: E$ W8 C2 i0 ^$ g& m* Z8 ~4 p/ D {+ u8 t$ }: ~2 k; a b5 K
istrstream isin(s1.data());
* g5 F6 H" g0 w1 U double d;' w2 X: ]/ P- J5 [
if(fy_Exp::GetExpValue(isin, d))* h+ y# [ |! t# C
{
6 V) S6 A. d: f5 d4 B: P cout<<d<<endl;. E# o7 `+ x, ]# U: U
}
' _% }- q. M- s: e) d# n else$ O% V+ c" M2 [+ n& R2 J. k
{
+ Y5 h6 T* e+ w+ g cout<<"ERROR"<<endl;7 }) ?& R; s# N, J& j# ?1 `
}) t1 e0 i5 J2 N
}
2 m' @3 {" k1 B( I0 j: H2 u' E return 0;6 U& T$ u- r3 U
}
- U! h) x0 c, \3 A8 E9 T8 o
) g* z! R# Y6 t8 k; S8 v" N& ^: u0 n4 e
然后编译执行就可以了(*^_^*)! U7 T$ S9 c* N4 `- g
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
x) h5 {5 e- S1 G( q6 f5 N+ _- N) O 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|