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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,; m- v+ V* q& c
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
( v0 h, D, b& \) G只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 d# u: c& S0 N* u4 K参数解释:
; I: k) x7 ]4 C% N- ^9 ?istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
5 B' L+ r$ P* j( {+ G2 [nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定3 k8 M, w( }& q6 |* @& W; A
返回值:
5 V, X6 A, D3 ?3 T# g0 G返回非0表示计算成功,0表示计算失败有错误. m+ m- h+ E o
) L" Q6 r' S! F+ P
& F$ v) ?" {3 Z
8 l3 {+ d: _$ o程序代码: 6 A \( k* f, m; c$ @* [% L
( Y8 j: M4 U( U# V6 onamespace fy_Exp{# v3 j: ? P* I
namespace {template <class _T>
" T- F" f& Y$ F; X9 P- A2 |inline _T GetExpValue(_T t[], char& csym){
7 I! `: {3 n- U; Q" a char c=csym; csym=0;2 E4 c, B0 t) k
switch(c){! a: Z2 d" J$ H5 R8 d
case '+':return t[0] += t[1];/ {& R+ L6 \& R8 Y- V
case '-':return t[0] -= t[1];" j @' d$ G' Z& y( w! B1 M
case '*':return t[0] *= t[1];) e# I* M7 s' A$ N( R
default: return t[0] /= t[1];//case '/': t0 }$ z5 v2 N6 G2 g8 n3 ~6 m
}
! w( k$ z: {" \( |9 A3 R}}
: M* s0 K7 m& z9 f8 u! ctemplate <class _T, class _Tstream>; E* M8 c6 E/ {+ m2 J
/* _Tstream: inputstream, _T: get return value
) m% i4 R S3 Y* Return nonzero if get value successfully */
0 X( d/ i$ B) xint GetExpValue(_Tstream& istrin, _T& nReturn){
) G( M4 b( L# P1 ^( L. x/ g _T t[3] = {0}; //雨中飞燕之作6 E& j' t1 i! Q7 `" i. n
char csym[3] = "++";! Z y5 X: u/ m/ h/ a! F/ L$ S7 w8 N3 y
int nLevel = 1, nERR = 0;- p8 b2 A3 h4 M, ^: g
if(!(istrin>>t[1]))istrin.clear();
) E5 f' Q! Z/ e9 f+ | E/ y for(;;){% h" c& u6 b! f# F2 o4 E( p
if(istrin>>csym[2]){/ q& @) n, h' l: ^; [. n6 K. H* L
switch(csym[2]){8 a1 V h5 x' G9 v
case '(':
+ y9 r+ t/ h, z( y, t/ D if(!csym[1]){nLevel=0x100; nERR=1;}else
( h' S/ T, t' y( f if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ }2 {5 \1 F9 u" n: J else{nLevel=0x100; nERR=1;}
5 w, G. J: t8 d1 a break;6 L9 t6 r# Y s0 M) C
case ')':
$ k- a2 u2 j3 ] {nLevel = 0x100;}break;
6 d8 d% r2 p: W6 S) F8 { case '+':case '-':case '*':case '/':
, A, i1 R8 ^( ?* s5 m$ v {csym[nLevel++] = csym[2];}break;
0 E. v; u% ]; ~! E0 f+ t( b, p case ' ':case '\r':case '\n':case '\t':continue;
2 X& M% E. e6 O1 R, x/ u default:
$ H/ D4 l; v+ r$ q) ^5 i t {nLevel=0x100; nERR=1;}3 v; V8 `! d# I( c
}
3 d: N# q# Q C if(nLevel==0x100)break;6 y `/ w+ d ]
if(nLevel&0x10 || istrin>>t[2]){
& T/ y+ I+ ~" c; g+ S nLevel &= 0xF;8 T7 a' c' N# L" ^. x1 O2 }
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
2 o* G* O1 F" g7 C+ _- e& J$ y: k if(csym[1]=='*'||csym[1]=='/'){
1 A8 N) z P3 m GetExpValue(t+1, csym[1]);( v& F5 G+ }8 B3 H* {6 f7 p6 Z- w6 E
}: s x# \! U9 r9 i8 @0 S: r, i
else{0 v) I: k w, j' l
GetExpValue(t, csym[0]);
) R2 I) H- f6 G; k5 d t[1]=t[2];csym[0]=csym[1];csym[1]=0;
0 r' ?# D" `. s9 O }4 ~: u; d( D& G; }
nLevel = 1;
- b3 A+ P5 J8 h# B& Q y }
) P7 h" y( p3 ~* M- {. h0 ] else istrin.clear();7 q# x5 M) O0 E* Q2 m/ v, j
}1 U4 | Z2 `. {: f) P
else{nERR = -1; break;}* N8 F3 H) C2 N9 M+ d2 u. R
}
) W" j+ I4 g, \* d6 M if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
" }+ l1 [# O; t. r' R9 d$ ` else nReturn=GetExpValue(t, csym[0]);: T$ [3 T5 e8 d' b; [9 _7 g) }
return nERR==-1?1:0;( J; {6 O$ U0 Q! E% }6 q8 H, y
}}
5 T0 l7 f$ Z# v" W" X" @8 K- x; Z+ v
, M! i1 O, c1 k- n
( e2 S0 I7 a6 |# a# b9 {
函数模板使用示例:
# U2 w5 c9 @6 g( }4 P2 b在以上那段代码的后面加上以下代码:8 w7 S0 l! P/ n4 F8 Y2 I2 `5 o! p
$ `# |4 B$ p! R5 o3 Q
" w# e5 I# M3 ?5 j
" j' U, N6 M, m程序代码:
, X9 k5 d1 ?4 @
" B- c! v- k# C( V. a- x7 v8 ~3 t#include<strstream>- S7 n/ r* \- b4 C) ~+ M" ]
#include<iostream>5 X$ ~. y0 W9 Z% [$ I
#include<string>
5 z3 ^$ f0 ?* O: q* W5 u- ^using namespace std;0 Q+ l0 y l/ K0 ~* a) L6 Q: {
int main(void)
. J) @* [6 m+ ~) i9 m+ b/ q) N8 _- h{9 ^& v: M! A8 [! j; c) W
string s1;$ X% z5 A( A: |$ [! |
while(cin>>s1)
" C- @/ C' S } ?: U( ` {
" l" M. f# C4 ~: X* J% k# a) q' P istrstream isin(s1.data());5 r2 `1 X/ p7 z" \
double d;( [5 S6 R) P2 `" C" s
if(fy_Exp::GetExpValue(isin, d))$ b. C# L7 N& J# z
{
/ L# a7 C0 m8 P. e p4 S cout<<d<<endl;5 E( } I7 e( |2 ~/ x: T5 v) a
}
s9 y' J0 c. H else1 ~5 h7 \7 ?+ ]& q
{' z2 t3 A9 B0 d& i9 n4 d R7 s- R
cout<<"ERROR"<<endl;
2 {; d3 q: A9 A }
% H1 R7 _' ?! R- U3 V" t' |# ^4 ` }9 z/ v8 u) S: Z5 g/ u _
return 0;
4 G/ w9 F. B7 j' j6 J0 \}8 P4 P7 s% I: d1 K
6 S& T7 ?3 ?0 @$ Q. w: O4 X A0 ^! T; o" v( ~- Y! f
然后编译执行就可以了(*^_^*)
; ]0 F5 I. P% N Q, D: R/ h/ I其它:TC++上一定编译错误,不保证在VC6上也能通过编译
: N; Y6 r# }0 b7 J% n- } 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|