标题:
一个计算四则表达式的模板
[打印本页]
作者:
zw2004
时间:
2008-1-21 20:17
标题:
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
4 I; n6 _0 A8 s; e7 \* M$ K
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
. U9 ]: V# u! d0 D, [" C5 z: n
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
% C7 m1 @% R6 z: d9 c
参数解释:
7 w- P. E+ B3 E& ]7 _2 a
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
0 k- f' p2 r- F( X
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
4 ?$ C% `; `) ?* J
返回值:
[$ g' ? G2 @" F; [6 V( z1 \
返回非0表示计算成功,0表示计算失败有错误
! n6 G; n3 E+ F
0 J. f0 G' g+ T
9 T$ w* U9 t7 g' M: U$ R8 V: S
% N" y5 M4 n! H: W, C! B2 @
程序代码:
& c% q$ Z) l! Y% k+ R
( n% E: s6 R+ R0 Z/ m! b% l
namespace fy_Exp{
5 \2 y0 l5 R6 _
namespace {template <class _T>
( w0 Y% r4 B- z% h* c, ?" z; ?
inline _T GetExpValue(_T t[], char& csym){
6 X0 \/ l; |, ]- A2 w( r" H2 @; a
char c=csym; csym=0;
+ Q0 `5 p# T$ g' d6 k. @5 \
switch(c){
0 k* ?. |7 m2 x/ ]8 h) d* U, S
case '+':return t[0] += t[1];
C9 U0 X: S0 I' ]$ j
case '-':return t[0] -= t[1];
' [- F' Y+ a4 l2 c% y* \
case '*':return t[0] *= t[1];
# S1 l% J9 `: d! H( X4 J% l
default: return t[0] /= t[1];//case '/':
3 J1 W w" [2 H( C, { d3 g4 }- u
}
& Y! l1 C1 i9 _7 C9 }& A0 p
}}
8 h' ~- ?8 y' o7 @
template <class _T, class _Tstream>
8 ~0 q% ~# [6 Y+ E+ ^; X5 q* b
/* _Tstream: inputstream, _T: get return value
1 W6 z6 E! C7 J$ X
* Return nonzero if get value successfully */
9 t1 _ J0 }# A! I" r1 C+ r% `" b
int GetExpValue(_Tstream& istrin, _T& nReturn){
2 f* R2 _3 g: {) Q. ]! v
_T t[3] = {0}; //雨中飞燕之作
7 G' K. ]% D6 ?6 V
char csym[3] = "++";
0 y5 o8 m: w$ X& F: D
int nLevel = 1, nERR = 0;
& m5 i+ D- {. x- W7 [
if(!(istrin>>t[1]))istrin.clear();
, I( `0 _+ q: K( @) m
for(;;){
( a6 t5 v4 H" k. i2 K$ z( A) M7 w
if(istrin>>csym[2]){
0 o- S/ ]: J$ x2 A8 M7 ] N7 n. m1 z
switch(csym[2]){
& a' n9 {0 K0 r- r& c/ [
case '(':
! @' v1 n3 s7 t; Q1 j0 y
if(!csym[1]){nLevel=0x100; nERR=1;}else
- I' s* S. u- \& Y' l
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
' X$ v/ t7 c6 h3 h5 \
else{nLevel=0x100; nERR=1;}
5 ` o' H' o- G! S. e- f
break;
" H9 T, C j; F3 A/ n+ \8 Y+ Q
case ')':
# ~ p8 }5 L9 q: t# f+ S$ {8 B9 E
{nLevel = 0x100;}break;
7 K g/ I5 @! y1 |2 Y; j8 R
case '+':case '-':case '*':case '/':
2 X5 X: W2 E2 X# Z, S" {+ t
{csym[nLevel++] = csym[2];}break;
( c' S+ z" c+ J& r( V
case ' ':case '\r':case '\n':case '\t':continue;
: y* s; J2 M9 E0 G' X: e' _% q
default:
: K3 L2 h* j/ u
{nLevel=0x100; nERR=1;}
/ _% e, e. d( X" Q; l
}
0 k# D2 \" N- n- ?2 R7 g4 t1 @
if(nLevel==0x100)break;
[! ~2 }- V7 k, I$ y+ U- A# E
if(nLevel&0x10 || istrin>>t[2]){
, b1 N6 d+ b6 w4 @1 `) q' i
nLevel &= 0xF;
& h' X/ N. u% P* S4 l A7 S4 u5 I
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
, d0 E# @: X$ E: p1 O
if(csym[1]=='*'||csym[1]=='/'){
8 {$ [ @& a2 s0 q
GetExpValue(t+1, csym[1]);
" f; {5 c! x1 H' i
}
5 F- C8 K5 T4 x* ?8 [5 F9 l
else{
7 G0 J0 |& r' O" ?- }4 F# n
GetExpValue(t, csym[0]);
: h! }5 Y# b5 h% I
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
# L2 z% h5 e' B: x6 h
}
6 w. v' z. G" Y) `- X9 \/ Z
nLevel = 1;
6 H$ m# `( n, x! p! h
}
- b* D" \( C% g$ [. V9 ~1 R7 i
else istrin.clear();
% b2 z, i/ I# o% g+ [+ I
}
/ `, K; N$ P3 f1 [. W
else{nERR = -1; break;}
7 @; q0 a# G3 S+ I7 w, g/ ^- Z3 C
}
3 _+ V* I& z& e0 j: R6 O
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
' L k/ S( W7 d) }5 ?. Y7 V; d
else nReturn=GetExpValue(t, csym[0]);
# G* a8 v: N& Q! C
return nERR==-1?1:0;
; _! ? b% z+ `6 k& Q
}}
$ Y. u9 V3 V4 y# E) D3 n3 ?7 l( h
" y G0 H& r6 d4 \
2 E) z( o9 b4 M6 a$ X
V( r" J( o; C* j
函数模板使用示例:
. t0 g2 u* x0 P) h. g# e" A
在以上那段代码的后面加上以下代码:
; V" K7 S4 _7 P
. o3 s" m5 {. w1 s5 u
: r% v: h1 }3 l' a% b
; V* C* d1 s/ Z
程序代码:
. v& v5 d7 m, s9 _6 U
3 ?3 i' _ U4 j, n, X( [
#include<strstream>
) R/ t \4 l+ d2 S4 x7 U" e& l) P$ V
#include<iostream>
3 j1 i2 V/ Y# c, x5 z: q
#include<string>
$ W9 z4 v# i/ O* H* I' A/ W2 F
using namespace std;
! m5 i- L& J4 P; t
int main(void)
" M& h9 K6 K7 N0 q z0 Y# e9 ]
{
* m$ k3 I: N m! l
string s1;
9 L; T2 Z5 m7 _
while(cin>>s1)
+ ~3 y: y5 J( U2 v
{
" X: a# g, ]4 V6 U" A! `
istrstream isin(s1.data());
) U' O m2 J6 }' S# G% V' d
double d;
$ I; x b: b) ?- ]8 ~
if(fy_Exp::GetExpValue(isin, d))
( W2 Z9 a) n- C# H. e1 H! m
{
% B* ~1 m. [, O) t( E5 Z
cout<<d<<endl;
$ Y; N9 J; Q7 E
}
1 |0 D; k9 m8 Y2 }' I3 Z/ k! ^$ r
else
, a7 I5 s7 i' X% V" ~
{
0 c+ g, A9 `+ }
cout<<"ERROR"<<endl;
/ C$ t, v* ]7 f% P6 V" M' A5 F
}
2 u4 C, X2 Y- v8 o( Z8 f
}
. `; i5 o" y8 c' O$ E
return 0;
: i3 h) C3 [6 ~. T7 v& f! j: F
}
8 \7 `: ~0 `6 x8 ~, F3 A: a4 I
. i8 ]/ Y' M+ P
# p7 P7 c/ s- m$ v
然后编译执行就可以了(*^_^*)
. {( y! I( w( H: b' }% f4 t: L, L
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
W3 U/ D2 ?% b" n- |$ R3 D+ `
建议使用VC7或VC更高版本,或者使用GNU C++编译
欢迎光临 捌玖网络工作室 (http://89w.org/)
Powered by Discuz! 7.2