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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,3 Y2 y% O0 ^# b! v6 ~2 R
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
, y* ?) `; ]- A只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
( Q7 H, x5 T# C4 t参数解释:
6 Y( T/ b( F; p6 V$ K1 G# uistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流! h. j) e( A# N3 w5 O) u, E. h) h
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
% h. _& _, v6 F. I3 v返回值:
5 ` Y ~- U( B+ {" {' T2 |返回非0表示计算成功,0表示计算失败有错误4 h( P1 A5 p2 k* u
' N7 l) G& R# P1 k, }
m: L, F7 f/ W( ?" Q6 a: n% R# }8 P I! l+ x" J" f
程序代码:
7 O; [, Y- W' M/ H7 x7 G* c2 e
( V" \, O* X6 {% ?/ k2 ?$ M4 q# bnamespace fy_Exp{! b) i3 k( }/ }6 x6 s; G* O
namespace {template <class _T>
4 M- t& z5 d% z6 P) u/ Ainline _T GetExpValue(_T t[], char& csym){
1 {+ I3 U. {4 N C9 I, F5 e char c=csym; csym=0;
4 q0 i: o/ c# w% t% ] switch(c){1 A; W7 r% _# _) m. {6 s
case '+':return t[0] += t[1];
+ S0 W# v* S, O; j case '-':return t[0] -= t[1];9 J) o s1 s- m5 b! D: K$ w% U
case '*':return t[0] *= t[1];
8 L% P" \1 f0 \- p' ]( J# B! ?3 u default: return t[0] /= t[1];//case '/':
" E g0 M2 p# J8 a$ ?! a8 X W }( b0 Z4 ?7 }( B( d
}}
) d" D; v: |" y* S# I; `5 b7 M etemplate <class _T, class _Tstream>. r" ^0 D! M' `6 }$ u$ \$ R1 U
/* _Tstream: inputstream, _T: get return value
) _* p4 u Z- x0 A: _+ U$ N* Return nonzero if get value successfully */1 o) @# f: O2 B3 n+ g. W
int GetExpValue(_Tstream& istrin, _T& nReturn){* ?1 K. y3 @( H, U7 K3 D+ ? \: W
_T t[3] = {0}; //雨中飞燕之作 ^# }2 }$ u3 N- Y" P7 z! O
char csym[3] = "++";
3 s6 C# w& I& l! e) |) e; d- P: |: U int nLevel = 1, nERR = 0;
@1 Y5 D/ l8 W1 `: H5 G& [/ H. f4 L if(!(istrin>>t[1]))istrin.clear();
7 E3 B) _% N4 `0 E( {5 i: N for(;;){- ?% T5 X( p1 ^' b
if(istrin>>csym[2]){/ K: }+ z# a0 ?" h. G+ @! X, k
switch(csym[2]){, \% i, O! J: p- ]1 S2 @$ T7 Z) G; A7 z
case '(':9 k" d& g) l7 f/ ~7 z! [
if(!csym[1]){nLevel=0x100; nERR=1;}else
' o- \2 V1 U" e1 a ^# U# \: K2 I if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
1 r" O& ]2 S0 S* W$ K7 K& n4 s2 E else{nLevel=0x100; nERR=1;}8 I, v% ]' W; b5 H+ i* F
break;2 _( m' ]' }# g9 z! v2 P5 ?; f- p
case ')':
$ Y) E# Z$ Z) t2 ?& @$ k: s {nLevel = 0x100;}break;
. q) [% X5 d! ]' @0 o case '+':case '-':case '*':case '/':
! A+ I5 ], o3 H6 w) L5 c* b6 Y {csym[nLevel++] = csym[2];}break;6 i" A- k3 ^# Q8 ~
case ' ':case '\r':case '\n':case '\t':continue;6 a; J3 s$ F6 F0 h$ ~* h% E6 Z; M
default:& B8 G( H9 Z) s
{nLevel=0x100; nERR=1;}
( |8 p6 c4 l7 M% i. d2 x7 z: w }5 c" m0 u0 A. D2 t% F, h
if(nLevel==0x100)break;8 m& C, C* m7 f/ N: T
if(nLevel&0x10 || istrin>>t[2]){. X1 n6 K2 c2 O A" Q
nLevel &= 0xF;
9 S1 J; y8 O, g+ f if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
Z7 `. A* p. J h if(csym[1]=='*'||csym[1]=='/'){
1 q. Z- N" ~& {! V4 ^ GetExpValue(t+1, csym[1]);# k7 C$ z2 `) \
}# B" c- w0 X4 m! u6 C0 I
else{
7 W/ C: a+ P* O1 j. M' Y GetExpValue(t, csym[0]);
. i" Q8 P. Y) T$ P9 f+ Z+ s+ | t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 C9 X' O9 k7 K, M7 Z- ?* J9 ?/ L
}! U0 q2 f4 E: ]/ D5 B ]2 x7 Z# s
nLevel = 1; P$ [$ v0 T0 b
}
/ ^* S4 R, g' S- h3 w: _: e! y else istrin.clear();2 ~, \8 [( l" ~- b; @. X
}) q% n: q9 Y/ C! [8 u+ q% [
else{nERR = -1; break;}
1 s3 }# h, o N6 m }' [2 n. G8 u% {5 [6 y8 n X3 W6 O
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
( { p7 U1 S6 B8 P* M4 Q' { else nReturn=GetExpValue(t, csym[0]);' X1 n4 c0 q$ l1 D. z( [6 v& G
return nERR==-1?1:0;0 O$ p6 v: E5 N+ A* I, [
}}
- }5 g6 i8 d% F8 _* U' W& ]; T6 U1 S: v1 S
! I1 O9 W G0 b% R0 _( N! h5 P! C
函数模板使用示例:- y+ _* q/ M% o4 n- n8 R
在以上那段代码的后面加上以下代码:
% D. N) ?2 ^; e/ X2 Y3 s- o
# r. v9 L9 S6 c$ }+ S+ n% V % F& a# S0 ~, Y
5 {, o* x/ @5 ^% c5 O' Q
程序代码:
/ K, T3 d+ c; I( k% k
+ U, o2 U0 j$ a/ J: R#include<strstream>
2 I5 s; l4 i/ a7 y/ t/ V#include<iostream>
1 h7 v1 K8 T$ @/ W#include<string>
I. v) c' T- a2 M: m9 |5 uusing namespace std;. a h5 o2 t% b+ N; M. X
int main(void)$ m% @0 V( T% |1 b3 `* d
{
/ s" x6 f4 n( u' ? string s1;
( i3 l7 y6 P0 G3 ^+ ] F while(cin>>s1)( T9 I# T' Q, o3 h
{3 }8 `/ i, ~3 a) Z$ Z) |$ I2 z
istrstream isin(s1.data());
) G& n* C7 }4 E3 e double d;
# q8 ~0 M1 ?) R: Y4 z+ n* D/ u4 r" y* p if(fy_Exp::GetExpValue(isin, d))
0 a3 e0 s& W6 [9 H- j2 v- V {7 x# P* | H+ _; x1 M
cout<<d<<endl;2 A3 w b n* z4 C" Z
}
1 i7 s% F' Z& K$ s8 t else
( A1 d' _+ e" Y2 P {1 Z# H& \3 H1 u! `8 u+ k& G
cout<<"ERROR"<<endl;
- M- [# w3 i. e }- x) q+ X* c. L& i; b
}. F/ y5 B, ?4 f6 ^" x* v* ?
return 0;+ z0 P5 X' S- {1 T$ M
}" F# f; \1 j- n& ]& g/ M1 p! g
2 N# P0 B2 z$ X ]
3 R0 w+ v: C8 N1 C: P8 M$ D" h& [+ S8 Z然后编译执行就可以了(*^_^*)# M/ m. s- J; m9 B6 t5 A) w
其它:TC++上一定编译错误,不保证在VC6上也能通过编译, a8 Z& w- _2 Z! ^
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|