一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,+ q6 }+ J, d7 M/ m
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式* b- X) @+ J+ @1 O0 C$ k2 c! w3 _" x
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
( `" o: n) {8 W F参数解释:
; K+ B* p7 H: i6 t1 Cistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流# T% U% b) B# L5 [- P5 \
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定9 P% T2 y- _: g* i- a7 G
返回值:6 Y, j2 u' q( ~- z
返回非0表示计算成功,0表示计算失败有错误
+ F) Q K: n; ]7 j% r
; g2 n& @& k4 l - f8 i$ q8 F/ {# h3 S4 J' n
- K) r% K& P8 Q程序代码: P4 M1 R1 G( u- P* Z6 W& M! W
: p* ]; J. ?; a* Pnamespace fy_Exp{
0 V' j9 [7 A3 O/ ynamespace {template <class _T>8 B/ O4 @- K8 m2 C1 Z3 t
inline _T GetExpValue(_T t[], char& csym){
% U0 |0 [( L' I5 ` char c=csym; csym=0;: \ V4 ~5 ]4 e% p( |
switch(c){
9 r9 l* d' e6 S0 C0 Y$ P8 K case '+':return t[0] += t[1];
) L0 ?# |- ]: K2 r8 _, M$ @$ |# O8 h# v case '-':return t[0] -= t[1];
, D& o: o* e- {, g& X7 M case '*':return t[0] *= t[1];( u; |1 O1 c# t! {% V$ {1 _
default: return t[0] /= t[1];//case '/':6 M5 G0 |' A) I1 Y- m2 P
}
- I2 `* d! Z: |2 s* i" |8 r}}' D9 c- C1 k8 Q: v) l& R
template <class _T, class _Tstream>
' ?- I4 @% m) h+ ?4 P/* _Tstream: inputstream, _T: get return value, r- P! F+ x2 F8 D1 c. e% S I
* Return nonzero if get value successfully */
* O* @3 @7 Y2 B1 r3 O! p6 ]int GetExpValue(_Tstream& istrin, _T& nReturn){
# a& |; L5 Y7 w1 l" f3 Y _T t[3] = {0}; //雨中飞燕之作
: j; ]4 o; @) Z& T char csym[3] = "++";
( L3 Q3 a' y- z s* M4 a' ` int nLevel = 1, nERR = 0;" }* \+ r2 x3 n L3 f
if(!(istrin>>t[1]))istrin.clear();
$ r/ f1 b1 H" D. L# G! N for(;;){2 J1 w6 o& ^ L; d
if(istrin>>csym[2]){. ~# |+ t6 A5 a6 Q, ^0 `3 G
switch(csym[2]){
$ V) s! v4 Z& [$ M( A case '(':! P0 M" t! ~% @) W7 M
if(!csym[1]){nLevel=0x100; nERR=1;}else
: i6 T; j* p( H if(!GetExpValue(istrin, t[2]))nLevel|=0x10;7 z$ s( g* b. o- P1 @6 E% p" v( q
else{nLevel=0x100; nERR=1;}/ D* T8 |* _9 r: Z3 M! ?
break;) ?' o6 {9 g" e5 b- ]( a O, q
case ')':
' x0 n6 G w1 b! e {nLevel = 0x100;}break;) S: ]+ X$ n" x# T% _3 ]6 l
case '+':case '-':case '*':case '/':
1 D: B8 R* J& g: ] {csym[nLevel++] = csym[2];}break;! I" K& [7 @) }9 c2 K! p
case ' ':case '\r':case '\n':case '\t':continue;
* K8 T( G4 z# j default:
* N$ H2 g$ ^ d, r, I {nLevel=0x100; nERR=1;}$ F2 w& H9 O1 W: u/ c
}9 m/ ]* e7 |. c' W5 ^
if(nLevel==0x100)break;% o) S! |! F1 A2 R
if(nLevel&0x10 || istrin>>t[2]){- p5 Y; k( W, {7 ^+ A# p0 M( c+ I
nLevel &= 0xF;
6 i& w8 r; X. O f8 k& _ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
- P* l- w6 S6 ~8 t if(csym[1]=='*'||csym[1]=='/'){/ C3 ?3 B( T1 s' o6 C5 E
GetExpValue(t+1, csym[1]);
9 z$ C2 N% V/ q8 U: {% _% o }
. K$ A1 r, V$ G) T' b" h0 u1 C. } else{
' L) v" d5 ~- J4 G, w GetExpValue(t, csym[0]);# n ^$ s0 F: U* q: L/ A
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
; t6 y& V O6 e- ^ }7 q1 Z. Z6 @3 u2 G$ r) Q
nLevel = 1;+ | n) d( B' H$ z7 P# c$ H
}
9 y6 C* {! L1 }% Z' D1 y else istrin.clear();
6 D" {9 ]; G, q$ a0 @% `) q' F }" g' v% D5 @' C# l4 M# d
else{nERR = -1; break;}6 g6 E( n! _8 Q9 u" b2 b
}
& |+ L- i) k4 j8 l1 s7 p, e if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);) h5 X) W- n& f3 Y
else nReturn=GetExpValue(t, csym[0]);5 z+ i$ D& X8 e5 h/ o( G/ s; d
return nERR==-1?1:0;
, h4 Y% _: g+ @4 R ~}}
; I8 U9 S+ j2 J9 ~0 C, k c$ a! |0 w. \2 ]; N; X' T
5 h2 {$ u5 K- a! h* Q: J
( P4 M( ? n) w/ p/ l% t
函数模板使用示例:
9 l9 W- o/ m3 l" `, ]. F, I0 J在以上那段代码的后面加上以下代码:) Q8 d9 o: K: ]) }
/ y( u/ m+ ?4 g* P ]- ^
: [; [) f$ l7 f4 \( b5 N2 J+ f
* p% T8 L! F. i" j2 ^, h程序代码: 9 K( [! h& R( ~; s- B
- e3 @$ q2 c: @, P2 A" u- R) A7 ~#include<strstream>7 q; Z" M; V6 B. E- J$ T0 I
#include<iostream>
; ~: z2 v: K$ ?- m! J#include<string>' }3 g' H5 K) P& S
using namespace std;. v/ r4 F( B: ^9 g
int main(void)+ X C* I: }$ T" d0 G3 m
{$ E0 R. U9 l/ M% R$ _
string s1;
. H4 `8 ^% u- ]! X6 `. E7 N G- s* b. K while(cin>>s1)/ M1 B9 ]$ K4 g+ f: k5 @5 F r, P
{* O U. F' c% I& T
istrstream isin(s1.data());
# @2 M9 X0 ^6 w' M7 @1 l double d;
% f& t# _1 c2 v, H if(fy_Exp::GetExpValue(isin, d))
7 x2 w& i- O+ t+ ~" L# r {3 {* k$ f9 d% q0 e" k
cout<<d<<endl;1 o" ~% G3 i; ]% W
}9 H e$ q( x. T# O
else M3 f2 M! }) [, E% \( F
{
1 [3 k; _! z" K cout<<"ERROR"<<endl;
' z' L& Y' B1 L% V3 \ }6 R2 w" F6 E8 L
}. K$ H: ~6 p+ E! E+ [
return 0;
/ q+ W8 f. A0 E2 ~. k}
# L! d5 l" I) J; M4 ]
8 l. t* M8 r" L+ c1 `- h4 `8 z4 a
然后编译执行就可以了(*^_^*)5 f, @2 i1 G- K5 Q4 F
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
* J: [' J9 g1 K. u9 U3 S 建议使用VC7或VC更高版本,或者使用GNU C++编译