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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
- n! y0 r/ y Y9 k3 P一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
" ~) [3 L+ C) B( p0 t只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 l- q2 I5 b0 f5 T- Z参数解释:7 A+ k. S- k3 K) n4 F. X
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流6 H9 d' Z1 x2 |8 P9 h5 I$ b8 b8 o
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" n6 r/ U" c6 l2 X
返回值:4 d2 Y, ]+ l* M& `( L+ H, z
返回非0表示计算成功,0表示计算失败有错误
2 m2 ]: v5 L6 b7 {
' }5 K- Y! R' n' x6 l9 W4 H
% W' [! |, `7 Q8 u2 f# |( }: G! b, R8 a& Y- g2 r
程序代码: 8 s" j; \" J- ]2 }" g" w- E1 f
/ `- M( ` r# Z* ynamespace fy_Exp{, p4 G! Q) a: T+ Z) U* h' C' E
namespace {template <class _T>
; b& c q) R- G/ l% X/ D' Qinline _T GetExpValue(_T t[], char& csym){+ `9 i9 d' e2 q, d% H
char c=csym; csym=0;
d5 z! x( n: U% L3 f4 T switch(c){) C& a, r6 i$ S( l0 {& q: ]
case '+':return t[0] += t[1];
( K5 E! C3 P6 H! y7 [9 N: T case '-':return t[0] -= t[1];
* ^' x. ]& o2 W5 }8 ] case '*':return t[0] *= t[1];
) i l/ |# |7 Z2 K: l7 } default: return t[0] /= t[1];//case '/':
# t+ K6 U; P* V# l8 u }
' W) D! u/ e9 r! ?% q: P}}3 h! i h# W4 S" O6 ?+ t
template <class _T, class _Tstream>3 N7 a. w2 v* T& B1 |; t& G
/* _Tstream: inputstream, _T: get return value
, Z( ~8 L3 q/ b. Y6 E* Return nonzero if get value successfully */; B; u7 W& W: ~: ^) h
int GetExpValue(_Tstream& istrin, _T& nReturn){" n" a# [9 ^) n$ Y" X# _
_T t[3] = {0}; //雨中飞燕之作
* A8 _- j6 a) d$ f: c; o# A! @& v char csym[3] = "++";
0 d* z* p. d, |" m4 x0 e/ T1 Q% }9 E int nLevel = 1, nERR = 0;7 `5 N; F& E$ T" `, u$ g
if(!(istrin>>t[1]))istrin.clear();$ P' S* p) P' i( L
for(;;){
+ h5 i* q5 N, v- T2 M( a7 P if(istrin>>csym[2]){/ i/ k8 Y* B, _' g. d
switch(csym[2]){$ \ |3 Y4 k- j, B: N
case '(':: n g, S: w+ y# @3 U9 d
if(!csym[1]){nLevel=0x100; nERR=1;}else9 v }0 Z3 z0 P2 \ ` @* q. b
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
; }: v$ A/ o+ T, M' Y5 f$ C( G else{nLevel=0x100; nERR=1;}
. }( C' E# W1 t9 v* E0 ` break;
8 S; K, v a B. @2 E* k" }1 O& S case ')':
/ N& B6 |( s0 I! ]. A9 R1 p. R {nLevel = 0x100;}break;: j2 U0 M1 K% d' x
case '+':case '-':case '*':case '/':
2 h5 N. X& r( R; v {csym[nLevel++] = csym[2];}break;% q9 N+ p" T* P
case ' ':case '\r':case '\n':case '\t':continue;
6 R7 j6 q( p2 S default:8 H/ P3 Q1 b. r( ~/ N
{nLevel=0x100; nERR=1;}0 L0 k' Q1 [3 ]$ z0 C! \) Y9 {" m
}
$ h8 I* B/ b9 R- f* T6 R if(nLevel==0x100)break;
, @9 \4 C6 h- r9 I; y# J' o/ F if(nLevel&0x10 || istrin>>t[2]){
( h" N0 ?2 |6 T! }% ? nLevel &= 0xF;
# y4 Q3 V5 k0 [+ N- X if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}3 n o# U0 p+ n+ v7 P& a5 O
if(csym[1]=='*'||csym[1]=='/'){
, s7 g' i# X9 O: }4 X4 J GetExpValue(t+1, csym[1]);& l; R8 {. f( Q% @, A/ Z
}
# `; [/ @" B, `+ f, _- f else{
. l! O7 n7 M# E6 U2 k GetExpValue(t, csym[0]);% |- \$ g$ V5 H. a* g
t[1]=t[2];csym[0]=csym[1];csym[1]=0;+ v1 N2 b2 U" E7 O
}/ f1 _5 |) G9 [( `0 O/ ~
nLevel = 1;
4 T- k5 P/ E7 [; { }
+ P2 a# G; {; l2 T4 A/ I1 k3 v else istrin.clear();. O- o1 D7 h1 {6 @6 d' u+ Y( n5 Q
}
' O1 d3 p. S2 f else{nERR = -1; break;}
9 [3 }5 q% k) J2 S& C# m }
, C; f# ?/ U" D if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
$ Y& V* v, v4 _ ?( _ else nReturn=GetExpValue(t, csym[0]);( b% d: n6 v# q. j) W5 N/ P R8 }
return nERR==-1?1:0;2 {- x' i6 z& p- H6 i9 f: M* S- Z
}}
# m) d0 U- K/ i* @3 W) x
8 b$ p5 c# ]# m( P6 l- O, J9 y- ^4 R2 v- P
9 }* r& D# {% i9 E1 j* Z$ \9 x
函数模板使用示例:; q, M3 A6 _, k) [) g; e
在以上那段代码的后面加上以下代码:
% X8 S+ {" X2 H. j# N5 n2 j( o, L/ k1 }/ X
5 R1 t: \( f- [! O% W4 P6 {
' n5 u9 {/ x0 ]" i# g) U程序代码:
; ~3 w7 T6 L! K2 Q2 q! W
4 T/ m* j' T; W5 v) R' a$ |#include<strstream> F) S5 f% q, ~, o) i, |5 {2 _ u, }
#include<iostream>5 s7 w" @7 `2 [4 I0 u
#include<string>
, w" K$ H* ?2 `6 |3 Z$ r" V k0 b! susing namespace std;
. I$ N" Z$ s) ?# gint main(void)
f6 z" E( w% F- K4 k, p+ B$ }6 m{: ]! ^8 P5 u; d( R- A; ^
string s1;$ q- s8 a9 t8 h3 L4 K% B
while(cin>>s1)0 t; O* A7 X8 F5 L& q
{! f0 K# L1 m# c4 p/ D9 | b: E
istrstream isin(s1.data());
. c1 l8 x0 L0 t% H8 m! z4 H( e double d;% o2 z* C' j$ e, o- x
if(fy_Exp::GetExpValue(isin, d))7 O4 p! c+ P2 E% v
{, ?7 G0 Z' ~9 x# b- _1 r
cout<<d<<endl;; j" ~2 W: E2 C! x) N9 T) o
}
; Q1 R+ k$ W+ ^9 i. r else) h( G0 Y$ ^1 _/ e+ s7 O8 }
{
/ [6 M% Z( N: I( b+ U( [3 d cout<<"ERROR"<<endl;
! \, f1 P/ ?+ b }6 O K9 b p' y3 X G# y! F
}' x8 [( `) g2 k9 w4 X
return 0;2 y) t, @. N: }" V, f
}& U8 k- N9 C3 a$ }) r/ S! p$ M
# n, d" i. _7 T G& J, L
6 F t/ u" m7 K1 O+ _
然后编译执行就可以了(*^_^*)1 N9 P3 M" Q$ G# L* z3 a& B& \1 A. D
其它:TC++上一定编译错误,不保证在VC6上也能通过编译3 } ?) Q1 {# P$ Q( E
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|