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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
! W! Z ^% _: d) k" e9 o) ]% s一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
: Y% H/ ~& a: d$ x6 y* R只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)- Z4 D' _/ m/ H
参数解释:, L2 C0 P& d* h# ~: ]- K
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流" _/ }) G! N( Y' y% J
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定9 V4 ]1 s! i" c' |" C5 F1 |5 F2 ^
返回值:' ~* X* C. ` x8 Z1 X. }
返回非0表示计算成功,0表示计算失败有错误
/ h+ A' U4 q- S4 g7 B# l$ f/ [6 S. B9 n+ C6 f
4 m Z+ w! s% O6 q( v. a* f/ U; r
( ]! v: Y0 Q! r" p2 ~ C. I程序代码: + \, G& W k3 }& @0 e7 B
$ \# V9 S# G/ q' z4 H& a7 Q4 ^
namespace fy_Exp{/ E9 |( i& p+ R/ T+ b+ L% h
namespace {template <class _T>' `+ ?% O0 J, z5 y6 O& z
inline _T GetExpValue(_T t[], char& csym){3 E4 F4 L9 Z; t7 p
char c=csym; csym=0; e( o* X" B! z* _$ D) `
switch(c){
}3 I% D- U q5 k; Z case '+':return t[0] += t[1];
- T' b" x* Q& v) X) e6 a case '-':return t[0] -= t[1];- F3 C0 s# s( h$ w4 o4 J# t
case '*':return t[0] *= t[1];: m& `* B! N: r+ o
default: return t[0] /= t[1];//case '/':
( I6 X& V) r( _- n/ a" G6 F0 v }
. w8 d' z3 c, H( N" D6 a/ N}}7 s& ~6 t. i( w4 B- I& u+ h
template <class _T, class _Tstream>9 |6 X6 K/ j. s' ^% j/ ?5 I
/* _Tstream: inputstream, _T: get return value
2 Z8 l9 f* s4 I! B* Return nonzero if get value successfully */ Z& n* b t9 M! b. j7 U% V
int GetExpValue(_Tstream& istrin, _T& nReturn){
) t4 M+ Q' u7 T _T t[3] = {0}; //雨中飞燕之作3 d6 q/ o8 u0 R# M: W6 }' }+ L
char csym[3] = "++";2 R, [" y: U# S% w( E$ M
int nLevel = 1, nERR = 0;
" K; H# |3 w9 d& B3 S. d) q& ^ if(!(istrin>>t[1]))istrin.clear(); e! N9 Y) d# l' r
for(;;){2 j, W; L# }1 j8 U: j4 }% g
if(istrin>>csym[2]){2 E) j5 p" A0 i. }
switch(csym[2]){5 r* X& s3 M5 R# L6 t# n0 ^
case '(':* I0 b7 \) t5 e
if(!csym[1]){nLevel=0x100; nERR=1;}else
, U7 H) q% Y9 C1 v$ P. [, l if(!GetExpValue(istrin, t[2]))nLevel|=0x10;& `- s$ j5 ~6 A& C; v
else{nLevel=0x100; nERR=1;}
& y4 j# c1 {2 z4 Y break;
! u' p% D% g$ i Q9 S case ')':9 f! t! r8 }/ ]; n
{nLevel = 0x100;}break;
+ I! Q, ~4 G6 N; L) h" n case '+':case '-':case '*':case '/':
' l* k; T; \# t; ^1 ^( _/ W {csym[nLevel++] = csym[2];}break;
! E2 R- V# v2 R6 I7 ] case ' ':case '\r':case '\n':case '\t':continue;. y9 \( e5 ?" Y3 e" _
default:
! I4 U" I0 i, z% A; ^ {nLevel=0x100; nERR=1;}" ~3 S. ^3 o, d9 D: N1 b7 g
}
+ x4 F" g# d+ x( Q0 k1 j+ c- L if(nLevel==0x100)break;- I. f* q/ W& c1 m5 A
if(nLevel&0x10 || istrin>>t[2]){# e% n: D( s9 @; f# q
nLevel &= 0xF;+ F& s7 ]/ t1 t" }; }
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
8 p5 b+ ~" E8 H3 m+ N) K5 i if(csym[1]=='*'||csym[1]=='/'){- W2 p7 d; o: P* |2 {
GetExpValue(t+1, csym[1]);
' x. `) k; Z7 o: b1 i }
8 A5 ~' V- F, x: g3 K, n else{% F0 M) M* v+ k2 |4 Z5 U- J
GetExpValue(t, csym[0]);
3 ~ M# |: x( a t[1]=t[2];csym[0]=csym[1];csym[1]=0;4 n3 ?+ E8 H/ [, N( N% {
}2 s. F0 ]9 ]( K+ {$ i$ F3 [% j
nLevel = 1;
( P" W8 I- T3 N9 @ }
8 U' u# L l ^* b( S4 M& M else istrin.clear();
" v. h+ b, B F: {# U$ J+ v }# k8 w7 y, c2 D4 Z, j9 Y: m
else{nERR = -1; break;}
& Z( S4 q+ _% P& B }
* X6 |+ p; U4 d! y' ~$ I if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
( f5 B( {) H! L else nReturn=GetExpValue(t, csym[0]);, }# @7 w- i* N; p
return nERR==-1?1:0;8 t8 c, p" s1 ]% }- O
}}
4 c9 M: b4 D5 ^' q& L! w, O$ f' p7 j. `9 r8 S3 \
: d8 z* `; {* u, n% @) M @& k3 t
函数模板使用示例:4 U- p9 v5 V7 l
在以上那段代码的后面加上以下代码:
* p# M, w. z- f5 g( K8 c, w3 O0 x% u1 d+ h) P8 F- W* G6 Q# ]
) }; E: s( }- K$ i6 q' h1 {7 _" G- l( E( H0 v2 E/ L" P$ r
程序代码: ) l* i+ W/ z( u4 G
. {% I7 W, J i9 a a; M
#include<strstream>
3 W$ X k5 T) c P8 P* ]#include<iostream>' l# A, D5 ?( m1 c
#include<string>2 d1 m: {5 ~/ D J- j$ `% g
using namespace std;5 l' ]9 R1 ?2 s/ d6 z
int main(void); ~8 _9 X7 ]. u
{2 M" N; i( \0 r( H' R
string s1;1 p+ ]$ I2 v& @3 J' ^; Q
while(cin>>s1)
- H$ }$ y9 S# C5 c {
' {7 }( ?3 v$ ?. h: }/ F6 o" e istrstream isin(s1.data());. A$ E5 r$ ]6 W# t, Q; n
double d;
) g2 l% ]! [) F9 a if(fy_Exp::GetExpValue(isin, d))+ O/ w) p K6 C9 o% _1 d, _+ c' d2 G
{4 n( r6 {3 t/ V1 ~0 P
cout<<d<<endl;
. q$ I% [* b$ x% {. y9 f3 A( D }
! }- V7 Z$ c2 F6 s4 t* \7 S u6 ^! k9 m; R else
- j& Q) o' j0 k& L6 A' u( j9 B {" j, t, ?5 _$ S8 v4 H w8 p- D) \5 k
cout<<"ERROR"<<endl;. U* M) X% W0 z% o K+ h% K2 U# a
}) s: o, ?# ?% Q
}* l3 `. _8 p) U: t: F
return 0;6 ]5 o+ T, L$ X9 J
}
# o5 `! H* j$ k% t
4 b" J- i) P# \$ d9 a) a% ?# O6 D3 f6 g% ]1 i _. ~* G
然后编译执行就可以了(*^_^*)
- Z0 Y; y7 Q7 d! I6 ~其它:TC++上一定编译错误,不保证在VC6上也能通过编译( E" [2 n- E d1 I- D
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|