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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
# w$ S! W4 o- K3 j6 w' W一个很方便的函数模板,可以并且只可以计算含括号的四则表达式8 M) s8 [. O: V$ y9 y- ?+ O% U) k
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
. {$ C: F: a h5 X* q$ Z) D参数解释:
9 i8 K0 {, O7 x c" i5 Uistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
. o: Q' V$ ^7 i' F! M. QnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
4 A8 N1 v0 e0 ~ J5 s0 v9 K返回值:
! C% F7 ~: E3 p% x返回非0表示计算成功,0表示计算失败有错误/ |/ @1 c2 l8 n2 M, ^6 V! i% c
$ g/ D5 r, s3 T" q
2 g& Q% o' B9 h
( {" Y6 T$ i( F$ t- [1 M$ O程序代码: & v3 J+ n. m7 B# @6 Z, U' k/ P
) Z' K2 h7 x: }$ ~. O5 R) tnamespace fy_Exp{2 B4 L$ S* S* s# {! e
namespace {template <class _T>
( W1 z- r% r9 ?& R( D7 vinline _T GetExpValue(_T t[], char& csym){
& Q2 k8 f6 r% z1 a. r char c=csym; csym=0;
4 z; v. s+ _4 X r switch(c){5 M- G# W( ~5 y( I! }) v9 s/ u
case '+':return t[0] += t[1];& z$ z0 G& B3 T3 B, b' {8 o9 I
case '-':return t[0] -= t[1];, t+ g6 z7 @, ^) D4 P; H
case '*':return t[0] *= t[1];
, B1 H. k; O; p# X; X default: return t[0] /= t[1];//case '/':) g) p( I0 T* _8 Z
}
' [7 ]! b' t B! P}}$ R1 h: {3 O6 H# X
template <class _T, class _Tstream>
' W. @1 H, P8 |* x/* _Tstream: inputstream, _T: get return value. q+ n2 I0 W, i
* Return nonzero if get value successfully */# _$ @ a8 L' g* \5 n& O3 K& H* C: X
int GetExpValue(_Tstream& istrin, _T& nReturn){2 [& t+ K% w6 K+ ?8 d$ g
_T t[3] = {0}; //雨中飞燕之作8 D, }9 J4 f I1 @" ^- e8 `
char csym[3] = "++";
1 r; E; o9 L2 U; k4 d int nLevel = 1, nERR = 0;
/ h2 x/ ]- B# P7 h if(!(istrin>>t[1]))istrin.clear();
0 }, i4 j$ d! r6 y# l1 Y for(;;){
8 }: ^' @: H8 _: P2 k/ h/ | if(istrin>>csym[2]){+ ~7 S9 c3 X/ Y8 @% K5 Y
switch(csym[2]){
7 H3 `3 P3 k7 u( w# p0 B; ? case '(':
0 B& a2 k5 k: C# p/ _. Y if(!csym[1]){nLevel=0x100; nERR=1;}else# U2 }8 p5 x) k: N
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
6 U% c8 ^ b1 z else{nLevel=0x100; nERR=1;}
* C+ z8 Y( W& i9 y break;
2 Q4 |& m3 g) G. T$ e' j/ l case ')':
0 k F( _0 l% ? {nLevel = 0x100;}break;" Y* e) L) |7 M) K' A/ u+ J, P$ _
case '+':case '-':case '*':case '/':
! U2 N/ d/ N% M6 m' P5 N5 F/ e {csym[nLevel++] = csym[2];}break;
/ o, ^7 B8 S$ s( ? case ' ':case '\r':case '\n':case '\t':continue;
+ X1 l+ ?% ~; y% t7 J( @ default:4 V1 |$ t' M$ I+ e. X
{nLevel=0x100; nERR=1;}0 L( E$ A4 l0 [2 ?
}
0 l& h% \7 d0 o7 L if(nLevel==0x100)break;
4 G( t1 n4 o" x0 M$ a2 Q if(nLevel&0x10 || istrin>>t[2]){2 i( o0 K2 |/ w, t5 s
nLevel &= 0xF;& v5 s5 [ O' l3 O) T: i& I
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
: X' H7 R! Z9 X$ n+ B* a1 f if(csym[1]=='*'||csym[1]=='/'){7 ?; E7 z: {7 K7 c7 \
GetExpValue(t+1, csym[1]);
0 D! }3 [ x! c7 Y: I9 f% v }; X$ [& J. g8 W% S. q
else{
% O' ]( y9 Q/ \) z, q4 w% t GetExpValue(t, csym[0]);. ~! `/ C: o$ m
t[1]=t[2];csym[0]=csym[1];csym[1]=0;$ d. q5 L) p* Y# }' R1 J$ ^
}* J/ `; R z) N; M; {5 c
nLevel = 1;
8 s6 l2 w! x# l$ E0 P' s7 S% W) e$ G }
& |4 u2 w) T. |- {4 w7 p* a else istrin.clear();3 H. r( w% b" u! l. t
}
+ q4 s }0 M9 p# t' s# m else{nERR = -1; break;}
+ N8 u" M8 y+ e( }3 g: {/ g }& B9 ~* I( N$ L x* n3 Z
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
+ z8 D' q6 }" u1 T9 r& ] else nReturn=GetExpValue(t, csym[0]);
( w2 v" b7 I- x+ v3 s return nERR==-1?1:0;& C8 u4 p3 y) u. q( F1 Q
}}& B: A% H; e. M' ^
+ A, ^$ B- D! i# T4 N7 H2 s4 M1 Q" N/ a: _, }
1 l* D+ K8 J* E
函数模板使用示例:: d: K) v/ b& t: m! l. |, o
在以上那段代码的后面加上以下代码: K7 }6 n/ X0 y( l
+ Y& S) _+ V3 E$ Y. B4 ]6 z
8 I$ o" L) ], t0 x3 v/ L
2 y, q& W5 `7 X1 {, c1 D# k" [程序代码:
8 y U5 y5 E x2 \4 h/ z7 Q6 O$ ~; `+ m3 u6 y3 R0 j
#include<strstream>+ n% c, @ O5 r0 c
#include<iostream>
! S' {: c% E- W4 {" k2 { m/ L#include<string>3 `& I) |3 X! K- k+ }3 Q4 W& d3 V
using namespace std;, R# r6 y' @, Y& p4 \# N
int main(void)
+ Y8 u! Q; v* C0 d2 y, b4 {{
- G# F) a/ q! r string s1;
, Y1 g8 s5 c. q! g0 T while(cin>>s1)
4 r! c+ k& I, n8 F8 P! @; T5 I' U {5 P8 M' L, Z( w9 C
istrstream isin(s1.data());; a1 s, U2 l! S* b" \. \$ r5 G
double d;' d [, q K3 O" g! r0 f
if(fy_Exp::GetExpValue(isin, d))/ O) Y: c& k) [
{
$ m$ a: w" R& ~$ ?( h) {" R cout<<d<<endl;
$ b" |& y: l% i }
4 f8 l b/ A9 |. [1 p# z6 Q, w else! G5 ^' ]/ p- y5 i- J. |. ^
{7 e& G" h w- `! X7 e# X! v" ~
cout<<"ERROR"<<endl;
) j1 y4 m" Q" o* p$ U }
7 ?) k- ?) `1 g3 d }6 _( g; s& o. t
return 0;) L, a( e' j+ T, C- [
}, q8 f [% n k3 M& L+ D$ C
% d- ^; p: r7 M' I
; v. E1 _2 S8 t然后编译执行就可以了(*^_^*)
h0 f( K1 e0 I0 ?; o其它:TC++上一定编译错误,不保证在VC6上也能通过编译
7 K' _: I! b* [! R9 y& k0 N 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|