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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
1 ^. B) R3 Y) d" ?一个很方便的函数模板,可以并且只可以计算含括号的四则表达式2 M: [6 K8 m! E' }( i* K/ ?4 ?
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
+ }: O: c+ f+ U参数解释:
3 l' f4 d9 i# `6 r: r9 ^. {4 T# ~. |istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流& T! l! h0 {5 h- P" p
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
' _2 E; E6 `* X2 j2 a6 I& q% ?返回值:
) l+ h( f5 u4 A1 u9 X返回非0表示计算成功,0表示计算失败有错误' ?( a9 x0 h/ @' k
5 j( O9 a! \9 J. {6 u 7 W7 o3 t, F: |( j
' a X' }/ d' I/ z! R8 m2 ]
程序代码: / W9 d: F; F. |
$ x& r& b. L$ ?. d( T" C. a( ^
namespace fy_Exp{
9 Q- b. z4 ?, I: h: |namespace {template <class _T>
* f4 f' E. H$ l8 kinline _T GetExpValue(_T t[], char& csym){* g+ }* r1 ?: e T9 N
char c=csym; csym=0;! N2 f1 K) N' k$ C* ^4 m' ~
switch(c){ R j9 G2 z) N4 k: ? l$ X
case '+':return t[0] += t[1];
1 Y1 j, {% ^, ^3 H s case '-':return t[0] -= t[1];
( B9 K2 K4 n) W" p* l case '*':return t[0] *= t[1];
5 T/ T/ {: d5 b, f default: return t[0] /= t[1];//case '/':
2 p* I$ w. ]$ ]& Y) I. q2 a/ r }% b8 |3 O- N8 [. H6 M( V, v) u
}}( T# ~6 N9 s2 i* o1 c# m: e0 R
template <class _T, class _Tstream>
/ Y1 h) ?2 f* ^) O/* _Tstream: inputstream, _T: get return value
- n% e) B2 W( o; H* Return nonzero if get value successfully */. f3 N g; M! w% K
int GetExpValue(_Tstream& istrin, _T& nReturn){' V! D3 _" W0 K) s7 w
_T t[3] = {0}; //雨中飞燕之作7 Q) u1 r, j9 H. k$ f7 o# R
char csym[3] = "++";
4 r5 K$ P3 j5 v6 ]1 O) F9 G int nLevel = 1, nERR = 0;' r) i- }9 S1 S0 y% P
if(!(istrin>>t[1]))istrin.clear();& a+ h; h1 b* [7 {8 ^
for(;;){
- _- Z& G2 l2 s Q if(istrin>>csym[2]){
9 @) Y1 R, M$ M# h7 q: a switch(csym[2]){
: \: Z4 W, r; _9 U9 w, X. P case '(':- c5 }( ` q- Q( i* L! @2 G
if(!csym[1]){nLevel=0x100; nERR=1;}else* O. `3 R6 p7 r8 z8 Z! a
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- R ~. F. K) m% `: h/ x5 Q
else{nLevel=0x100; nERR=1;}; Z; R4 z( T" R) b, @- @5 i9 v
break;4 X( y3 ]' n! U5 v: M
case ')':
2 Q6 U" r9 c; A {nLevel = 0x100;}break;
. V% i4 @8 T, R$ y8 B4 ?, c! d case '+':case '-':case '*':case '/':
" p, o7 i( Y8 ?. m$ T5 @1 y& u5 x {csym[nLevel++] = csym[2];}break;
, x2 C: F% `* ~# @9 P7 J case ' ':case '\r':case '\n':case '\t':continue;
9 u6 m8 r! b; f+ O6 X- O default:8 C0 I4 ^' ~4 M% E$ ^
{nLevel=0x100; nERR=1;}* V) ^& v% `- C# g: ]
}$ j) h7 r; z, e( F/ M2 k- n8 L7 c* _; Q
if(nLevel==0x100)break;
6 i# @. H$ r4 s1 c% G; d if(nLevel&0x10 || istrin>>t[2]){
, f8 t! x9 n! S nLevel &= 0xF;
& B. O1 m' f$ a, \ if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
$ s3 B& s7 g- D. ]. L I& B if(csym[1]=='*'||csym[1]=='/'){
- X6 ]; g" E* O6 B GetExpValue(t+1, csym[1]);
/ @! S9 S+ w6 _: h" ~! w }2 v# j6 Q- {/ o/ A0 p5 ]5 q0 Q
else{
5 m! G7 K2 w( R+ |" K6 x" n GetExpValue(t, csym[0]);
/ V2 C# b- i$ h5 c5 t0 p& z t[1]=t[2];csym[0]=csym[1];csym[1]=0;/ I4 x: _. V" ?# ^
}7 t ]" z+ K& X/ W
nLevel = 1;
& ?% C. G, h+ z6 \* m }. ?2 }3 T$ L% [2 S9 A( n4 {$ K
else istrin.clear();3 P, O" l$ Y! _7 f/ e
}
* O' b" J: l2 X" I; T, ~ else{nERR = -1; break;}6 l3 H. r$ b0 V) G/ \/ i
}
7 N) l/ C& r2 z if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);- R* H6 T9 j7 T1 G
else nReturn=GetExpValue(t, csym[0]);
! ~% S1 E& y e' {* } return nERR==-1?1:0;
: _8 S ^6 y8 a5 g# \0 F2 }3 g; K}}
6 M( \- S2 V1 E: v% ^0 _
4 ?. t$ q6 L8 d3 K6 H; I2 K6 J+ s+ R& E D* N
1 X0 _4 P, f" y/ D, N+ i D& W
函数模板使用示例:
# U2 t! x, b: _* A! u在以上那段代码的后面加上以下代码:( p3 _+ [0 ~8 K' z* J3 t
! r( g0 i1 Q8 z. o/ R
, |# H/ H# D" [
6 t7 F" o7 Z" W( Y+ o程序代码: + ^/ g3 z! i1 o) m$ v2 G
4 X w' F3 q# u& k#include<strstream>0 o8 D. s3 B# i1 [9 R
#include<iostream>2 M& k! z- `$ _. Z
#include<string>
! `; B$ q' P6 H1 s! _using namespace std;; b$ Y; X* [; n( N
int main(void)
4 ]. q/ y9 H" A& W, o{0 b% V. N2 n# A- |2 o; I6 g
string s1;0 S0 ~ t+ a- U: _5 b( [ ?
while(cin>>s1)
1 I- a f1 d# c0 y" Q9 G {
3 Q4 ]1 J! w+ i8 \% A istrstream isin(s1.data());
! @8 U/ S7 T3 f' B0 [ double d;3 f! w: C: M/ x3 U$ M9 G' A' k, S+ U
if(fy_Exp::GetExpValue(isin, d)). I3 _* m, `& O( s9 n
{* Q. W1 W/ q. J- t5 z
cout<<d<<endl;4 k4 D; [ c( L* X6 X8 {+ o
}
/ R- A6 q: V( g0 U# Z3 E else
4 K) M0 F6 d1 e+ J- u {
) j& V" h/ N8 \ cout<<"ERROR"<<endl;
* t5 z2 d. P$ i7 M- Q3 i* f- G6 d }
9 m3 A+ J. _9 Q3 _( ` Y }3 Y I0 I8 ], Y! m: t
return 0;
0 t. v% s8 l- B: S7 ?# w}. m6 q* l6 |/ `$ I% z
# V' M* U% t' u# v' t3 U1 I
) s# Z) ~. e& X `% M' \2 s- I然后编译执行就可以了(*^_^*)- m$ k' D. E8 l, {3 b4 _: ~5 _! N) p
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
! X1 a' p. H) B& R* c+ O 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|