标题:
一个计算四则表达式的模板
[打印本页]
作者:
zw2004
时间:
2008-1-21 20:17
标题:
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
" w/ e6 I4 c; b- a: N1 \2 e
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
$ e5 W( {( S& y$ l/ @2 g9 w! m
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
% o. {- d2 M* b# F
参数解释:
) P: t% Q# `& h, P
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
4 @4 [) n" ^; |8 W6 x K9 x5 X2 i
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
3 G R; L9 }7 l" Y) z
返回值:
/ w: u7 O; p' S
返回非0表示计算成功,0表示计算失败有错误
2 o. y0 G- J& a: W7 Z8 z
% U# `5 w3 |7 }% J4 J, r
$ K0 V2 c. k/ m" I) h# _$ y1 n
$ _* |1 q: I: P; e+ e( k" K
程序代码:
1 D3 U4 L. y, X( }& d
: N, P, n2 n& l$ N9 V( L
namespace fy_Exp{
1 U7 Q& O/ ^( i) Y
namespace {template <class _T>
- Z: l9 L5 V0 j* s* d, `' V' t2 i
inline _T GetExpValue(_T t[], char& csym){
4 L& w1 [# @/ A: ^. N: w% a
char c=csym; csym=0;
) J! D% B( m b7 q
switch(c){
Q+ x' l7 J+ @+ O6 e5 E6 m
case '+':return t[0] += t[1];
7 R1 `+ F' z" h' q- c( S
case '-':return t[0] -= t[1];
: u, O* w# e6 S
case '*':return t[0] *= t[1];
" z3 n; c( j4 p
default: return t[0] /= t[1];//case '/':
7 K+ X1 A7 w. y! x, K# V
}
2 _0 f6 A: w2 o4 O; g, ~
}}
5 j' k4 c1 m7 x) L6 f
template <class _T, class _Tstream>
! b1 h9 @4 R: Z
/* _Tstream: inputstream, _T: get return value
7 d E' c( y! U4 U; x7 M
* Return nonzero if get value successfully */
0 Y( T$ x+ u) \
int GetExpValue(_Tstream& istrin, _T& nReturn){
7 [ s+ r# [, o0 s. I
_T t[3] = {0}; //雨中飞燕之作
5 a; m( x; Z2 [& d
char csym[3] = "++";
3 @2 x% t& Z" G9 v# I, L
int nLevel = 1, nERR = 0;
# V: x w; q2 S# q
if(!(istrin>>t[1]))istrin.clear();
% K' s4 V6 g4 ]+ j! F" p
for(;;){
) G3 b0 H" }9 C( W* e
if(istrin>>csym[2]){
4 Q8 Y N8 v3 L8 O% \
switch(csym[2]){
! a8 M; v5 C+ ^; j; r: w
case '(':
! Q; B5 o D" ~6 F
if(!csym[1]){nLevel=0x100; nERR=1;}else
! ?5 l/ L/ f+ h1 p2 z/ M
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
' N0 x2 u# a4 [$ R- P
else{nLevel=0x100; nERR=1;}
, F4 z8 E7 B$ ]3 \; E3 i
break;
' @3 U1 x& U- @4 T2 ~9 u
case ')':
! I* e. h- l: ]% J' O% I* N3 y
{nLevel = 0x100;}break;
7 q3 X3 \, K; D1 I' D3 S! T1 n
case '+':case '-':case '*':case '/':
0 O% x4 l# s2 p6 P
{csym[nLevel++] = csym[2];}break;
4 p9 k% x* \0 R/ ^7 z ^8 W
case ' ':case '\r':case '\n':case '\t':continue;
3 |: V; e. U9 j) l: }9 d) c$ r
default:
6 O4 X, Y% m, T& L+ }1 x
{nLevel=0x100; nERR=1;}
! l( ]& @$ _- g* I! `/ ?0 Y5 L# }: R
}
( Q% |2 U% n; Z2 N4 n0 n
if(nLevel==0x100)break;
& E$ ]. |: P" l) Q6 o
if(nLevel&0x10 || istrin>>t[2]){
% H- n. G- `7 G' m
nLevel &= 0xF;
0 ]% X$ \$ i; [- @+ ~# J
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 C1 c+ u) O' m: ~1 K" T, X3 I
if(csym[1]=='*'||csym[1]=='/'){
1 f* w1 ]! E9 M6 w" w
GetExpValue(t+1, csym[1]);
, U" A* }( O4 p/ f
}
7 [% j7 B/ }- V) \4 k. p
else{
( E$ g3 D' c8 ]- [1 e8 B
GetExpValue(t, csym[0]);
, p8 d! E, ?9 S
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
. F4 }' i f1 d; V% l+ [
}
4 R) t+ E3 \9 K
nLevel = 1;
( f) L6 b1 H/ }3 _7 p% v
}
" H2 f# t/ i' v1 t7 X/ I, s6 |: v
else istrin.clear();
. \# c; A' L) M) h
}
3 Z' M1 g3 e& @& A5 f
else{nERR = -1; break;}
! Z* n' ` `! @+ y# f5 F7 G% Z0 t
}
( G& v9 ~. S8 d# m+ p1 u% N+ Z
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 d2 g' E, H- g7 @
else nReturn=GetExpValue(t, csym[0]);
$ O1 k+ E( g" ^" v# F5 G/ X, F) O
return nERR==-1?1:0;
* ^6 |) u, h5 A4 S
}}
5 N3 ~# y7 v; M5 b4 [
N5 P* t9 K6 `0 J4 ~4 ^; V. L
+ i) j! J; x( R3 {- r8 f
9 `/ i/ C% _) d% f
函数模板使用示例:
6 ^0 Q$ ~' c; V5 c
在以上那段代码的后面加上以下代码:
; t- y8 l& a2 Q C4 Y, P" A
% {" x r; N* f$ I* q
/ h7 @3 ~7 |0 c# @! Y( u |
+ R% }; K" K8 m4 \4 @
程序代码:
, c, i2 _1 N8 }/ b" o$ ^
# _, [/ T- c' w7 K0 e1 S& ?/ }* Z2 y. }
#include<strstream>
$ G5 i9 x2 E, `
#include<iostream>
5 H/ W. w$ l/ V( C- q7 ?+ A
#include<string>
6 }0 {% U; m" a0 B' e1 G1 b
using namespace std;
0 }5 m0 y6 K/ f3 c- k
int main(void)
# }9 n% H& U1 U' i5 S6 Q
{
, q& g# w: s8 a
string s1;
! }0 Q$ z+ g2 d4 G1 W1 L( ?+ G; o
while(cin>>s1)
( R1 _( ^* l& D, c; n3 G5 }
{
8 T# {8 ?( B; |) w5 [; J5 J( o
istrstream isin(s1.data());
8 r7 q( A' M8 K2 J' @
double d;
0 N9 W* i; X+ s# b# A
if(fy_Exp::GetExpValue(isin, d))
7 e7 E1 G9 M! Q/ M! T0 u
{
" h; i9 E) H6 t, p* D
cout<<d<<endl;
' s T y9 P8 m/ V b/ L
}
& J( \# \9 B- N& K
else
( A W5 x8 T6 A v6 C
{
1 O( o- q: t3 j( S
cout<<"ERROR"<<endl;
% d3 S* Y; c; o0 g% E. I
}
) V( N* j: t5 P1 K
}
+ i( r3 n4 s) i* \0 _: R! |% {/ J
return 0;
6 E& Z/ R: E& J& m; ]
}
5 p6 U& G0 M) i8 c0 o7 n; l
4 D9 j/ g6 |6 {6 q3 \% P
; Q: u- U/ I3 ~0 p( v0 K
然后编译执行就可以了(*^_^*)
0 t5 N/ y! _0 y# X' T0 _
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
* B# b4 g% Q7 w* k) s9 ?
建议使用VC7或VC更高版本,或者使用GNU C++编译
欢迎光临 捌玖网络工作室 (http://www.89w.org/)
Powered by Discuz! 7.2