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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
V1 z% d3 W0 E8 f' `一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
8 Z0 j; ]; Y1 p9 P, L; i" q只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
/ l" O8 Q8 J$ _/ P& q* U参数解释:) H: l9 w* @' V ]6 n
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流# ]% `. X& z. x0 C% t
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
0 |2 S q$ W- ^% ~返回值:3 h9 Q* Z( \. w5 o8 V; E
返回非0表示计算成功,0表示计算失败有错误
! B2 e5 B ~$ n9 O2 \3 K' x9 G w: c$ S* N
, r$ d: D1 Z, q) G" T5 ~
: C4 f6 L& F8 Q# M# e. l程序代码:
7 |: F' f3 G& Y
- W- r* i1 d. E; ^" v5 Znamespace fy_Exp{8 l" g1 |6 l% J/ Z. h5 P, b
namespace {template <class _T>
6 l5 r g2 b# G7 V: |9 Ninline _T GetExpValue(_T t[], char& csym){
, q# d2 @! u! v( [0 | char c=csym; csym=0;
1 r, p) z. q. | switch(c){; B! n5 h0 R: r( |) k5 X" g
case '+':return t[0] += t[1];
$ ~4 a# ]4 v/ Q: T; [ case '-':return t[0] -= t[1];' D, p% A7 _$ |- \3 E e
case '*':return t[0] *= t[1];
. w' Q5 {4 N$ v1 |+ V. n" r8 p default: return t[0] /= t[1];//case '/':
' p* A8 \1 Y" {3 C }: Y2 _& }1 W8 [# u
}}0 L! X& U+ X* B5 _: s
template <class _T, class _Tstream>2 ?- k. g$ R, e
/* _Tstream: inputstream, _T: get return value0 U( W8 k! i9 M5 \- ?* Y: C
* Return nonzero if get value successfully */
' s9 [; K! n# n9 \9 Vint GetExpValue(_Tstream& istrin, _T& nReturn){
. M# R9 [7 }* x. s( y3 T _T t[3] = {0}; //雨中飞燕之作
) V* m+ [$ n" Z5 q- x. e char csym[3] = "++";" ?5 c, ], \# f, `2 r( R) S
int nLevel = 1, nERR = 0;
( F' t* M. Y( X3 n if(!(istrin>>t[1]))istrin.clear();, Z/ j& ]# f4 ]$ U# Y5 i
for(;;){3 Z/ p/ m* n8 H' m
if(istrin>>csym[2]){2 |, e: L9 M# |. O. c8 o. f
switch(csym[2]){
4 N! c: J* x, u; {+ x$ r case '(':3 R8 G8 R9 _, w, ~+ L* v
if(!csym[1]){nLevel=0x100; nERR=1;}else
+ N1 d6 N, b$ h, Z" G if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
0 O( H3 \+ ^6 D, Y( W else{nLevel=0x100; nERR=1;}. I8 X, R4 \2 N4 f/ j# t
break;
- X' {" ?. Y' `" j) X* O5 E2 {. Q$ v case ')':0 x% R% x, D& `' B" J$ f) c' u
{nLevel = 0x100;}break;% H. J1 U" l5 R* ~/ P% h
case '+':case '-':case '*':case '/':
5 L0 Q9 C; d/ I) A% t/ F0 _! ] {csym[nLevel++] = csym[2];}break;# D, a1 g3 u# X( Q2 G- I
case ' ':case '\r':case '\n':case '\t':continue;, N/ s' D) }! |9 I7 d
default:
B# R& {/ e8 \2 q& K! e. k {nLevel=0x100; nERR=1;}
0 O, Z, Q1 b& O4 ] }
- z5 \6 x& D. m( V9 X( a; } if(nLevel==0x100)break;
/ s* x+ q- z- d2 ~# Q8 O" o6 M if(nLevel&0x10 || istrin>>t[2]){
0 \- U- R. k6 E nLevel &= 0xF;" C/ @" K9 ]# r% M; `9 a1 ^8 e" r& l
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
5 Z1 Q+ k: Y( L; _0 o; n' b: i if(csym[1]=='*'||csym[1]=='/'){
8 G6 s) H- h% C. k GetExpValue(t+1, csym[1]);
0 J$ l$ A0 |) Y }; ~- \0 {, b; g/ s1 ]
else{$ i+ I! E9 J! d E
GetExpValue(t, csym[0]);
: Y& ~1 \! O" |* o# R% J5 x! d5 Y t[1]=t[2];csym[0]=csym[1];csym[1]=0;
# b `# X0 P1 i }
" n1 b1 F2 N3 P+ r$ F4 P nLevel = 1;
: w! M/ u) v" I; R+ p, q- O }
. W3 \2 S' I# ^" E3 ^9 ]3 n else istrin.clear();" q% J, w' V9 i% p6 ~
}1 Z! t: e7 Q( |' j
else{nERR = -1; break;}
% ^4 V3 N3 I# R$ P$ G6 I- s) b }
+ k% U/ ~0 ?* S- M% G if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
2 z, f6 e/ }& N# t else nReturn=GetExpValue(t, csym[0]);" o3 f# v8 G I* S0 M1 M8 u
return nERR==-1?1:0;. S8 r2 o+ |: B1 f$ ?
}}8 |5 r7 A7 o6 E9 d
9 t7 K+ P, T4 r8 K- g! r( q$ M) v" C- e% h
# ?1 b9 p u- {! D8 z
函数模板使用示例:, R$ @" U, O2 m5 y; Z0 k
在以上那段代码的后面加上以下代码:5 h" A* J& W& y% M. v
( n6 J9 j6 E" C/ L X4 q1 o2 {3 ]' V
; Q: V) }8 O" O* o1 U程序代码: 9 T/ y6 d# V& w: v' j* e
* e1 Y/ v. G' e- X7 f2 y( q1 a#include<strstream>2 f0 d, Y9 u, D0 C0 `
#include<iostream>3 _/ s; d8 X: b; ^0 t3 j. o% E
#include<string>
/ Y5 g. v- X& f x% U; D0 m& _using namespace std;
; g/ X* e; B! y, o; J% F" qint main(void)
+ _$ _) d; h4 ?- ~, T* b4 C{
) c- |; d6 Y% B: a. L4 D) t string s1;
) L. D# i- T) F0 y. ^ while(cin>>s1)
9 k3 S2 v3 d/ ^& @; w o& C {' G; J& y) _ X) s% v4 Y+ [
istrstream isin(s1.data());
% n" O: F( u5 D* ^$ i double d;9 D5 ~9 B# t& d y
if(fy_Exp::GetExpValue(isin, d))
) b( `6 \: o7 Q Z6 v4 P4 s {
2 t1 B5 L# j- G# h; O( D cout<<d<<endl;
& s0 O- F0 H! P; | M }
( _5 {8 p5 p( b& ^2 j else6 p# {) s# O' W$ W: C# R* F
{$ q7 u; U. o5 F y4 V& k, e
cout<<"ERROR"<<endl;* p( ]4 S6 y' p1 c% `9 a- f6 ?
}/ U( L. n. P& O8 k8 w7 \
}
- e N3 D6 u! U% {, r4 t$ f return 0;" L# C k1 \: F$ U* R% T( b
}
! S! H$ E ^5 Y" q d* n" p7 h) k5 U2 `
" L( z& i/ l. j8 Y3 m6 ~% y! _9 D然后编译执行就可以了(*^_^*)' ?! h9 i) T" |& @
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
+ E- p% @/ V5 w0 H% } 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|