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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,- O$ `' b$ [) _( C* b( Y
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式 l; \3 l0 X, F
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
9 b* N2 Y, i$ v% `7 [参数解释:
6 ^+ W1 Z, o5 ` e( @( \' l8 [% J+ Zistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
3 S% q! i" ?! L8 Y( `nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定7 o8 K7 i! |# M% K. w" M
返回值:
2 p; T/ x" z' P返回非0表示计算成功,0表示计算失败有错误* t! s& c8 M; _3 N
7 o7 q# H/ b- F6 h" _, ]
- Z' a/ |3 Y2 n0 y1 M
1 F+ M- _, p4 I1 A2 l& ^程序代码: ' P$ w: n S! A8 A5 V7 i
* Z7 V' U6 S$ y0 e
namespace fy_Exp{
* {# f" W. J B1 x* `0 Cnamespace {template <class _T>
; h3 o* l s1 b* R' uinline _T GetExpValue(_T t[], char& csym){
9 ~" W, E' ~& | char c=csym; csym=0;/ l7 D8 \3 o. [ z, D
switch(c){ J4 G. I7 M; p5 h# K4 W
case '+':return t[0] += t[1]; l" @4 ?: r$ O1 [; s" Z7 c
case '-':return t[0] -= t[1];4 [; D4 D8 O4 G5 |/ g: v* R- F ~
case '*':return t[0] *= t[1];3 e5 W; ?: i* w' _/ m* G! S7 ^! g
default: return t[0] /= t[1];//case '/':7 n V; z. h+ m
}
2 o' n! E8 v5 v6 _}}
, }/ K6 a9 |: U9 n) O, ~# ?" P Ttemplate <class _T, class _Tstream>1 j; E8 k3 v5 c: k) ^, F
/* _Tstream: inputstream, _T: get return value
. z# T6 F/ J' }, C% B* P* Return nonzero if get value successfully */* o' ?' d7 e4 u& k5 W1 _) A+ Q
int GetExpValue(_Tstream& istrin, _T& nReturn){1 n7 l0 j3 \% I
_T t[3] = {0}; //雨中飞燕之作" S) \1 W( y+ s
char csym[3] = "++";
' k. t. e% h7 ?5 G0 N8 } int nLevel = 1, nERR = 0;
2 |+ {5 v! {+ g if(!(istrin>>t[1]))istrin.clear();# X L) @6 w; \- ^8 g9 a
for(;;){
9 I4 u) F- k5 e if(istrin>>csym[2]){" ?& U5 C( E3 R- E+ h
switch(csym[2]){8 r) g# C# a7 t
case '(':9 s: h; ]" I7 H6 }8 M
if(!csym[1]){nLevel=0x100; nERR=1;}else
" e5 o! M9 H3 x- S) b: `! x if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- v' }' u: d! ?) Y: G+ ?" S/ d+ {
else{nLevel=0x100; nERR=1;}8 x6 r) o. _% v4 e
break;
9 I z w3 T! p3 I' m3 P- p case ')':, T) B/ n- Y) u9 f+ l
{nLevel = 0x100;}break;& z- g+ U( b3 i t" O5 m4 N- J P
case '+':case '-':case '*':case '/':
% g G/ C( @( ` {csym[nLevel++] = csym[2];}break;7 R7 B3 _. \: e( A9 V+ q
case ' ':case '\r':case '\n':case '\t':continue;
+ ]4 u; C% _" h; _" _( |* M default:. j/ b! J, C5 B- p0 d/ S
{nLevel=0x100; nERR=1;}( s$ p' i& |( L: o1 j# o
}
; v8 p' g2 P# ~. @* ]# e! U7 C3 u if(nLevel==0x100)break;
" g3 a+ b& z0 h3 }4 X3 h( i if(nLevel&0x10 || istrin>>t[2]){
0 u$ ~: P# ] u3 B$ _3 } nLevel &= 0xF;) D4 I6 z, W8 Y- c' Z
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
. H" J- v' e- j7 A ?5 G: Z8 g if(csym[1]=='*'||csym[1]=='/'){
" N& f4 R# Z: C- [ GetExpValue(t+1, csym[1]);5 M! o0 D- w) V- C' r% p3 N1 b( W
}
' u- u' z p" M8 k% N else{; y5 _, x7 P+ [. t0 d, @( x; w
GetExpValue(t, csym[0]);
; W5 t, o: ]* E6 H6 q1 ] t[1]=t[2];csym[0]=csym[1];csym[1]=0; [: `% y: k3 b( B
}
) o0 r0 [/ [( m% t6 D! Q/ T nLevel = 1;
D) A0 o5 W0 ~6 z8 g% j/ o }" r7 G; Q7 Q" [3 f
else istrin.clear();* x- H, [& @( L
}3 m9 l5 w* C8 G. C& |. T
else{nERR = -1; break;}3 ~( v# w4 _1 w/ m) P
}
. g; A2 o4 J @1 o7 W* P if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
7 L* g1 [8 A6 v else nReturn=GetExpValue(t, csym[0]);
/ \4 Z9 n4 \3 @. I return nERR==-1?1:0;
6 ?/ q5 e( C. J" N' i' P8 b& o}}" _3 ?+ R8 _( n _* B" \
$ R6 {. H( F q0 e1 f/ w2 v7 U
F: S V \3 h' d
, D# e+ B$ p" ]0 X2 ^/ Q函数模板使用示例:
- F4 }" l4 s( T; U在以上那段代码的后面加上以下代码:
4 a% s" K9 V+ X
% ?+ H% U( K- A0 H7 O6 `
* E0 @9 Z4 \* |) ~/ A. U/ D+ \ M! D+ _! @ w3 ^+ J# x
程序代码:
- f: m3 Y4 c6 A1 X% l
2 `/ C, ]& `1 s% H& ~4 A#include<strstream> s) W& [8 r; T$ z9 o" S
#include<iostream>
' N8 {* r$ C8 ^+ ]/ H& t/ ?#include<string>
2 }( i8 b3 ~( ?7 Xusing namespace std;
6 u% J7 d9 Q% V6 d* C3 U Zint main(void)
1 L! b5 c ^/ G) ^{$ X! K' V' x6 C2 v
string s1;' l3 z+ }% D% I6 Q/ u8 l b
while(cin>>s1)# ?2 ]8 k# M8 |( B/ D# U! s. m
{! q( R, s% {" h
istrstream isin(s1.data());
! B% e' a' w& E, h1 C6 O& | double d;6 K6 O I6 F, F: z9 _9 A/ c( d
if(fy_Exp::GetExpValue(isin, d))9 Q2 C; e* H0 E0 X# y$ b
{# I' R# b0 L% U' ~; y3 t" y( e% @2 t
cout<<d<<endl;
4 u. \$ G. p: {' h4 T }
! b" i; {" m* {% r* D/ e0 m8 [ else
! A4 k f& v$ {- f+ W {
4 \/ I0 t6 s1 _+ L/ i: e" p cout<<"ERROR"<<endl;
% z! f! ^+ }3 L }
$ k' h3 t! Y9 J, Z2 k }
7 w3 M2 T% M# ^0 P) N return 0;
- }& w2 j( Z# P" W7 J3 n+ ~ [}
3 r# i! M* P. g4 @( v$ ^
4 v1 h8 ~$ O+ G7 f; X' u2 V( J
% z; H6 h5 {) ~+ c, }然后编译执行就可以了(*^_^*)
+ V+ b) z( l2 u3 B7 h( v其它:TC++上一定编译错误,不保证在VC6上也能通过编译
2 j' A1 t& I8 Z 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|