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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,( I* W7 J9 J, g( }* Y8 a
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
8 r0 c+ ~7 d+ U! j! W7 b只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
- ~, _( r9 j, l: S) e7 C f参数解释:
; A* I. m6 L9 B4 t: h6 O+ |5 k; c0 Wistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
+ a% f- x# k$ B, u9 J9 z7 R4 ?nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定' z3 S& D7 h" D, H+ d2 }
返回值:1 ?1 T+ ], k7 Z3 o2 n F
返回非0表示计算成功,0表示计算失败有错误
9 j9 n; M* Y/ ~ e) r0 b
, i1 l" V! F- F" h1 O9 U: g; X* N & ?% u% k/ ?+ a6 e! O/ f" z
0 I4 G% a2 W( |% r# j
程序代码:
8 a) n4 L3 Y- v) `/ p
% Y# z& d: P% Znamespace fy_Exp{. H+ k+ w+ g( v0 J9 r
namespace {template <class _T>- D+ s8 O, ^& L+ g$ y
inline _T GetExpValue(_T t[], char& csym){
# E# o) O* |9 g7 C char c=csym; csym=0;# ]$ G$ B; U" ~; M
switch(c){, Q1 m7 L4 l/ Y6 D) ~
case '+':return t[0] += t[1];$ C% T& E/ l( }- @- f4 }: h' r
case '-':return t[0] -= t[1];5 ^6 q3 G6 ~" }/ J3 s
case '*':return t[0] *= t[1];
T) \0 Y! l* C. \ default: return t[0] /= t[1];//case '/':5 m+ x2 z+ W' r- l8 A! c
}7 c+ h* \5 `0 m% r
}}0 M5 v9 L1 H. S& t5 `8 |* }" ]
template <class _T, class _Tstream>
w6 h" q5 M& T6 O; S) y1 Y6 d/* _Tstream: inputstream, _T: get return value
* y9 I G. B% t0 m9 b* Return nonzero if get value successfully */
0 L% [* F) b1 e- E) Oint GetExpValue(_Tstream& istrin, _T& nReturn){
1 F9 K" A k2 y _T t[3] = {0}; //雨中飞燕之作
) ~2 U7 f- ]- J* O' G char csym[3] = "++";0 x4 a; ~" @- p% w' q F
int nLevel = 1, nERR = 0;
# L5 B1 C! @% a; I if(!(istrin>>t[1]))istrin.clear();. C. A* W& b. _
for(;;){0 w0 Q, X3 A# q, `
if(istrin>>csym[2]){
8 b( K5 ~, T4 Y3 E! G1 Y- Q6 e switch(csym[2]){5 C& |4 g q. \/ [5 |/ M8 L* M
case '(':
) u v$ k/ _7 y* o9 ?/ M if(!csym[1]){nLevel=0x100; nERR=1;}else6 a; f7 M7 X/ h0 E# B! X7 j
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
' w7 j. h' S/ D2 ~2 ~* `" w1 x else{nLevel=0x100; nERR=1;}
2 O' M% f# A+ v+ { break;
+ V, ~- P1 M" e case ')':1 n8 t2 ?' ~$ R5 k
{nLevel = 0x100;}break;/ j2 V8 W5 `! E8 C, l
case '+':case '-':case '*':case '/':
7 b- b$ H) E/ ^) ~7 t5 q {csym[nLevel++] = csym[2];}break;
* Z$ b4 A2 `6 u/ P case ' ':case '\r':case '\n':case '\t':continue;
9 p( k( f8 n0 k8 Y% a default:1 O. w# m+ o+ @1 u0 ~. `' d8 t
{nLevel=0x100; nERR=1;}2 t6 ]9 K: `, b' \. n
}7 D0 D+ K( ?3 u I# v
if(nLevel==0x100)break;
9 |7 C' M; `$ k( z* { if(nLevel&0x10 || istrin>>t[2]){* w' J& K: h2 B6 _ O7 A
nLevel &= 0xF;
$ {9 X$ e! @" y if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}( L! Z' r, Z7 {7 k( O" @: F
if(csym[1]=='*'||csym[1]=='/'){1 P/ V' j5 q: G! m
GetExpValue(t+1, csym[1]);6 B8 u/ _2 J O2 h
}9 ~- y6 ^- W3 m9 \* @% V
else{
# {. h- `; b" o; I GetExpValue(t, csym[0]);# a5 H+ Q I# v8 W
t[1]=t[2];csym[0]=csym[1];csym[1]=0;9 k, n5 c+ A. D8 i. D3 z$ j* j
}
$ G, I+ q3 a% _! A; S nLevel = 1;; S9 @( G5 n% m
}
2 Z3 M1 s1 j3 ]% | else istrin.clear();# ~# j7 p/ n) M% [# F
}
, Y+ m) w! t/ G- e6 @ else{nERR = -1; break;}
; z6 ?5 i" K R `9 G) Q* D }
: h( \8 r, m1 O% ]6 t% U/ M. q if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
) \ U: N6 g6 K9 R else nReturn=GetExpValue(t, csym[0]);
! b) G0 m; Q% w2 y6 @9 |4 B" N0 \ return nERR==-1?1:0;7 H' U8 H( e$ S% _0 H @ f8 H6 Q
}}
1 h, L9 H- k: p* j$ q) e3 n
6 T3 y' Z/ ]" J& i8 C$ K* X
% a* O& g% t2 x# [8 d' M
1 w6 t1 L- E) I5 X7 X. Z函数模板使用示例:8 v+ u& j6 N C, x' {$ [7 m
在以上那段代码的后面加上以下代码:
0 N( _/ ?* U& d1 P8 D/ O/ x6 W3 D2 q# M7 P
$ A l: ^' q0 Q9 n, ~) I
4 A9 O) `" W0 s* _$ L, I程序代码: & c9 Q- m9 B6 d
" a: d2 ]% A0 b, v4 u5 q
#include<strstream>* ~- x0 @0 l) R. q- k
#include<iostream>
8 O) g9 g- \. t, N5 e/ p: T#include<string>: ], E+ L9 E' ~" \ z9 u3 c3 Z
using namespace std;' m& ?6 J$ O' g0 R) r7 V; u
int main(void)
1 a9 ?5 F, }/ B: p& P% K- y- P{5 y$ t- X* b! C8 c7 i; R
string s1;' @' O% f) v& X' D8 U1 h3 _
while(cin>>s1)0 T* x1 D' Q- V1 |% x& a( h
{
v; ]$ b& J; O, T- ]' J* s istrstream isin(s1.data());
! Y7 Z& u8 I I, }& ^ double d;
& n# k: i0 R; D# u9 s if(fy_Exp::GetExpValue(isin, d))$ n2 ?. o/ [8 W# ^# T
{$ B& F4 A7 K2 f' i( K
cout<<d<<endl;$ \! y3 B n/ H0 ~5 x
}
1 k$ I9 Q1 t9 S4 L' h+ v4 { else
, y$ }$ v" j8 ^ ~ {' F+ S! i H: U6 O* \
cout<<"ERROR"<<endl;9 T' m3 g n$ Y- ~% U* g0 n
}& D3 T4 v) b5 s. ~9 ~# P. x% t
}1 m* S6 k) X) r2 O* [
return 0;5 G% N9 C+ ~) o8 v# h8 l
}
9 ]: d/ i; s$ g9 s) R( V. n4 U. Q5 |* ?9 L8 z
' H1 O m) v& @- u然后编译执行就可以了(*^_^*)
0 s( [) C- y* p+ Y6 I其它:TC++上一定编译错误,不保证在VC6上也能通过编译' }$ S' j3 {7 u0 @" T+ q% @) j
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|