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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
: Y( P. V# G. b6 z一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
8 F4 B! s1 j* N只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
: t9 ?# A6 X4 p5 N) ]参数解释:' F: z6 a4 s3 s$ N% y$ {, Q
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
; @& k1 Y1 {; N8 u% K5 w6 enReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定; F& O. E6 R. x3 s+ G
返回值:
@% l4 I3 P$ k. F1 ]返回非0表示计算成功,0表示计算失败有错误1 C) j7 ^( D: } A5 u
# @1 _3 a) C5 f& d; Y1 P
) m* j" o* f5 H" q# R O
0 t( ^0 {) x' F' D$ @# F( F
程序代码:
- a$ a! m$ S& N0 n/ u
& T$ H# r1 `4 P2 R' w$ unamespace fy_Exp{; m6 N3 f2 r5 J/ [+ l
namespace {template <class _T>
2 `% t) A; j4 d# w" Y6 Hinline _T GetExpValue(_T t[], char& csym){) m H: o6 Y3 E7 F
char c=csym; csym=0;
( p: M0 X F+ I+ Y: D Y: e switch(c){
* Q) t" V7 a0 b" ^% p7 T case '+':return t[0] += t[1];& x3 l* J2 V U; U
case '-':return t[0] -= t[1];# c/ T3 K7 @$ b! L' Z
case '*':return t[0] *= t[1];
! F! \, T. G7 H% C# |5 C default: return t[0] /= t[1];//case '/':
4 _, ?6 w* N: ]( O$ {% R+ B }
# ~ {# Z* E3 Z, D}}
1 a3 `% Z! o: S) n$ @, Jtemplate <class _T, class _Tstream>
$ U) E6 Z' w R, m! Z/* _Tstream: inputstream, _T: get return value
% u3 r" s6 p5 V! V* Return nonzero if get value successfully */) K. {0 I3 Y! w3 K" r- Y, F
int GetExpValue(_Tstream& istrin, _T& nReturn){
- a) \# X& s9 E# H2 G5 @ _T t[3] = {0}; //雨中飞燕之作 Q0 B9 _: r- B" D- M4 C4 W, c
char csym[3] = "++";
/ D$ S; D7 m5 {5 ^! D int nLevel = 1, nERR = 0;
3 w3 f, ?3 W& c$ W- R; t if(!(istrin>>t[1]))istrin.clear();
9 O$ g$ Q' r5 M% U: A; P for(;;){# r% E l' x8 L2 M) q$ _
if(istrin>>csym[2]){
! j( c2 e( E# A0 t- [4 Q1 J6 r# Q switch(csym[2]){
5 r7 T( N4 I# v k! F% z: U2 M! A) @4 R case '(':) m E; y/ E* r
if(!csym[1]){nLevel=0x100; nERR=1;}else
) c' k% o5 ]8 K6 `" S if(!GetExpValue(istrin, t[2]))nLevel|=0x10;2 Z5 F c& w! H( l
else{nLevel=0x100; nERR=1;}1 {' Y$ l; O. l- `$ f
break;* e6 K" ]! |# k5 R* H+ l
case ')':
9 k/ p4 L, U6 U2 R) O- P" n {nLevel = 0x100;}break;
; }* B* N) n* d' h case '+':case '-':case '*':case '/':
% ~2 G, ^7 c( ^* w4 d N4 S {csym[nLevel++] = csym[2];}break;) `* j# q' F; f" n3 R' }7 s6 A
case ' ':case '\r':case '\n':case '\t':continue;
- u5 y! {* ]1 s; q default:
% ?/ C& n5 v' y' M; v {nLevel=0x100; nERR=1;}. G. J$ v: Q1 Y) m- b8 B8 D
}
, h7 u# T; A+ Z/ _ if(nLevel==0x100)break;
- m9 v. T+ f9 M3 t i if(nLevel&0x10 || istrin>>t[2]){
/ g) {' [6 [/ \1 r nLevel &= 0xF;/ n. F/ o: b7 v2 S# {
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}& `0 _- t- c+ h y2 u- X8 i5 }
if(csym[1]=='*'||csym[1]=='/'){( W% {' A. q2 z2 x T
GetExpValue(t+1, csym[1]);7 r2 M/ b2 q" Y2 x# m5 w6 K6 ]
}
. E/ O* o5 d4 L4 e! k8 e/ q' O else{) s! u5 i4 a# X$ O: J }" R B
GetExpValue(t, csym[0]);1 N: Y" D6 J w0 y
t[1]=t[2];csym[0]=csym[1];csym[1]=0;+ n% ]* s X9 ~& c, m
}
5 ?. C1 r9 K9 s nLevel = 1;
& j7 K6 a" G: }4 R }
+ G3 h0 i1 V0 i/ [2 A0 u else istrin.clear();
7 n4 ]1 Q L, m( ~( \- ]; V, } }
) V6 E4 k% D4 G4 ^5 k4 @" x else{nERR = -1; break;}2 ^/ w( |8 U4 G" I) j
}) g7 S/ O7 h$ \, |% ?* D
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);$ e0 ]3 w. w/ J6 |7 e( c9 {( r% D
else nReturn=GetExpValue(t, csym[0]);
# i# C* ?7 G, @9 Q) O7 D return nERR==-1?1:0;' r# F" v) R- C# D4 I, C7 I+ O
}}
- |4 [: j# c6 Z3 d; ?$ J/ u% @, K' K
; }0 b5 S0 a6 w/ r' q0 Q& f% p5 E, r1 N" ]% C8 j8 a
: n4 ~/ O- E. d' ~
函数模板使用示例:( ^+ }* q8 I8 c/ b8 r! v
在以上那段代码的后面加上以下代码:& ?# g8 P) b9 Z8 w8 h. T
8 ` n$ C% X) k6 R" @( g; \% m' K. `
( S' V! z8 C. l* n: M* R; j( b6 b) r8 @$ B- m# s
程序代码: : y; Q0 }7 l# ^6 B& X
8 V# y8 Y1 y; C4 U# {+ r
#include<strstream>
6 n" m/ K L( l! z9 W/ w#include<iostream>
( R" ` J9 R% `" C( D& ^+ f9 U#include<string>
$ p$ I Z+ ~. ]2 q' S, }0 w* ]using namespace std;# f3 i* ?$ F/ t8 v$ N& X5 f
int main(void)
5 R8 C. s8 j* \" \5 ?{3 I0 ?( Z& H' v; t( M, U3 {* ~! Y3 q
string s1;
) v( ~% r6 {4 D7 z8 L while(cin>>s1) u s/ j( r) W2 r; \- t
{
! I* Z; ^. H/ w istrstream isin(s1.data());2 T: T2 a7 {( L, ~& w: j2 \: H
double d;
2 ?2 b |+ X7 |. ] if(fy_Exp::GetExpValue(isin, d))
( p' T" j2 Y! S. g0 \9 F, O; \ {* p7 q Q) V! R) G( m3 A. _( K
cout<<d<<endl;: o7 y/ f4 x8 W
}
+ P5 B; _6 [) }, x- W- h) k else
9 u2 a! P) j2 V, C6 t& E" W; j3 p. f {0 y/ i& a# t$ j+ J' _0 u
cout<<"ERROR"<<endl;5 u& Z, J; T/ F, I* ~ _( D6 w; {- c
}5 h/ g6 _: S3 J4 C3 X
}
6 D2 U' G& G) P4 q3 U. { return 0;
% \+ t: k' n4 X6 A}2 L1 j; {+ A5 L/ R1 E" y- @; G
$ D$ X" B0 I) u4 r( y- [ D
/ @6 k# T: y2 x5 W/ G% D然后编译执行就可以了(*^_^*). j9 L+ V+ {3 X2 g9 f, X
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
2 A& J2 o# c9 L% |' J# ]/ d! G 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|