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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,3 T% M- @9 x' t* b+ @ s
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式2 G: u5 z2 P( f5 `5 ~( H9 U
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
, V' P' P/ _3 _1 e参数解释:
+ Z! e, e% Y& kistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
' U2 P# T% s% B p1 AnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定2 X% v/ a; g0 x: C' V6 h3 W! t0 n
返回值:
% I {& S$ y) J! ~" C3 v! \" N返回非0表示计算成功,0表示计算失败有错误
3 M# i- A# M3 f2 L f! _
# |. f4 ]) T# i$ Y # H5 d- G( O2 E3 p6 |* p* {
4 i/ e. @/ G- b1 }程序代码:
8 { P9 @! ?0 F+ ?" k* ]! I5 P1 f0 w: G2 i& w1 J& _5 c
namespace fy_Exp{, _: N7 j- D+ f; N3 R4 C! s
namespace {template <class _T>4 L- d) ?: V0 Z4 p4 ?& D7 }# w
inline _T GetExpValue(_T t[], char& csym){+ M& A1 u4 B, a* j( w& k: Y2 c
char c=csym; csym=0;
& Y, K" S" H2 H0 E" E switch(c){ z% p7 G) y8 ~$ ~6 O \! w7 z
case '+':return t[0] += t[1];
3 l) y0 F/ B% E3 s4 Y. s. w case '-':return t[0] -= t[1];! l8 I% w- V) R" S* ~/ l
case '*':return t[0] *= t[1];" }5 d, o6 T/ J
default: return t[0] /= t[1];//case '/':
7 D8 }7 w# c0 Q! |0 G5 S5 f1 d5 g }5 i$ [4 W9 v1 `8 v4 H
}}
! l' `0 Y7 |- v0 [: m$ Btemplate <class _T, class _Tstream>6 [( V1 `5 s3 j, ~ M# n5 v
/* _Tstream: inputstream, _T: get return value' b. [5 @, V& L
* Return nonzero if get value successfully */
$ E& O4 H9 u* tint GetExpValue(_Tstream& istrin, _T& nReturn){
9 q: h! s; B" ]7 b0 D _T t[3] = {0}; //雨中飞燕之作- u9 ?4 R% r: d" F/ }
char csym[3] = "++";
$ H, C5 @- q( n% | int nLevel = 1, nERR = 0;7 `6 t J+ t+ y. t0 {
if(!(istrin>>t[1]))istrin.clear();
2 G" {8 F; D# B for(;;){' H4 y( H- ^ U/ S# h7 O! d4 `" l) S* a
if(istrin>>csym[2]){
( Y& P. ]" w9 T5 A switch(csym[2]){
; B7 l! a# T7 Z! f0 H* s( Z case '(':+ j/ p2 A9 S; D1 y
if(!csym[1]){nLevel=0x100; nERR=1;}else! Q2 {3 ^# {# W5 x; f4 @4 c4 I
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
5 A5 M6 G8 d& B8 [0 {6 j8 a else{nLevel=0x100; nERR=1;}
# }" J( A O0 l) e8 ]1 t: O break;6 Z. A, E. e4 @$ B7 d
case ')':
0 x# o! a" q7 a1 W {nLevel = 0x100;}break;# Q' E6 I' v2 @: _: j
case '+':case '-':case '*':case '/':4 c4 _& I3 f+ Q' \* @
{csym[nLevel++] = csym[2];}break;
! s7 u, M1 F. ^6 P" V case ' ':case '\r':case '\n':case '\t':continue;
' l, N5 u( ]9 H4 q" n% Y6 i default:
8 G8 N* S$ h( c; Q+ q {nLevel=0x100; nERR=1;}; p$ X* \5 b3 f" k* P% z1 n
}6 @* ?% Q" T. \# X
if(nLevel==0x100)break;' |7 G% E4 P) Y& A/ a6 H- n9 q
if(nLevel&0x10 || istrin>>t[2]){9 {. f W' {$ W \3 d
nLevel &= 0xF;. _7 I1 f3 Y9 y
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}9 x$ t7 a! k: J3 U8 _1 ?
if(csym[1]=='*'||csym[1]=='/'){# v' V6 ?9 [# H7 E
GetExpValue(t+1, csym[1]);
# T; _& s1 S- J7 Q8 F } I0 f1 J' Y4 |2 W8 F9 ~. K
else{' u% j! a( E9 @1 }
GetExpValue(t, csym[0]);
8 _- _( T0 \* n& S$ t t[1]=t[2];csym[0]=csym[1];csym[1]=0;
' q8 I+ w I+ P }
' e8 e1 }' L/ g( c1 _; V( p nLevel = 1;
# e( Z% Q) L$ \$ U0 e4 M# H* c) C }
" U, D) i4 t& X2 ]9 e1 ? else istrin.clear();# }1 u# }" h5 Z7 q
}8 I0 o# B: a9 a
else{nERR = -1; break;}
5 |- x1 U: P% o0 G/ s' @ }3 i/ k& Q2 G" M5 p3 ? Z
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);' |1 `: n. x8 c4 q/ T6 z8 g
else nReturn=GetExpValue(t, csym[0]);4 z% ? x0 T) k
return nERR==-1?1:0;
6 s k/ X( E, q$ G. N$ p7 K}}1 q! l8 |% r# m2 G( I/ Y8 e
S7 M8 w+ q$ Y5 G( i$ |6 _; x
1 l# @* t; Q; z+ @4 f
7 \2 B/ V6 m( D3 ]" c函数模板使用示例:
. s* b& R5 X5 ~) {& |在以上那段代码的后面加上以下代码:2 W. ` R3 F. ^( E$ {5 v
5 u: B# H* n0 k# B) m; W% \( e7 n
5 H- b/ c9 O$ e' u8 W6 H" I& Z V$ J! A
程序代码: `1 h# j( z' z% K
$ R0 y J& Z8 J$ ?. A; I* `( d5 _
#include<strstream>6 m1 j" p. ?* S9 M! [2 R
#include<iostream>
8 P( }( j8 }4 ~) x: x, y/ H#include<string>
; p9 J" B, }( l. ~: h+ l3 Nusing namespace std;
6 o. S" ]- o1 \% F2 \/ r, ], Q1 `% Wint main(void)" |" ~" M9 E; D9 k
{2 A$ F. u1 w. ]$ G2 i
string s1;: [1 i/ `4 ^ ?
while(cin>>s1)' i/ u' t8 B _4 v( p$ D
{8 \' d: d: T) c. _) J' _ u
istrstream isin(s1.data());
2 v9 K: T0 | w! o1 B2 g" j8 w1 j double d;
Z W9 w5 Z& r6 P/ p8 ^ if(fy_Exp::GetExpValue(isin, d))
' z3 Q& V' n% S+ d- } {- X" e2 M; T2 j v% S" y8 n
cout<<d<<endl;
" R2 B2 @2 |6 a7 a' i/ k }
) `. `. ]1 [) Y3 g: d$ ^: z: v else( c- H+ ]! t) f4 D- k/ b
{4 ?% {8 u4 T) t7 I F5 s
cout<<"ERROR"<<endl;( a5 L7 j) o1 L- l$ U7 a Q
}
- c# y; k1 g' c, d- _, s- d- ?$ ] }% j8 o1 }+ ~( k" a% _
return 0;
4 R/ \' n+ k% l, |" k! g* w& P}, L9 f9 E( J; c: M0 @3 Y* ~1 B% K
* l4 D0 c& v/ H+ ~
' _! p8 _7 v4 Z然后编译执行就可以了(*^_^*)8 M4 P5 O- m4 s# k
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
r/ h' x. _( t. _$ p& o) x: n 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|