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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,6 e% A6 c. C% s2 D$ O2 n( ^; D
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' Y% k% n0 u* B8 E, g' w3 j* e2 \
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 W. [$ @1 ~. k6 C参数解释:# k, R5 T' [1 X u1 g5 m, {' p0 f
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
- r: f- _- K: Q% xnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
: C( Q% S, s. x+ }3 M7 c返回值:" E; p- p1 M9 `7 _$ W. l4 p" o
返回非0表示计算成功,0表示计算失败有错误
4 D) |; v2 K8 v9 \% x+ A. O
! \# U2 e; {; O $ B, A' e# y$ H1 i! i) r2 T
, r! U/ }( [1 G$ K, Q, a8 ?0 r
程序代码:
. t- G/ r' i; k: Z# d- o" L& I' h
namespace fy_Exp{, I: }0 q5 s% t- h! [ F
namespace {template <class _T>6 o; h/ R$ D$ \: t9 b y+ C
inline _T GetExpValue(_T t[], char& csym){) U( D7 a. w1 f3 b+ y
char c=csym; csym=0;
# B" n2 n* S" p8 L4 w; D. U* ? switch(c){7 B8 n, y j/ L
case '+':return t[0] += t[1];* F3 s/ G: a0 u, W
case '-':return t[0] -= t[1];
; j" f8 Q- s, d( [, ? case '*':return t[0] *= t[1];' E" x+ w. A. o: U# L! T! J
default: return t[0] /= t[1];//case '/':
4 B1 i1 s9 m2 ^. |3 F }
$ ?: o! A: p0 i$ d}}! @8 a5 ]2 {: {% s. y8 b
template <class _T, class _Tstream>- F7 j; \; f% `/ c8 c& g$ ]
/* _Tstream: inputstream, _T: get return value
2 w/ c1 i, \$ s9 _. P- h6 h* Return nonzero if get value successfully */
6 J9 F/ q7 D' N: X* C% W2 gint GetExpValue(_Tstream& istrin, _T& nReturn){2 Z* h1 C9 V1 \* V
_T t[3] = {0}; //雨中飞燕之作% `( e! N! D: D3 ?
char csym[3] = "++";
" i. f, I8 c& O% d3 h, b7 q int nLevel = 1, nERR = 0;4 _- ]) R1 F3 u+ N/ ^1 s' F
if(!(istrin>>t[1]))istrin.clear();1 [- @; Y; e1 v$ p
for(;;){9 t d: U9 i: l! W3 [
if(istrin>>csym[2]){
& D; h- Y% i, r. c2 v switch(csym[2]){
1 d: }1 W9 l+ v; m case '(':9 P) s: h: s& G/ B3 ?6 N% ~
if(!csym[1]){nLevel=0x100; nERR=1;}else- S/ [7 R9 x1 u2 x4 a$ k
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
- M* a& D. a4 B! a; G, v else{nLevel=0x100; nERR=1;}; } i. ]2 `7 y7 C3 X' n
break;
) U. b; W" y# w) f! U case ')':: R' D8 r4 H. R3 |5 P
{nLevel = 0x100;}break;
* R$ I% l7 N. M1 S$ o/ G, p: f4 c" ] case '+':case '-':case '*':case '/':" {5 ^- X" w8 F e
{csym[nLevel++] = csym[2];}break;
- J: @# z$ \2 C* r case ' ':case '\r':case '\n':case '\t':continue;7 q2 J4 a. P3 k$ h+ U
default:5 x9 }. z4 i5 a) o( b
{nLevel=0x100; nERR=1;}
5 R' c, q. L P0 p }
2 w Z9 V* [- h if(nLevel==0x100)break;2 g, h+ k3 V* o9 C+ U7 k0 {6 @2 ^
if(nLevel&0x10 || istrin>>t[2]){. U! A/ V& L; \. g! |
nLevel &= 0xF;! k) m1 Q' n0 f8 C/ }, N6 Y3 R
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
) ? |# N5 g; W( D* i6 t2 d S" ? if(csym[1]=='*'||csym[1]=='/'){% w) a8 _7 H" q, e( @
GetExpValue(t+1, csym[1]);) K# J' S+ ~& C M+ t! q) x* O1 q
}
3 d% T' \" I+ X: ?( V2 X6 @ else{, \9 j/ O' V- u9 I' D1 }
GetExpValue(t, csym[0]);
, A, `7 s9 M2 C s! w) p. v- n t[1]=t[2];csym[0]=csym[1];csym[1]=0;
Y$ Z; ^ }3 S8 k D }; ]! r% A$ r5 X: I& B0 T& y
nLevel = 1;
9 S$ \0 T* r4 `2 u$ S6 \0 z& F$ e }6 K3 g# S! T" t7 s/ x3 X! J
else istrin.clear();
5 P) ?8 _% [. Y' I7 } }, ?( B$ n( _# j" N( T ]4 }
else{nERR = -1; break;}5 F& ^0 X, |3 G
}
* H X/ J/ p) _* u! P: K if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
9 |: H3 z$ O+ x- b else nReturn=GetExpValue(t, csym[0]);
8 ?6 @, P; B- O" x return nERR==-1?1:0;
2 @0 ]+ j1 `( D}}2 i8 u- l, f; z v4 J! @
2 H9 |, c+ g1 D' l# K D' U @7 r9 V- t' `) w# e
& F. ?. ?& [/ k3 W$ c! G7 v
函数模板使用示例:
6 W& W/ T- { i. }( Z. U M5 W2 z在以上那段代码的后面加上以下代码:! A9 Q) k7 q2 [8 u! a! q
4 S( l( ~2 N/ R6 \ Q' s+ O0 W
3 p- X% g. n! D, i, F4 w6 I0 o4 K
e7 ~% K* r& A1 m. H0 P程序代码:
+ D' Y0 d- r3 Y( M4 T* F" ?( t4 l9 X7 I V& _( u; w9 [$ N
#include<strstream>
) X4 ^, C- @4 T* v#include<iostream>. `) X4 u$ O0 h4 h0 u+ [
#include<string>
4 J# s6 t( }4 T% n1 jusing namespace std;* l) E& [) y8 Z* h
int main(void)
- t/ h0 m7 R: M7 @" M2 K{4 r) E' D" M5 l6 W5 `( A9 t2 R
string s1;
) W j( `# `. Y7 Z while(cin>>s1)
% O& s' S' j& F* } {* X& Y) H* C% P
istrstream isin(s1.data());9 z- C! [' ^0 Y' g) |
double d;+ D9 [' w* o2 Q* ]7 P9 O: n
if(fy_Exp::GetExpValue(isin, d))0 e ]9 D/ @( h8 }2 p4 I2 O
{; @& r! |! S( m% l
cout<<d<<endl;
$ l5 G6 }( a2 G L/ ^7 x }' e' ]3 z H: U! h$ w
else
& ^8 z6 w/ F8 X {
1 n& e! e Q% C) T2 r cout<<"ERROR"<<endl;8 w! n. K; Y! v
}
% P( }# \- e& W! R7 y } p) h& a6 M. \$ e/ M; ^4 O
return 0;1 A/ Z3 f* n9 q) C
}& Q/ G# N$ Y E" W0 i. v
7 Q' n, P5 W: x! S9 y2 l
( ~8 Y1 w8 F" |; Z然后编译执行就可以了(*^_^*)/ S, H- K. g3 ]. H w3 m$ A
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
) L3 v% h" e* u 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|