标题:
一个计算四则表达式的模板
[打印本页]
作者:
zw2004
时间:
2008-1-21 20:17
标题:
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
6 g! ]! t8 m% z* R# k, m
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
" Y% v. g, z9 I# g0 I! c
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
& B! z4 m {4 p) Q8 [. S
参数解释:
1 F( |5 O- x* l- J
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
) `3 m, o3 `5 z- D3 l) R
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
$ o. @8 y' A/ L& V
返回值:
& ~" A8 P' J: N# ~2 P6 m
返回非0表示计算成功,0表示计算失败有错误
}$ X4 H& Q5 u
( {- V9 |5 X2 ]0 J9 ^
2 M; L4 k* ^% R* K! {+ E4 t
# ]! u$ r' x) u/ k$ R& q
程序代码:
6 F' k7 J$ ?6 V1 K. }* Q5 u; u
" D) A% O8 J6 ]) _
namespace fy_Exp{
5 ~* d* z( W% _ J7 E$ U W7 h
namespace {template <class _T>
+ ?, s' Q! @. r# c
inline _T GetExpValue(_T t[], char& csym){
- z& _" L8 l! \* F: L+ G" f: w
char c=csym; csym=0;
" |5 o; `3 |$ K3 `- c
switch(c){
& O' b. U( G! O$ M% L
case '+':return t[0] += t[1];
$ r8 |' c4 k' w M+ r
case '-':return t[0] -= t[1];
: t" s) {: k; J, j: }
case '*':return t[0] *= t[1];
. [4 M" d2 |( m& P5 V% n) H) q5 u
default: return t[0] /= t[1];//case '/':
( ^3 J* h |; g5 O* o
}
. C7 N4 D6 D5 n* p7 d5 u+ L5 A
}}
# l- Z% w8 b8 o: l2 h
template <class _T, class _Tstream>
4 V$ d8 y/ P; v& y" ^5 F) L
/* _Tstream: inputstream, _T: get return value
( O) D( P3 n5 ?4 T r/ A0 [
* Return nonzero if get value successfully */
/ S: @+ L! Q9 {3 N
int GetExpValue(_Tstream& istrin, _T& nReturn){
6 {' f# n, Y4 r4 r$ }. m1 O }
_T t[3] = {0}; //雨中飞燕之作
$ [* P& ?! G5 f- L; k
char csym[3] = "++";
( n% s1 P; V% p$ d1 m
int nLevel = 1, nERR = 0;
. X1 S) y, x; o/ e+ p& ~. E0 H# W$ d
if(!(istrin>>t[1]))istrin.clear();
) T: Y$ K/ v1 g0 y
for(;;){
* i0 S* @* u, q! o
if(istrin>>csym[2]){
$ w9 B. J1 k. o% \: ?6 c: d
switch(csym[2]){
+ z2 R; R* S# Z
case '(':
% w4 \/ u$ A! F0 k+ j- E
if(!csym[1]){nLevel=0x100; nERR=1;}else
, v k* H6 g) s" x
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
" ^/ f6 E0 z2 o# T/ h, [
else{nLevel=0x100; nERR=1;}
8 _+ n3 P( _- I! k
break;
6 ^" ]3 a" S! ?& C1 U( {7 c
case ')':
j4 _, X" R. R4 q) Q' ?
{nLevel = 0x100;}break;
% V( x# n4 E6 j. t: k. z
case '+':case '-':case '*':case '/':
! l2 |, i+ X# V% K/ H3 b
{csym[nLevel++] = csym[2];}break;
2 w% L/ k% B7 r! K
case ' ':case '\r':case '\n':case '\t':continue;
( f# T: I- k& m2 W( i
default:
; P! M7 P# A6 s8 x
{nLevel=0x100; nERR=1;}
! q; W, b R2 a1 m/ t
}
8 s i7 _+ g" K" A# G2 G5 v) }2 i
if(nLevel==0x100)break;
4 r3 F/ T$ Q" |" U7 x- m
if(nLevel&0x10 || istrin>>t[2]){
. @' u+ U+ U4 v+ j5 p: y" a6 s# m
nLevel &= 0xF;
5 K2 q, F- U1 x+ F1 v/ V
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
* I9 e8 ^ r7 x/ p s0 L" T- T
if(csym[1]=='*'||csym[1]=='/'){
5 Z) ]5 k7 @/ ?) o( |" ?5 D
GetExpValue(t+1, csym[1]);
: z) _ N, y' Z" ~
}
4 }# G+ F+ e) {2 O
else{
6 J7 t# B( c f, a: V
GetExpValue(t, csym[0]);
5 w# a" i' p' S' v2 s6 }
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
( m- a2 H& V0 X0 y; o
}
- L0 {; A- @' D5 n, N0 W2 h
nLevel = 1;
0 ^: b- a. J/ S0 c. ]
}
+ h" i R* W* \ w, Y. ~% b9 J; U
else istrin.clear();
% G! {/ d3 Z4 M0 ~* ~
}
2 s" C. y6 E# Q4 M J8 g9 g0 \8 D
else{nERR = -1; break;}
* ^/ C- f$ ?! U# W* y
}
/ x+ s- m& o0 p# R% R: ^5 M
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
, h( P; Y& [5 N9 S
else nReturn=GetExpValue(t, csym[0]);
$ p8 W P* D- Q& P8 a
return nERR==-1?1:0;
' x$ y4 ^0 [6 V3 {1 G' j2 C
}}
& {! c: P) `) G$ _* D
, E+ v, a) X" Q; `
4 `) k' p0 Q1 f: _6 w
% \0 n A: k) I! J' H0 @
函数模板使用示例:
L' S3 ? g% b8 g9 c" b
在以上那段代码的后面加上以下代码:
6 Y, ^' g+ j- i9 U# N4 n/ _
" e/ d9 \( z0 y7 K- k' B0 U! \
q6 f& N C, E! E3 d7 ~
" l* {. T# b) c6 r* R
程序代码:
2 D, n: p. a9 y6 H4 \, V4 @
6 F' c/ H3 h& ~
#include<strstream>
! a) y* O! c7 ?4 y6 m, v
#include<iostream>
]2 g8 T8 F7 T4 Z+ a5 o# Y
#include<string>
* F2 z& _5 K4 Y6 S$ a! B4 J
using namespace std;
J5 g- C7 t" `+ |! }$ d( C
int main(void)
" d$ s; {0 p0 L: D+ P4 j' C" j: K9 u
{
. E$ l4 e# T5 B1 C4 |, \- V/ o
string s1;
: Z, I7 X. B5 S8 U- G
while(cin>>s1)
) \8 c. S/ s3 g7 K5 E0 e
{
1 ^+ f- t3 d+ M( P6 t# v) n. e" E
istrstream isin(s1.data());
- j9 O1 u1 d" m* j g
double d;
& z w7 A; d4 t5 ?* ~* z4 ~
if(fy_Exp::GetExpValue(isin, d))
) H7 u' P: a7 M4 u
{
, K# @: o/ I. p- K+ _
cout<<d<<endl;
: g# V* A! }3 C# A, P" o+ P* |' N4 z5 H
}
5 G( w: D! o& b, u) q
else
" U) H3 d [3 R' q5 N
{
) |, R% J1 b, d" D9 e. X
cout<<"ERROR"<<endl;
& ?% v: H/ _4 k
}
, s; ^; C; h- ?! @/ l5 |* T. H
}
3 t0 Y% i: T3 o4 I$ i1 M) T
return 0;
% o5 G5 Q4 U7 R$ ~3 ?
}
7 } ?' t, a2 P8 i. N
( a( b9 A4 a5 t5 m4 I; s8 q2 N
/ f6 F2 U; B3 M& q) A4 L
然后编译执行就可以了(*^_^*)
6 V3 S+ i/ H9 o7 z
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
" y5 v9 M; R4 w1 s
建议使用VC7或VC更高版本,或者使用GNU C++编译
欢迎光临 捌玖网络工作室 (http://89w.org/)
Powered by Discuz! 7.2