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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,4 y" E0 c9 h) o3 }" E$ x
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
3 H: X; A# g; i' P$ R b! C. ]只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn): |% }; X4 p1 O% E" A! z7 J7 a
参数解释:; H- e5 S* y. C4 U2 h" a
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流 d: Y5 X [- d# u
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定+ J. Q( |+ R" Y# {; N1 ], V
返回值:* ^9 F& I8 @5 H) }
返回非0表示计算成功,0表示计算失败有错误, L; [. s! f) `) O" q& H# m9 ~! F
) n- H0 }! z% a# e
# {- d4 ^% _" X' C6 p
; n, I7 {: u8 c0 C" H C程序代码:
- P* T. W! k% r* C6 t
) N' D' ?, X1 b$ J5 T0 m! R' mnamespace fy_Exp{
/ Q' {- o8 e y8 A9 w! K4 m Qnamespace {template <class _T>1 Y) k3 Z# | X& P, |7 F! u5 I- W
inline _T GetExpValue(_T t[], char& csym){
. A0 S; r0 h) R* E3 p# r/ O) a- x char c=csym; csym=0;/ n! f! e x9 b0 a
switch(c){
, }$ M7 O. s/ _9 c case '+':return t[0] += t[1];
6 U# S! h1 G! {8 n case '-':return t[0] -= t[1];9 b# l$ b6 N$ G
case '*':return t[0] *= t[1];
/ z7 C3 S- L2 v! M: [- M- I default: return t[0] /= t[1];//case '/':
* L6 E1 U3 R: A; _! C }/ W: r( f0 B! M; N1 C! k- L, s
}}
) q# c) A7 B* ]# v1 ctemplate <class _T, class _Tstream>! m' q% k6 N! b1 M- W5 e/ t0 j
/* _Tstream: inputstream, _T: get return value
& _2 x3 ?% Y/ ?0 i# |, M) m* Return nonzero if get value successfully */: F4 O0 ~6 u7 k( A q6 k
int GetExpValue(_Tstream& istrin, _T& nReturn){3 y F8 o: b# y7 t! s. Y& B
_T t[3] = {0}; //雨中飞燕之作
0 c0 g; J d/ K g char csym[3] = "++";" G# B" W' }4 V2 j
int nLevel = 1, nERR = 0;
! M4 c1 @' G7 z" R% [ if(!(istrin>>t[1]))istrin.clear();; g" `) o, {& j/ i' j
for(;;){
$ x1 g7 X1 S" w/ g if(istrin>>csym[2]){
( t1 [7 V8 Q: P3 e, w6 @3 K switch(csym[2]){
8 Z* v; S% I% ^" Y. v T% | case '(':
7 Y; C+ ~8 d. N0 |( Z! s! L% h if(!csym[1]){nLevel=0x100; nERR=1;}else' ^0 E$ E) h, [4 G
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;' e5 v) S# L% g8 f
else{nLevel=0x100; nERR=1;}
* [& x9 T4 \ \' |8 K9 G break;" m; i- _7 i3 R( S7 k1 a( B
case ')':
/ b" I# H. b% `" `# b! J4 g' N {nLevel = 0x100;}break;
, U0 p) r) c6 W2 d1 A) Z case '+':case '-':case '*':case '/':$ \( B" E9 S! V6 q8 i# f8 X* K% c
{csym[nLevel++] = csym[2];}break;
+ m$ w' R1 Q, F! Z H case ' ':case '\r':case '\n':case '\t':continue;
' p6 ], G. K. n+ q3 _ default:2 C ?; ~7 R; b* {
{nLevel=0x100; nERR=1;}+ x+ d: ?5 V" N% j/ }0 b
}: Z1 M& H" E: J* W1 N: j) K. [+ f
if(nLevel==0x100)break;4 H7 Z4 [- B1 v$ R. \% P' t
if(nLevel&0x10 || istrin>>t[2]){
2 Y' N$ @* ]8 F+ |5 m9 P. s& X nLevel &= 0xF;( t. f- |4 u" w5 Y9 G3 z
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;} Z& M' D, B) ]( ?- W6 v, N
if(csym[1]=='*'||csym[1]=='/'){
# Q( l/ C6 U9 q; g' D GetExpValue(t+1, csym[1]);
- P8 p- l+ u- [ }* G7 V2 ?) j' x1 A9 w3 k
else{
7 t9 [" u" o, c' U GetExpValue(t, csym[0]);
! x) r8 t6 f" J5 [5 q# \ t[1]=t[2];csym[0]=csym[1];csym[1]=0;" N2 y7 y" ?4 n) ^5 p# L8 F# a
}) H' [0 @: F1 u6 v$ }/ x8 V
nLevel = 1;5 ]0 c3 @8 f8 M- J# F. W
}% b9 N1 ~+ I+ o
else istrin.clear();
& @ s c9 Z3 S8 m }1 t4 ^/ R) @& ^: w$ v
else{nERR = -1; break;}! W( |) }$ i6 X4 R x. v7 w7 f1 Z
}
( I- o" S1 e G ?" ?8 j if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);1 K! [% q1 q8 F8 X0 f& v6 ^
else nReturn=GetExpValue(t, csym[0]);: } z. O6 K3 |) k
return nERR==-1?1:0;
' F. q) N* }2 A% @1 X+ {}}
6 b0 ]* z) J$ u( A% x, k1 B( }" z/ v/ L/ N2 E! ~
: n1 e: Q S+ S* b" b
3 _9 `4 f9 m2 U9 N9 z& x0 O3 G函数模板使用示例:
7 E2 w, p/ y2 a; {) }4 g在以上那段代码的后面加上以下代码:. x$ B5 r8 M- | J6 o
; U8 s% s0 ~/ N
9 }3 R) ?3 R* ~5 ?; K
5 I/ @2 A/ ?, {" x I程序代码: 0 y/ A" ^6 g! k7 Q' b; J/ \1 M. M/ m
: y1 s# V9 R2 h6 w, K#include<strstream>/ R5 l3 V- ?/ n" r. y L1 E
#include<iostream>; P" h. R# G4 V h) ]4 d" V
#include<string>. v; I' d9 b! M* {
using namespace std;
t( a% j2 m# I4 ] Q% I7 d( y. V* [int main(void)
4 e+ n" m; [& U+ `/ p( V, P6 \1 {: r{" r! n9 y/ ]3 u' u; \
string s1;& |2 ?4 a$ t$ v u
while(cin>>s1)0 K* Y2 x% r8 j
{: | T" G. x' B: A$ z! V
istrstream isin(s1.data());: \2 p: D; j* w! V
double d;1 H, R0 _% E2 {4 L `$ f9 B
if(fy_Exp::GetExpValue(isin, d))
' c6 i! q9 a* O7 q9 N {
6 Y+ `( Y# u, s0 u; M. X/ O cout<<d<<endl;2 W z5 r Y$ o% {: k+ O5 o
}& v# G1 a2 K' J
else
+ W7 I. y9 ~: S: E' I* u! _9 h7 t {; H) Y. T& ~: J4 B9 k4 {) y
cout<<"ERROR"<<endl;
7 o+ Q0 p o* y! K+ [; M }
) c+ F) }+ d. t' \ }
! m( h) `) C0 [& {3 H1 @; s return 0;! F& ^8 `8 }! ~
}" X1 n! d, t) z0 ?% p/ k, O
" \$ J; e5 K& l. H, s# s% _$ S% v( T8 Y, I m# Z
然后编译执行就可以了(*^_^*)) r* \) H- \5 j& B9 j I
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
+ N5 S8 H6 @1 U# L+ ^" x* W$ o 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|