标题:
一个计算四则表达式的模板
[打印本页]
作者:
zw2004
时间:
2008-1-21 20:17
标题:
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
% i8 S3 l) N- q/ [8 U0 j) B
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
3 c7 |& s4 v7 r' Y
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
& Q7 o) o, \, `* X
参数解释:
' v+ o3 L! x, ]
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
# c" p7 j) X; T6 e4 l! n8 v1 e
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
7 F0 Z; W/ Y F3 k6 l, o0 J8 e
返回值:
$ C2 i3 \2 o% M
返回非0表示计算成功,0表示计算失败有错误
: ?5 c, h0 Z: o7 a1 v
7 Y% T, ]# t! h m* x. Y6 V( @
5 p1 J4 y8 e) d2 U5 s. U% ]* R
% e1 w5 H/ Q1 F9 Q, `8 t3 w
程序代码:
7 O( X! c# U& y' ~0 w9 n9 Z( n* G
# x1 M# S& f$ z6 X: ?0 G
namespace fy_Exp{
* I% x7 F5 X' k7 r0 e4 N3 \
namespace {template <class _T>
& l& N: ~' {/ C" X5 w- |8 L
inline _T GetExpValue(_T t[], char& csym){
6 z3 S- ^# b7 G" V* {) ]
char c=csym; csym=0;
v" V- x6 G. B* J) ]. T
switch(c){
, d; {$ o$ @0 n, m
case '+':return t[0] += t[1];
, O/ c7 I' p' _% ]: b
case '-':return t[0] -= t[1];
9 N6 v! b4 R! h# q& W1 h( V! [+ W/ R
case '*':return t[0] *= t[1];
+ S5 k5 ?3 x+ z& |* x% R
default: return t[0] /= t[1];//case '/':
- Q$ t4 R- J& q1 s" q
}
) j9 _, Z- T0 s! ~+ Y/ O" t/ d. ?
}}
/ d- ^9 w ?# z3 W/ I
template <class _T, class _Tstream>
+ D3 X3 j" |# J6 O4 Y. n
/* _Tstream: inputstream, _T: get return value
5 Y! \& h, H+ k( _# X
* Return nonzero if get value successfully */
. t7 l3 {" {" r0 T( E7 `
int GetExpValue(_Tstream& istrin, _T& nReturn){
( U* S9 o& s5 l: [( \( x
_T t[3] = {0}; //雨中飞燕之作
9 c, J# T2 D4 x* V' r
char csym[3] = "++";
+ m# _! F1 T0 w2 R% E, R( w
int nLevel = 1, nERR = 0;
3 h6 ?0 j' T( E" ?+ U3 s5 A* l# `8 c
if(!(istrin>>t[1]))istrin.clear();
* _- x9 c) Z7 N% Y: c
for(;;){
7 j; U1 x @( `6 v+ Z6 e
if(istrin>>csym[2]){
% n+ a' I, L3 U j8 y
switch(csym[2]){
- c$ E% g4 c: E3 D
case '(':
# H. X! N# i; p R- ^& T, k7 b) G6 ]
if(!csym[1]){nLevel=0x100; nERR=1;}else
3 n& ^9 u2 z1 q9 ^: `( X, g' x( o
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
. g8 \( i, b# C- y0 y3 P% k1 g5 F0 F
else{nLevel=0x100; nERR=1;}
( m$ x' P/ {# X7 c; S! p" C8 K
break;
! b3 l: m8 y" T
case ')':
; D t* f- u$ L0 U
{nLevel = 0x100;}break;
; d. B, A* }0 d9 H3 d, N# q/ o
case '+':case '-':case '*':case '/':
9 ?) L' T: ]$ {6 G* s8 T
{csym[nLevel++] = csym[2];}break;
5 ?/ A% n! n5 {$ p. J( S% q
case ' ':case '\r':case '\n':case '\t':continue;
( m) O5 l6 h# d) e
default:
8 j3 s/ W- f2 p* o5 u3 B
{nLevel=0x100; nERR=1;}
+ ~7 X7 S3 q5 V/ E; ~
}
* s5 M: L, M# M9 s P
if(nLevel==0x100)break;
% K/ l9 M0 W& M+ a' t
if(nLevel&0x10 || istrin>>t[2]){
4 q5 _+ y7 |& @1 _4 V0 J
nLevel &= 0xF;
& B6 k( x, D' h0 b0 R6 i9 ]
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
, _, e; ]; Z/ l: a5 X. e0 D% T4 m. y l
if(csym[1]=='*'||csym[1]=='/'){
1 H5 [, E: P2 n$ I- i6 T
GetExpValue(t+1, csym[1]);
4 ~7 t* D7 K% K. A, `. {7 R( n
}
3 g/ y. J) D" g; _2 I5 h
else{
; s) N7 O: N T. d# g4 T0 }
GetExpValue(t, csym[0]);
' g# G1 S- U* Z5 x5 a1 z! K' F
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
& X# M5 X( [" ^. t6 Q; M
}
! e( z9 m; u! M2 |* @
nLevel = 1;
, D7 |9 ?. G% r* k& g
}
3 `; G8 ]$ |; t9 K' c* w
else istrin.clear();
( a% m( v5 T/ X0 X$ S" K- z
}
0 C* q& t6 O( l6 u
else{nERR = -1; break;}
* B6 g" @/ p2 l' [
}
3 m j5 A- a P4 {% M- r
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
1 X2 h: W; c) L: Z8 ^; l
else nReturn=GetExpValue(t, csym[0]);
" E! b) `: M9 A1 J
return nERR==-1?1:0;
- w5 j- y: x- h% L. V$ {2 Q. y* X4 }
}}
# e0 V$ R. Z1 L# K" h7 h$ b$ }+ F, E
8 p0 o2 ?/ F* T0 [4 E+ w
0 f9 V" E* _, M
y( b, M! h8 ]6 `' Y0 D
函数模板使用示例:
0 b" ^9 d$ F% J7 U( e
在以上那段代码的后面加上以下代码:
5 D% }) @* p1 Z2 V9 B! G2 I
3 x+ Q" c+ ?! p3 K2 Q4 c
* N$ w2 E0 a7 O
0 S) s) ^; l$ g0 c
程序代码:
* I1 i2 M2 v5 h4 Y; S/ _
. O8 k+ }& C$ j8 r( `* P) `8 G
#include<strstream>
9 b0 ~, a# z3 m' P2 K4 b
#include<iostream>
, L6 I5 o- O2 u- [0 \
#include<string>
1 y" s7 s" m7 Y+ f* Y+ c
using namespace std;
. P# u* i+ L% r( j- q1 d: c
int main(void)
+ a% |+ ~0 x1 P* Q& Z
{
@' d* r: T, B4 B
string s1;
T1 [: e% c! w& f8 |; x, u
while(cin>>s1)
% a8 K+ D, A# d2 _5 ^
{
. h3 s9 _( r9 z/ z M& f
istrstream isin(s1.data());
1 W1 e% X( R8 l: O" e
double d;
& a8 i" s& O/ r: v+ ~5 j
if(fy_Exp::GetExpValue(isin, d))
6 L9 w( L, M6 p
{
/ ~1 ~0 @0 C5 k( T8 v- Z$ w) x
cout<<d<<endl;
$ Z6 J! K( Z6 M
}
& ~, m4 j: R( H$ B& L9 h' O
else
, M# h2 B% S, M
{
8 \5 }& q5 Q7 I$ q
cout<<"ERROR"<<endl;
/ R, F# T5 } Z1 w6 u
}
/ s8 h& r' r+ R/ e
}
N: g5 y U3 Q% w+ K
return 0;
) Y9 C- F4 m/ ^8 U6 G
}
4 u; ]$ N3 B# h& T! N8 ~
$ z3 s% X2 D1 ]% `
4 ], ]; L3 R) z* |9 o3 k+ y$ @
然后编译执行就可以了(*^_^*)
% P) O6 P4 g+ u- N8 K- D1 H1 U/ o
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
5 ?) @8 v+ p m* t% c: X0 H' R
建议使用VC7或VC更高版本,或者使用GNU C++编译
欢迎光临 捌玖网络工作室 (http://www.89w.org/)
Powered by Discuz! 7.2