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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
; }5 y/ a* N6 z0 f一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
3 U: t6 U: Z. a/ B# ^7 H只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( c- O& `& _! z2 F7 }4 l; x% L
参数解释:
. w; G' ~% a2 |0 ?! aistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流; j0 A& l9 p, V# R" ]
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定) M$ Z8 h" L! L. j5 w v% X1 x. \
返回值:
' N5 q9 D0 o( V8 |返回非0表示计算成功,0表示计算失败有错误
; Z; c( X2 H! l3 q) C8 z1 B, C# g+ {+ O+ G3 K$ B0 @
o% V1 o! H# h5 @
2 `4 k; L4 A/ d1 b% N: t
程序代码: 4 b: h3 ~8 m; g
! S _3 @9 ^% _namespace fy_Exp{
+ N( l Z, E( B0 unamespace {template <class _T>% P, ]! X% y/ @" s$ x
inline _T GetExpValue(_T t[], char& csym){
, e: V7 c* ?9 T char c=csym; csym=0;) n M, ~" i7 H+ ~7 X) d' T. T
switch(c){) b. H8 A! p& }" n. S7 m2 @
case '+':return t[0] += t[1];$ Z, [! @+ l: Y4 p+ t/ o3 ^9 x/ \) l
case '-':return t[0] -= t[1];+ a1 Q+ q( M- R
case '*':return t[0] *= t[1];
; t7 L; k" {: J, C: h default: return t[0] /= t[1];//case '/':6 g m. z1 e1 p5 O) J- G
}9 X( X& L" \, w0 V- i% ?& e% G; _
}}
# Y' W( [8 m$ ~template <class _T, class _Tstream># a8 c: L8 r" N* R4 l+ }
/* _Tstream: inputstream, _T: get return value' q: @, G( v7 i1 x7 g% U
* Return nonzero if get value successfully */: i4 A. j; ^# `* X! x
int GetExpValue(_Tstream& istrin, _T& nReturn){
0 T$ r, S) G1 f/ n* U9 L _T t[3] = {0}; //雨中飞燕之作
, \& [6 \2 B7 H$ p$ H+ n char csym[3] = "++";2 | V# [$ y3 v8 g5 n2 H
int nLevel = 1, nERR = 0;
0 r+ I: [; w$ I if(!(istrin>>t[1]))istrin.clear();$ v: B/ @+ M2 w* d: f' b- t
for(;;){
. \" |* B' V# D3 k if(istrin>>csym[2]){
# ?$ F) T; n S9 K- } switch(csym[2]){: f4 s; _* L5 l( z% D
case '(':- ^8 E- q9 o$ Y" Y% C4 s2 R
if(!csym[1]){nLevel=0x100; nERR=1;}else% _( b7 l6 n0 D0 s
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
7 m- v: h1 `# u! | S' o6 R5 b else{nLevel=0x100; nERR=1;}
: L0 Q6 d W. T) R! l break;
3 `1 b6 v! C3 K: l. c* D case ')':% n6 T: w2 u* ^* c0 e
{nLevel = 0x100;}break;
8 Y" r8 C: j' \: @$ j$ M case '+':case '-':case '*':case '/':
) k3 ]* i3 S" K0 k$ ^' x+ q" Y' _ {csym[nLevel++] = csym[2];}break;
9 {+ C6 m4 S' U, H7 h* o case ' ':case '\r':case '\n':case '\t':continue;
' D% j! y. @! G default:9 X/ E- e1 J% N& C& d1 F p
{nLevel=0x100; nERR=1;}' J' ^4 Z+ t1 ~+ M( `- k9 C) W
}- y# x, } L3 s0 n6 J
if(nLevel==0x100)break;
* w5 Z; \4 k+ S9 b: V- R if(nLevel&0x10 || istrin>>t[2]){$ Q$ V. d! I# S2 A
nLevel &= 0xF;
5 b. [7 ~' ~, \" l% t if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! w# W5 j! l: j* e. D# H
if(csym[1]=='*'||csym[1]=='/'){% k1 u) Y4 ~. Y- ~
GetExpValue(t+1, csym[1]);
' y3 Q9 K: G' J# F+ F }
0 D9 z7 ^" M' Q+ m& o% a. J else{7 |6 B% L2 I1 O9 W) o v( N! Y
GetExpValue(t, csym[0]);
% D3 c# V% a4 i& `: [7 R6 S. e7 e t[1]=t[2];csym[0]=csym[1];csym[1]=0;
n6 o2 @1 E$ n) j1 h3 w }
- F& _7 m9 T8 c1 f1 y/ f nLevel = 1;5 b$ n/ C- h x$ x/ c
}
, R; W$ T! U) }1 Y else istrin.clear();6 u/ C" k) Q; L7 }
}1 P) x. z3 g: o$ y- t
else{nERR = -1; break;}
' N1 O2 o& v6 T8 \* G6 h. o* |5 R }7 g1 y/ t( \; s1 F: ?
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);( X% L6 b. `. A8 P: f3 c+ \
else nReturn=GetExpValue(t, csym[0]);
8 l3 m& q4 s( ^. W% r. {) Q return nERR==-1?1:0;
: {( j+ _% ^' H# T2 m}}5 k3 \* {6 N/ Y$ h% `* d
/ l: G" V/ \) ]8 j. I3 q \% `+ i# \) i
4 x' m& O* A0 A: u _$ x, V# t0 D2 r3 \/ J
函数模板使用示例:( u0 |2 \- v& J' ^3 `# b0 Y3 S. y
在以上那段代码的后面加上以下代码:
. e2 F- x) q$ |% f8 W. Z$ W# K
[7 |3 s) J& ^6 ^+ i$ ^8 x ) F5 O! G$ L+ l* S$ e1 E/ k
) G4 W# o0 i8 [: l6 h! S1 E
程序代码: # ?( J$ Y- v! `1 i X( Z4 K
# s( m& F7 ?( z y- e2 W' K# ?% }#include<strstream>( U5 y8 o! G/ c2 \
#include<iostream>
" X I$ m* {2 I#include<string>
& x t h. i0 q' R. C7 cusing namespace std;
, k. q9 i. {: E/ ^9 Dint main(void)
" h4 v0 o9 w, z6 d{
/ N" L( L- [9 Z' \+ b string s1;* ~- ~3 i6 Q- O) w
while(cin>>s1)
1 o6 N3 D9 A7 c+ ? {
* S( U/ |% G! `' U istrstream isin(s1.data());
2 q8 y: t6 N/ G double d;
% v: q9 h3 |4 Z7 D# M% i if(fy_Exp::GetExpValue(isin, d))0 _7 c' k5 l. @
{2 R- N- n$ c5 i6 f9 L& F9 [& D. R
cout<<d<<endl; U, X% D% k$ [3 H9 w2 j
}! o+ W/ q1 ]0 s3 c5 K( C3 c
else
: ]) t- ~, E+ `6 I {' ], y: ^2 U1 D O7 E3 }
cout<<"ERROR"<<endl;! A/ {; d6 Z" k P
}
* b- g. j) L: B) M1 S9 ` }
5 L2 O0 c! G' q7 K return 0;
/ s+ |9 a/ `6 q4 x- ]; S) H, l}& e k0 \$ D$ D- P
% h3 y0 @7 M$ A0 @9 L3 N2 Q, v+ m) k$ m
然后编译执行就可以了(*^_^*)* C/ X( Z' G, E
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
* h: g, `9 l1 j2 \) {2 g$ D7 a! h/ M 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|