标题:
一个计算四则表达式的模板
[打印本页]
作者:
zw2004
时间:
2008-1-21 20:17
标题:
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
4 Z1 z$ o. ]4 \2 n
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
2 }8 a4 |; W. `
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
; c& M' j; \& _) B! M. c
参数解释:
! [; M0 H- T3 g* o: l" a8 n$ ~
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
1 h) F' m! f; z
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
3 |7 H0 v5 \1 Y/ ~4 @$ `: h: P* d& U
返回值:
$ R4 m: m1 s1 X; ~& x
返回非0表示计算成功,0表示计算失败有错误
7 F9 [, v2 A, l: u
0 g8 L$ y) X- G9 o3 \
5 ? r9 j, D G) z$ Z* ^' y
+ ~( u! p# q6 ^, s/ B
程序代码:
; ^- q2 s% p6 {& M$ I/ f- i, q
1 j7 @; G$ d! Z( s& U8 m h
namespace fy_Exp{
8 f( {- ?% u5 `& i
namespace {template <class _T>
6 T# n0 m, a/ ]: s9 E
inline _T GetExpValue(_T t[], char& csym){
/ b( F t* X- \# B1 B. L" B5 Z
char c=csym; csym=0;
; ]5 i$ X9 z: W1 _+ _% T0 s+ ?$ G
switch(c){
1 `( a2 c6 y& [1 u8 \
case '+':return t[0] += t[1];
5 v1 B$ ?5 n J
case '-':return t[0] -= t[1];
5 i5 C+ J5 j/ X
case '*':return t[0] *= t[1];
- z% L) c! P% S9 c! r4 h! n
default: return t[0] /= t[1];//case '/':
& @$ f4 \& L1 I/ D) F. m7 Z
}
0 @! ]5 }0 g4 ^' k$ _) i2 T: C ^
}}
2 u0 K% u# L. S
template <class _T, class _Tstream>
3 u5 P l- o" }/ D( ]/ j- |
/* _Tstream: inputstream, _T: get return value
6 c2 _6 n9 X7 ~, r* G5 A
* Return nonzero if get value successfully */
2 u2 W2 l* [ X8 }2 l
int GetExpValue(_Tstream& istrin, _T& nReturn){
/ M3 o/ y$ o: K
_T t[3] = {0}; //雨中飞燕之作
3 ^9 Z( e) `8 E2 T3 |6 t" z
char csym[3] = "++";
6 e1 I2 M' j1 X; r* j E
int nLevel = 1, nERR = 0;
2 x+ v! D1 i& h7 D# n7 i
if(!(istrin>>t[1]))istrin.clear();
$ s1 O6 F5 m" c+ b1 q4 k ]+ x
for(;;){
4 s3 A+ H2 o) w8 F/ r+ K
if(istrin>>csym[2]){
( b* ^6 u+ A# ^; `
switch(csym[2]){
* ]4 ~" J3 r+ _3 G0 H6 H
case '(':
& w6 R3 S3 O* v" s
if(!csym[1]){nLevel=0x100; nERR=1;}else
: P( V2 v8 I. x) [. R& q
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
+ I0 I* L/ s( f0 I8 @0 R- I0 ^
else{nLevel=0x100; nERR=1;}
! m% K* e4 ~1 f
break;
) i N8 T$ Z' M/ f& t& `1 I0 ~% g
case ')':
$ V# E5 Q6 A! T, E0 L" u
{nLevel = 0x100;}break;
( i9 y; v& i Y9 }* V& O! l
case '+':case '-':case '*':case '/':
6 Q% h' w4 b6 e) P( R
{csym[nLevel++] = csym[2];}break;
; {7 b0 F5 r& k& c0 y3 l0 s
case ' ':case '\r':case '\n':case '\t':continue;
3 O2 H. v F& J& W
default:
4 `, D* L- |# [' x& A
{nLevel=0x100; nERR=1;}
8 A2 ^6 E! S, ~3 u+ g. h& }2 U
}
0 N" ]) s% i3 B* V# l4 [
if(nLevel==0x100)break;
3 h6 e; Y7 x9 Y& W$ u& J6 M* P* G
if(nLevel&0x10 || istrin>>t[2]){
4 J2 F% \4 x. {
nLevel &= 0xF;
% s4 B" A/ s2 W0 p, U$ w' @7 B
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
% [# z) S# x* R/ ?1 V4 B
if(csym[1]=='*'||csym[1]=='/'){
: O; t$ x3 }1 J/ M( K
GetExpValue(t+1, csym[1]);
& S$ s8 E# L$ b: y
}
9 C, Z1 J& `2 u; b6 ~0 B
else{
$ b! C2 {3 r1 V7 B
GetExpValue(t, csym[0]);
; E E# s* F8 U2 ]
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
# E) I$ X5 @) ~/ W/ k! V
}
V3 W+ \- B$ X( p9 |/ F
nLevel = 1;
) L* q' f1 s" a$ Y. c
}
8 g# E6 m: ~& i6 y$ D6 l* I# l
else istrin.clear();
4 v. Q: R% o, u3 C" B1 c
}
7 k, D& [ ]- [( }4 w' [
else{nERR = -1; break;}
, e/ N8 d9 a/ ^3 H; c9 ~% Q! T* y
}
* r E0 |0 d- J
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
/ _7 A9 K/ V9 m# x K' A8 l# Q8 P& O
else nReturn=GetExpValue(t, csym[0]);
0 _7 _: V/ ~" s
return nERR==-1?1:0;
( r+ p# K4 e0 x5 G" m
}}
1 z# ]) r2 G, |" l) v
& X2 D5 k/ f A4 w! l* B) c
- j, r X. _& R& p7 O5 q
5 v# i/ f( x1 W9 l7 U
函数模板使用示例:
" B) Q: Z: I) B/ }
在以上那段代码的后面加上以下代码:
6 g6 P" _: p0 {+ N) j9 C: |; N) X
) T2 W) E/ r' j$ ~1 Y+ e% _. {
' g: [7 X; _1 c. X- A0 K
. Z" V1 j5 j! u+ f! `
程序代码:
% A! K% h, C& v8 [- a
/ W* T" k- l8 K; L/ W+ X8 w
#include<strstream>
# l) H) t1 N0 \6 ~- p6 @
#include<iostream>
B2 |- s4 \" {! g# c9 m1 d
#include<string>
! J, h% N( k9 z" N( g) \- ~
using namespace std;
- h m! w& G4 Q5 K( F4 P, \5 n
int main(void)
& W' ^; o3 m5 \4 n- ?* C8 k' W8 p3 m, R
{
- |3 F3 ^% z p! P0 A" K$ ` i8 U2 [
string s1;
1 W; J- w* g d/ ]
while(cin>>s1)
1 \5 d! m! a" N$ n8 U" B
{
( a2 L. u$ U2 ^
istrstream isin(s1.data());
0 c2 i; f7 g. F) B: i8 I7 }
double d;
G' f1 J/ k( Z
if(fy_Exp::GetExpValue(isin, d))
/ a( D9 N% n- y- a+ s0 `
{
3 V' M! W0 P* O. l0 \% o, U; o
cout<<d<<endl;
, O- f& H) @! |: R' p! B
}
* _# R5 V2 ?. a& ]9 c8 C3 O
else
: B+ _! r8 \' V2 `& H6 S0 q
{
b! F$ q4 o6 z+ r: V% n
cout<<"ERROR"<<endl;
( c4 k# P6 v' l: G9 ?$ i0 f, _
}
3 f# q9 Y+ Q+ L* Q# Q& d
}
4 ^8 U- P/ X8 c3 }: T! [2 N; D
return 0;
$ `7 L. e4 O2 P% _ Z6 X# W! p
}
, |9 U |+ B( n( W/ |0 q
; s$ W4 m% p5 `! d# J
8 h* l9 V' K! @2 h% e& i% U
然后编译执行就可以了(*^_^*)
: l4 X7 K' u) D8 l$ m
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
% L- D6 d' |3 ~, n
建议使用VC7或VC更高版本,或者使用GNU C++编译
欢迎光临 捌玖网络工作室 (http://89w.org/)
Powered by Discuz! 7.2