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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
+ K* @0 C; @ B' S一个很方便的函数模板,可以并且只可以计算含括号的四则表达式 M5 p6 i; n8 I% E4 N8 C& N$ w a
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)* {9 r2 q Y- Q8 I
参数解释:' J* l1 [- C/ S+ _% p
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
2 p: I" Y8 s- E% |nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
0 k: B3 |8 A$ ^9 o$ U i返回值:0 x4 y4 ` o d+ I
返回非0表示计算成功,0表示计算失败有错误' t8 S b3 e+ T4 v; b8 Y
; i# \1 C' o# R# N& t0 R9 F
& A e9 {. k( f$ l0 [7 M8 y* Q0 S' s1 {+ r2 q* V; J
程序代码: & O6 o' V& E6 H! \
( n |" c2 z2 t4 Y* v: J+ Onamespace fy_Exp{
8 s3 c1 o2 n7 E7 i6 mnamespace {template <class _T>
" p% r# j; x9 x% u& j' u1 yinline _T GetExpValue(_T t[], char& csym){
' E2 ?0 R* B/ e- } char c=csym; csym=0;8 g$ [, ~/ `2 E! f
switch(c){) [% D; @! D: E8 d$ e+ m6 ?( C! G
case '+':return t[0] += t[1];
6 P( N, F- L& L case '-':return t[0] -= t[1];
( l: G$ h5 }6 e! T9 P case '*':return t[0] *= t[1];& E" l& V: f( L& ~$ L' Z9 S2 `$ c
default: return t[0] /= t[1];//case '/':
2 { x' Z- k& a: t0 r8 Z9 G. D& k }* B ]! q& L }, A9 L+ a9 F+ L
}}
+ _( f0 k1 {- `9 q# I1 N) ~template <class _T, class _Tstream>
4 K. T2 t5 O5 H, z+ c3 o/* _Tstream: inputstream, _T: get return value
: l& j- K4 v4 u4 ^, M7 T- s* Return nonzero if get value successfully */
' Y# {0 h' @! c9 i! Oint GetExpValue(_Tstream& istrin, _T& nReturn){
. a: V# K# B i! ~ _T t[3] = {0}; //雨中飞燕之作: s4 X4 p" M- F& \- N* \& c, C
char csym[3] = "++";
) v) g4 ]0 a4 N int nLevel = 1, nERR = 0;
- X: Z: K0 C' g$ S8 h) i0 Z if(!(istrin>>t[1]))istrin.clear();3 a& q0 Q6 ?) @' ]# k: J
for(;;){
! A' M7 S+ u' s( }5 q/ F( ^, d if(istrin>>csym[2]){
$ W; i5 ?* T9 i# [3 J switch(csym[2]){: n5 _. e8 @! R" G
case '(':
; E. v( e# I. A0 L if(!csym[1]){nLevel=0x100; nERR=1;}else* Q) H3 s. c* W% M* D/ m& ]
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
8 I; R, E# d g1 E. F/ \0 _$ w* P else{nLevel=0x100; nERR=1;}
0 f9 b* p+ F# b break;, {! B: Q! a2 v
case ')':+ h: Q5 l$ @2 ?% |8 l$ W l* i
{nLevel = 0x100;}break;# s; f! ]1 U+ ~% z9 b" B
case '+':case '-':case '*':case '/':
" l: N% Q' K% h$ N7 J {csym[nLevel++] = csym[2];}break;( u' G8 e U5 V5 M# _" L0 e. J+ t
case ' ':case '\r':case '\n':case '\t':continue;
- N: e0 ]7 H. V4 D, Z1 | default:9 Q" n+ V7 n9 |/ k8 R
{nLevel=0x100; nERR=1;}
' u' D7 r- W7 U A3 d% q3 w: V1 G }
9 c3 o0 H# c3 Q4 I( p0 k* Z5 \, r if(nLevel==0x100)break;6 [( I4 p: J* _
if(nLevel&0x10 || istrin>>t[2]){
8 p3 s6 F7 ]7 `) D3 E% f5 B nLevel &= 0xF;6 C. F2 f% _( @ `' b
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
' y# @5 a5 z8 W! a/ L% i if(csym[1]=='*'||csym[1]=='/'){0 r3 Q" y9 p2 Z: R5 A1 T
GetExpValue(t+1, csym[1]);6 n/ V- T6 ? @/ i
}- ]* O) w0 f" K# K7 C
else{
4 H: Q' y% `, T) I# o6 v9 S GetExpValue(t, csym[0]);
. M6 E) N" |* J; D Q/ H0 a% {/ F+ ? t[1]=t[2];csym[0]=csym[1];csym[1]=0;
q4 i/ X8 r& K5 [; S" o }
, g' }8 j% X' j# T9 B' f nLevel = 1;- Z7 t0 H, l' I
}
& G( \! L' W0 R- v" y4 q# i else istrin.clear();/ ~) N. ~ g7 D1 u
}# V$ o( K c' _& R$ W7 y
else{nERR = -1; break;}4 A8 q F( G% a6 K6 b! R1 d
}; }6 h& ?, x8 h) ?4 w$ h
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
% }9 ?& K. i. F' T4 K7 @ else nReturn=GetExpValue(t, csym[0]);
1 I: K2 h7 x' F4 D return nERR==-1?1:0;& @8 N* S2 ]' P# B& r6 J0 S
}}
' |$ ^2 c7 W6 ]0 ]6 w* R
* b. ?* U: _- ?, i: W
2 k: ?+ {0 W# h$ _* A. u; \; D* V* I# H, a) z0 T$ h, @. U, _
函数模板使用示例:4 a) @6 x: s: S: U3 A) k$ ]% f1 x
在以上那段代码的后面加上以下代码:/ ?+ c+ L' n8 a' q4 @0 v2 D) n: }
, i% `2 |; b; m7 [* N
8 R7 R! h9 u' s: `6 h
# s) I$ r9 `+ y& ]
程序代码: ' a( P7 ~9 N* {5 \
7 A5 W F1 D) q
#include<strstream>& m1 `. u. e' l% m/ ~7 q
#include<iostream>1 K5 A& v. V$ p7 ^. U% n i
#include<string>4 o5 X9 {- x& ?5 d9 r/ t
using namespace std;
) R; }7 K0 x; g1 T& f/ i6 Dint main(void)1 T) K8 P6 m. x% Z* y9 S
{
$ ` T# }4 C) c1 h! T+ g string s1;9 v1 u1 O0 d- u- L) p
while(cin>>s1)
5 l% J; j: z; \) B+ u; F {. {# a( @! W. G3 r! E
istrstream isin(s1.data());
, }+ \$ q4 h% i A8 O double d;* k @) z, |4 ? Z0 y/ p9 Y
if(fy_Exp::GetExpValue(isin, d))
8 L% J( T) t) S, E {3 Z4 H5 }( \9 k) A
cout<<d<<endl;$ n0 Z2 m& d9 {7 Q q) H8 U% W P- K4 G
}0 p) ]' C. ?. ]0 x& ^ x8 A
else& {4 Z0 r* l) w) W9 P
{
1 v: u, O" _9 M: H4 O& q cout<<"ERROR"<<endl;! H: @ |; J2 f9 x) q
}
6 B# f& F( U e' c }
3 b% X% [ J# e- p6 r8 q4 r# B8 x return 0;
2 w# }4 k. N; z; m}% c+ g3 J( w' M" i4 F! X6 ?/ b0 N
; h) P3 s9 ^0 l) T& {7 V$ w: Q x* |- k- V3 b. }* c5 I: j4 K
然后编译执行就可以了(*^_^*)
1 c1 I& ]3 h: e! p) W) |+ M; [其它:TC++上一定编译错误,不保证在VC6上也能通过编译7 S3 K; ~9 f& {! c' G- C
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|