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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,. ? h- Z8 l5 Z6 g' L; B1 r7 S
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
6 W: z$ r) C6 N+ B1 e3 L# s6 v0 V只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
7 v, Y3 t( e' J/ z: y) d9 c! d参数解释:
" ?: i% f& \" }4 O: Mistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流3 K# t) z& m4 r! W' ]- M9 k
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定& D% n2 [, h9 _. U3 x
返回值:0 S+ e% {# [3 f
返回非0表示计算成功,0表示计算失败有错误8 t2 k, Q" G; a0 A$ h9 _
7 u% c" [! r* A4 y
/ |# {8 j8 `! ?
% [( D+ g. A. j程序代码:
- n% b8 \" C0 r- K/ A
3 ~7 @& k" P: v- w; E8 L1 Inamespace fy_Exp{% r( `( F( z! E1 x, |3 A4 t; V
namespace {template <class _T> g b. U. G4 K) y1 h
inline _T GetExpValue(_T t[], char& csym){
' J/ k# g2 B% r8 J/ x6 A char c=csym; csym=0;
* v$ {$ W/ q4 G* a switch(c){
! k8 Z* T6 L, R3 H& Y case '+':return t[0] += t[1];
8 \. k- F2 j* m9 A( N: e case '-':return t[0] -= t[1];
; g. v. n) I% a. R0 O& D6 s; ]5 x case '*':return t[0] *= t[1];) R" r1 n8 i, Q
default: return t[0] /= t[1];//case '/':* o" r& z+ [, n& o( C
}& p( q1 B$ B( L) ?7 _$ b; M; q: I
}}
, M; H( M7 A9 P# etemplate <class _T, class _Tstream>
8 z+ ^5 {$ N5 K5 T/* _Tstream: inputstream, _T: get return value
# d9 v- q9 i# C* Return nonzero if get value successfully */4 [3 v- |4 g% i: g" y H( S
int GetExpValue(_Tstream& istrin, _T& nReturn){
. D& e9 b0 T& T I& K- X _T t[3] = {0}; //雨中飞燕之作
+ r3 N3 T5 k: P; m2 ~/ I* P. p char csym[3] = "++";, x& T% b) m# {- r) `
int nLevel = 1, nERR = 0;$ X6 c$ I3 ?" m$ M# f8 [7 p
if(!(istrin>>t[1]))istrin.clear();: P- E' e# ~1 N
for(;;){
1 `/ }5 k2 p( ? if(istrin>>csym[2]){
0 q& k0 p$ V# B+ D switch(csym[2]){& J, r: W( \9 B, z- h
case '(':# u3 }9 T/ ^) O/ d$ P1 p
if(!csym[1]){nLevel=0x100; nERR=1;}else% \, G5 P) p$ e7 s' ?- j- ]
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
3 K6 ^' V/ b O else{nLevel=0x100; nERR=1;}
4 Y7 S$ Y+ [- Y8 H. e2 M ~ break;0 y: u2 V( F3 x) T" V, C; \- g- ]
case ')':
4 H; V5 c2 ^$ ?/ m" t {nLevel = 0x100;}break;$ o- c* t6 L" h" w7 C' a0 _
case '+':case '-':case '*':case '/':
' m% o& A) v1 n: x4 |# G6 h# n {csym[nLevel++] = csym[2];}break;" _2 m- B5 }2 g3 ~
case ' ':case '\r':case '\n':case '\t':continue;
( P$ a' _: ~$ p( [( N default:
3 Y. H& e) V4 S" k+ _# h/ f {nLevel=0x100; nERR=1;}3 v9 a* X; @- y5 ]( r
}& P6 t' Y/ Z+ f" E
if(nLevel==0x100)break;0 H, s- q i& M* ~
if(nLevel&0x10 || istrin>>t[2]){
8 N- u3 u; j, W+ S+ P; | nLevel &= 0xF;
, T r# W/ @( h+ A3 e* X ]7 C* { if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}. V( w \: ?$ o" p$ `0 S1 S3 E
if(csym[1]=='*'||csym[1]=='/'){# l( \ f1 C9 n" D
GetExpValue(t+1, csym[1]);* R& g: V( o6 g. \% e7 l/ Y' b
}( ^; i0 n) I2 O- m6 ?, T% X3 I
else{' c5 ]1 E& I( ?0 s% _+ O1 T
GetExpValue(t, csym[0]);
+ `' H1 I8 W L+ f e9 U t[1]=t[2];csym[0]=csym[1];csym[1]=0;
6 R) i4 L9 x. s& C0 d }
+ K! D. e; r7 u- F7 ~ nLevel = 1;
, K3 }$ r0 J2 Q; x( t }
2 w3 L# Q8 V# h7 c0 T else istrin.clear();
4 {: t4 s6 ]" }, ]! o$ H }7 L6 Q: z+ H$ m: i8 B7 E! Z
else{nERR = -1; break;}
1 c& h8 j; Y0 N% v; ]4 }% ` }0 M" M! Q2 }1 g3 O) k( d A4 k3 B
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);, F0 z6 R$ O7 G
else nReturn=GetExpValue(t, csym[0]);
5 t$ m/ y2 e$ R/ v& ? return nERR==-1?1:0;! x% k! X( |/ m% ^( r% r6 O
}}
1 G; A, s! U3 {0 H: f/ C6 a2 c5 `/ e3 q1 X
2 F, H/ W7 k6 D, U- i$ a1 h* e5 Z, K0 @+ C b0 N
函数模板使用示例:
n6 N) k% Y) O在以上那段代码的后面加上以下代码:( s9 ?: c# @9 \8 B$ C, w7 Y9 f
9 B) q- q6 x/ l3 V# H0 m
8 ]1 I8 h0 i. _
0 p7 n4 b! v, W1 j: k0 L
程序代码: 0 ?1 j$ x, W& Q. s' c
4 z+ V: Z' C8 p& C#include<strstream>- u- n6 @" d( b) `1 _
#include<iostream>/ E7 l2 W. ~& W) ?
#include<string>* k% q" b9 }! _# x3 I2 R# j7 u
using namespace std;
" l+ @/ R" z: m: y O& Tint main(void)
" U' C$ i" `: Z0 ^3 t{
0 J7 e1 O& u9 @ string s1;/ F( h* X. G) Z% p. q2 a
while(cin>>s1)
$ q( ?) T% [/ ]7 P2 N$ M {
+ @( I0 d& ]. b- | istrstream isin(s1.data());7 M9 f& G& H- _ E- `
double d;2 O, V- ^- F* Y
if(fy_Exp::GetExpValue(isin, d))+ A8 V+ E8 ~0 g/ w+ b
{/ m7 b. W$ X6 g0 [* a
cout<<d<<endl;) i* s$ i+ e1 e' b1 d m' ]- Q1 X
}
' k6 X2 _; h5 b" Q; D else. W- j8 y$ @" {7 P! S
{
2 N/ n2 n4 }: Z* w/ v5 y+ F cout<<"ERROR"<<endl;! x! V) _9 \8 X2 O* @
}3 k! z. n# ?5 m/ o
}1 D% f- i: f6 I6 \3 B4 }
return 0;2 G0 _3 p7 u* D% F# y }
}- W: d$ U! \: j9 |; z9 M
. q# l9 b z4 t/ t' H5 C. K
3 o3 C" C ~3 t0 Z( |! R
然后编译执行就可以了(*^_^*)! q6 ^9 ]) W2 v& N# L% u
其它:TC++上一定编译错误,不保证在VC6上也能通过编译/ k: ?' t3 e! c) d
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|