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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
2 Q8 O! h4 f6 h+ O% B3 N( I. {$ C一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
, @, k! r2 s5 P( C/ O8 J只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)' m7 x& Y h8 h" \# e- t0 I
参数解释:
' s& A1 l# n) \2 ^% R: vistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流; A6 Q1 h3 S9 S- j
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
0 g# e4 F; ^$ o. F$ O' `返回值:
& W9 r2 a* \1 q返回非0表示计算成功,0表示计算失败有错误
! _. c) R5 D, F. G% F, P1 ~
& r( T3 |9 L( A$ u* ^$ {* j6 }; S % F. a+ E j1 B8 Q
1 U5 O! ?( U% z1 P
程序代码: , f5 u: h/ G# z8 l
# A+ e0 M0 t$ L6 s" D# i% W: t
namespace fy_Exp{
/ n+ v+ ^6 j. Y2 R$ @% fnamespace {template <class _T>
, s8 _4 d! H! ?; X* ^+ Y ^6 P( v) jinline _T GetExpValue(_T t[], char& csym){1 p& U, J9 V5 x# b( h7 w
char c=csym; csym=0;, }1 I+ i" P8 P% e; v5 F9 T
switch(c){) I& | T& E' y; k
case '+':return t[0] += t[1];5 d" [- c5 E! d8 k& C$ ^
case '-':return t[0] -= t[1];! N0 A& v* y& V7 y% K ?8 k
case '*':return t[0] *= t[1];
/ D% N$ F3 u _3 ]5 k2 \2 u default: return t[0] /= t[1];//case '/':
; z0 | R/ J/ T. S9 f }
9 E! @( T2 O# A5 W$ |6 ?}}
# i8 r& A2 p6 @, Ctemplate <class _T, class _Tstream>1 ~* \) Z0 z- f h- j
/* _Tstream: inputstream, _T: get return value6 \* y# T- ]% M' y
* Return nonzero if get value successfully */
# C) c. B1 A& Y; [6 k. w" \# xint GetExpValue(_Tstream& istrin, _T& nReturn){
; w0 @ M: } Z+ K# z& g" u _T t[3] = {0}; //雨中飞燕之作2 b* j( c" M, ^
char csym[3] = "++";7 C) Z5 d* N! i8 Q# d F/ ?
int nLevel = 1, nERR = 0;
, i( n" ]2 n" X! ]1 I if(!(istrin>>t[1]))istrin.clear();
5 d, x3 y( q$ E" ^) d8 c' I! _+ c for(;;){& ~! S4 G- f E' ~& k. F( e, L
if(istrin>>csym[2]){
6 R7 x R0 u7 Z switch(csym[2]){' m- i9 g: M. l/ G1 W5 k
case '(':) [% B" x6 b' H9 u5 s& G/ z
if(!csym[1]){nLevel=0x100; nERR=1;}else
# x U4 _, [- d8 }4 u' o if(!GetExpValue(istrin, t[2]))nLevel|=0x10;- t, J6 K, p8 c7 j
else{nLevel=0x100; nERR=1;}. a& Z" {7 U9 q, h
break;
: X; r/ _' k8 _0 b8 Y5 W: b% E) k case ')':
; z* X- Q" Z& x) Q {nLevel = 0x100;}break;
* p: B; h |6 ~$ g& l case '+':case '-':case '*':case '/':
6 B. ]7 `4 L8 D8 `' K {csym[nLevel++] = csym[2];}break;
8 Z. h& K0 g5 H L6 L: a5 A6 l case ' ':case '\r':case '\n':case '\t':continue;
6 }# H4 I! t6 t7 Q& I8 s1 A8 f default:0 w1 |( _' c9 S
{nLevel=0x100; nERR=1;}
, P2 N! J R U5 x7 I }
" c& X* ^& H6 J! Y# H' H" T+ D if(nLevel==0x100)break;
# D! P f8 f' A- z5 [1 ^! C! \. D if(nLevel&0x10 || istrin>>t[2]){
8 T0 a. a z: |8 m5 c nLevel &= 0xF;3 R2 {! t8 g* l2 S% c
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
* T- E: K! i; [( G if(csym[1]=='*'||csym[1]=='/'){
3 l# ]# h0 l$ S% A" x# y GetExpValue(t+1, csym[1]);
5 x" o9 E* @( P! y G. \* b! c* m3 u }; H% j9 q0 `) ?8 I( s
else{
' ^9 r: X' m( K3 z( u GetExpValue(t, csym[0]);
! p. R: U& x4 R/ _# x7 h: ^7 J0 E* [ t[1]=t[2];csym[0]=csym[1];csym[1]=0;
1 {8 [, M# ^0 H9 E5 i }
: [* R' Y3 M' e+ U! r nLevel = 1;
5 K v& P+ b ? }6 h5 d1 d5 Z/ e! B
else istrin.clear();
, U& N, _$ \: F; f }
$ _; N- m4 e: V, t1 { else{nERR = -1; break;}$ y X8 p. i* Q; P/ u" S8 K
}
0 c5 \/ v: m% @: v7 t( e7 c if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
8 R& L2 _* H/ \2 w9 h! p else nReturn=GetExpValue(t, csym[0]);4 p6 ?6 M/ B! {# B1 ?
return nERR==-1?1:0;9 W# H3 U C6 c: t8 b
}}/ N/ M8 T& V/ b7 ]. H% I; S, N+ r
$ y# R! B% {8 D
" a. o5 C! J2 V" V
6 _* K9 ^5 F7 k' F; j7 n [函数模板使用示例:/ y+ b' c0 g1 b) w% E, R+ Z
在以上那段代码的后面加上以下代码:- v: l1 p6 C! i9 f( ]
% |: [ k0 b2 j 5 U7 J# o' c. B, N
1 m S9 q: F, I1 j, [, x& ]6 \
程序代码: 3 L( Q/ T1 U- h" L3 N
8 n: K& H4 ?0 _! q! p. p
#include<strstream>
4 V% f q; I0 f, `1 y, P#include<iostream>, a) K1 A. l0 n0 |, m
#include<string>
/ f) S7 U/ s4 G# f; xusing namespace std;
& W4 E0 u7 |$ J7 @0 xint main(void)! Y7 p; a9 C% _; l- p- r
{
, {; [0 @5 D% f8 B% [ string s1;- A% c9 Q; @* R" V) I+ m) y
while(cin>>s1)
2 h$ |* a% p& G9 v0 z4 N* ] {
9 R: n$ Z& A! E istrstream isin(s1.data());6 D6 Y6 S9 I6 _5 Q- }5 H O4 F% n
double d;& P, j- B1 h0 ]7 N+ @
if(fy_Exp::GetExpValue(isin, d))
* `! D) H @3 F+ s" I7 ?# P7 H {8 u$ w) C8 Y. R
cout<<d<<endl;
7 |( U8 g6 f8 p& ^6 H }
( U& _: E# Q8 ~ else/ A/ S/ ? F, a8 Z
{
8 ~9 b; D& {+ n: h& j cout<<"ERROR"<<endl;$ F o. Q+ }, C; ^5 a* [8 O2 W
}% }5 e6 S$ C9 w, f
}
* W/ z/ s# i$ { W return 0;
, _/ X" D. N' @. N9 h: N2 {}; T$ b; Q3 b o2 O, s
! _/ E9 j& O, b0 W' A
4 z f9 Y6 b7 T+ B& P然后编译执行就可以了(*^_^*)
) ~1 w7 k/ D$ d: |) p其它:TC++上一定编译错误,不保证在VC6上也能通过编译- Y1 v6 C# f! Y6 N
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|