标题:
一个计算四则表达式的模板
[打印本页]
作者:
zw2004
时间:
2008-1-21 20:17
标题:
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
4 X+ q) z; x3 F
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
: H; P$ |+ j, @6 L+ b: R) p
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
& z( x' N; W2 Y5 D
参数解释:
/ \* E7 q/ a8 x, F* T& d+ A( I) h
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
. M: P. F9 R3 g, X) j
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
* F J) S d' M" |8 @
返回值:
8 `2 W8 w' O" \$ n
返回非0表示计算成功,0表示计算失败有错误
$ i- E% p) [9 M) a; v; K' S
( B3 F8 U7 D. K0 b' Y
) g9 s! Z* \1 g) _; `
+ V! b- C7 {8 T# A) d
程序代码:
& O" w" `9 z8 Y* ]" V
. `$ H! c5 F i: y2 {+ R) }& q. |
namespace fy_Exp{
4 h# T3 D9 H8 f6 I; [# s
namespace {template <class _T>
# i2 i6 e- e; h+ _* g& M: D+ Z
inline _T GetExpValue(_T t[], char& csym){
2 F, l7 s) ^5 E, g* v
char c=csym; csym=0;
1 y8 v0 M3 s( N H! k; B s
switch(c){
2 A1 [9 g1 d+ V7 @- b- a
case '+':return t[0] += t[1];
( t% `8 d6 ~7 Q( U3 m# O+ ]. V
case '-':return t[0] -= t[1];
2 h: G( h, T9 K: G' s. K( g% @: q/ L
case '*':return t[0] *= t[1];
& t! t7 H1 k, D0 U) l }8 G; o
default: return t[0] /= t[1];//case '/':
% H# d( i) B8 u. R
}
6 }4 ?8 b: l7 i& u3 J9 `8 e
}}
4 F" \# H* n) t: @9 b$ }+ q
template <class _T, class _Tstream>
; |3 S2 t1 L5 h. t& J) T
/* _Tstream: inputstream, _T: get return value
2 z' Q6 W- R+ n; r$ Z* V- g- i3 J( I
* Return nonzero if get value successfully */
2 @; l, u5 N k3 x- R @
int GetExpValue(_Tstream& istrin, _T& nReturn){
# [* Z; x# c( O: r d; K2 j
_T t[3] = {0}; //雨中飞燕之作
1 B7 w6 S1 \/ P$ Y9 M
char csym[3] = "++";
" R; l: b* U; P# o; p8 E& Y! U
int nLevel = 1, nERR = 0;
# Z: Q' e0 \" Q6 ?& M5 m3 l$ f
if(!(istrin>>t[1]))istrin.clear();
5 W& [1 O/ m; h; s" m% t8 I$ O
for(;;){
6 o# |6 G6 K3 i/ ~, n' X
if(istrin>>csym[2]){
t% ?1 V/ L9 Y# W7 i. ~6 X# A& n P
switch(csym[2]){
& g6 l3 C, v3 F" y5 C
case '(':
* s% F& t3 O2 ]9 G% t
if(!csym[1]){nLevel=0x100; nERR=1;}else
3 b. P/ G' k0 H% H; g
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
/ p- l. v! U, p9 O; ]9 _
else{nLevel=0x100; nERR=1;}
7 \0 I1 ~" o) q( p' M8 A8 P1 {1 J
break;
! B( J9 e k L& G
case ')':
( b! `9 _: M6 z! S
{nLevel = 0x100;}break;
J, c1 T% U' ]- X' _# g
case '+':case '-':case '*':case '/':
* o% U: k/ \. X
{csym[nLevel++] = csym[2];}break;
. W$ b8 Z9 q& U/ q, j
case ' ':case '\r':case '\n':case '\t':continue;
" L/ [. Q% b9 @2 z* E1 T) g
default:
- F- \3 t% a, J8 O J: B5 f; v
{nLevel=0x100; nERR=1;}
4 k! j. X3 y# N! t; I
}
8 S m$ f$ d/ H" y
if(nLevel==0x100)break;
# u" z! h( ~, \: G0 w
if(nLevel&0x10 || istrin>>t[2]){
+ f2 a9 V* Y1 H, K" h/ D9 _2 Z
nLevel &= 0xF;
! c$ t, K" D7 }% Z- w) @: _% A
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
2 C. }; k; ?# b! t
if(csym[1]=='*'||csym[1]=='/'){
8 M7 W7 c( e* j
GetExpValue(t+1, csym[1]);
0 X% _& b/ i6 ? I7 p9 v# J6 S
}
9 A8 A" C c/ n, L- V# M1 x9 |
else{
; R" u* B) b* `2 d0 O: c
GetExpValue(t, csym[0]);
6 P7 R# T8 q+ c9 A$ Q/ U; E
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
$ O1 g# j# u' P) g. |0 a V; [
}
6 ?+ I2 `+ i8 Z! i( {7 M# j2 j
nLevel = 1;
8 Y$ u) Y$ x+ ^
}
9 s+ v9 [ P( P6 W5 H- s& ~
else istrin.clear();
9 V/ G8 v9 B4 F( h) a I6 Y1 r
}
, s9 n4 }; N$ W
else{nERR = -1; break;}
! m- h. ]8 \8 a8 u) W" p% u
}
# @9 o+ N$ y0 V0 b
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
7 l% h& y9 F( {$ F9 I8 g3 w( L
else nReturn=GetExpValue(t, csym[0]);
( J/ Q+ \$ U) ^: ~ p- ~8 U
return nERR==-1?1:0;
7 A4 \, s8 ^# y
}}
) G9 R0 N2 a' \& i
2 t* z4 n$ N$ t. [
! e. T3 U. k: P3 I6 u, N2 R0 ^' b! m
5 z) V9 C4 c( F, w' t+ k# r
函数模板使用示例:
1 ]8 z+ E% C9 P+ l3 h7 Z
在以上那段代码的后面加上以下代码:
* o/ u: t8 H+ ?) {
: P) \: g. y0 [7 W6 C n- A
3 x4 f; {7 G7 B( @% K" x
' J% j' Y0 W$ x
程序代码:
$ K7 r% `. k5 ?' I
5 `% @# s; Y: R1 a4 r/ W6 W" x
#include<strstream>
) C5 t* Y* {4 B' f/ z% p% M
#include<iostream>
/ ]) X; U/ l& i! @" U% y
#include<string>
* f. N# |5 @8 I6 T7 V9 `( M; i2 b
using namespace std;
3 o0 l* i4 B" ^/ A) y* k) D
int main(void)
& H2 P4 i/ v3 |% y" V M
{
7 _& ]# G3 B% U% b6 z/ p
string s1;
' k4 U! x: t3 F$ ], X# n2 z
while(cin>>s1)
+ [7 K$ K. g1 d3 b. m
{
8 a" |) i- c3 U- T3 s5 ^( O
istrstream isin(s1.data());
7 K- L. R( F& }9 V# F
double d;
* p% v- Z# u9 `, o7 S6 v
if(fy_Exp::GetExpValue(isin, d))
* s9 t1 W- Y' E' J9 [$ ^, R9 L, b9 ^
{
1 s- n1 D, J2 L a" ~2 N2 X
cout<<d<<endl;
- {4 k1 }% e. t# o ^0 L3 H
}
0 v2 B+ I! S# R5 E
else
% K# k/ ?% F- {" G$ H* [ D9 L' c
{
- m2 x3 h, ^% O l
cout<<"ERROR"<<endl;
5 |# T: \* t$ @: N+ w
}
, U3 Q% \6 ^/ e( l2 ^7 D
}
& c" h9 d9 j' E( _2 ?
return 0;
; M3 }+ e' x3 S! k- k
}
o+ }+ Q/ v8 d; I
% y3 @/ i6 T4 L6 P8 F* y3 D. m
% w( q0 Y+ o' {# |! ]
然后编译执行就可以了(*^_^*)
' N/ s% _% D4 i
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
5 Q+ A) c, D/ V" o( T$ z
建议使用VC7或VC更高版本,或者使用GNU C++编译
欢迎光临 捌玖网络工作室 (http://89w.org/)
Powered by Discuz! 7.2