标题:
一个计算四则表达式的模板
[打印本页]
作者:
zw2004
时间:
2008-1-21 20:17
标题:
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
$ M$ P6 I0 O0 M" N2 ]% _
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
/ M3 o: ^* u- g* ^
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
/ J' S( D& h0 b$ s! M& \% F
参数解释:
. K/ Q, ?- s/ J' H! i( Y8 ?# e' h
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
% q0 W+ }( o4 m
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
0 x5 O, b. ]" c' v8 F4 y2 p4 m4 o
返回值:
- e) |) w) M; g9 o+ q7 ]
返回非0表示计算成功,0表示计算失败有错误
* r+ g, n& `# w+ o5 e
- E, B& X& p& {6 y6 E
8 d6 \% }" f, U9 Y& d9 Q% u& h
* v- K: u5 r8 Y% N0 E4 d0 A
程序代码:
6 \+ V6 X. m- D: @8 I
+ Z" L7 f0 D! X2 B5 T
namespace fy_Exp{
+ s4 Y8 C V. f7 d
namespace {template <class _T>
4 f9 X5 P9 t U# P! y- N7 [
inline _T GetExpValue(_T t[], char& csym){
$ E$ B4 `& x/ ?2 x: Y: R
char c=csym; csym=0;
4 h; @9 `4 E& }& V
switch(c){
4 G4 j: o; k S( b e9 g( C
case '+':return t[0] += t[1];
' H/ S% f/ K( [6 ]
case '-':return t[0] -= t[1];
' w; R: O9 \ j% g3 c
case '*':return t[0] *= t[1];
4 P, d" N! P* n- F0 S) f8 Y' K
default: return t[0] /= t[1];//case '/':
6 c' H- F. I" x4 D) i. `5 M
}
& C- ~/ `4 T4 n5 G' R$ y& I. [
}}
/ \5 x" I. q5 z0 W7 x8 ^
template <class _T, class _Tstream>
+ U c0 l& l6 h) W- L7 f: U. h
/* _Tstream: inputstream, _T: get return value
$ `! c) y$ i& D6 @( x
* Return nonzero if get value successfully */
% H, Y7 ^+ g# s C4 E3 F
int GetExpValue(_Tstream& istrin, _T& nReturn){
3 O6 O F! ]1 N0 r. b/ \
_T t[3] = {0}; //雨中飞燕之作
8 o/ w7 X$ W% Z/ }
char csym[3] = "++";
1 S0 U8 L# x+ }8 u
int nLevel = 1, nERR = 0;
- _( v( j% H/ H; E
if(!(istrin>>t[1]))istrin.clear();
% H# @) g9 t9 U9 b% k
for(;;){
# r4 y" }9 ?& C
if(istrin>>csym[2]){
& d4 k$ I5 s$ W$ B6 t" w8 |
switch(csym[2]){
0 a2 F( s& L ?4 \
case '(':
) j4 Y! V) f" a" D
if(!csym[1]){nLevel=0x100; nERR=1;}else
4 [8 g, N. r* f, `/ P
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
. z% l' q# x; H" b
else{nLevel=0x100; nERR=1;}
! }3 }$ Z; }7 P. I1 Z
break;
1 m% s1 z0 @: p) v" V! y. ?8 B' F
case ')':
% j5 g& i* ]. Y$ G W" U
{nLevel = 0x100;}break;
0 o* I6 Q2 v) o; N7 r
case '+':case '-':case '*':case '/':
" o3 j7 k* R9 J) K% g# H: e4 {
{csym[nLevel++] = csym[2];}break;
* a: e8 ? Q0 ~8 K; l, }) J
case ' ':case '\r':case '\n':case '\t':continue;
: V4 W t2 @! O/ R7 j
default:
- [+ Q: w, W% `' ?! [* Z
{nLevel=0x100; nERR=1;}
; l! g; G. L% @5 X2 Z
}
: S) W6 V8 c- I, b) k
if(nLevel==0x100)break;
8 z: r6 w1 ]0 j0 v) A
if(nLevel&0x10 || istrin>>t[2]){
7 x, d+ K: {6 j7 P
nLevel &= 0xF;
2 p' c8 \% a# m* ]7 [* W5 A, Z& t3 V# {8 l
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
8 d* F& v4 U7 w" N4 c5 d6 H4 z
if(csym[1]=='*'||csym[1]=='/'){
, [ L! b, Z. Y3 [& V
GetExpValue(t+1, csym[1]);
& t1 y# z4 O9 V5 E. @! u
}
. o4 r8 |% U- z3 \9 P& K
else{
: l m2 W! P4 I/ v' }
GetExpValue(t, csym[0]);
$ A4 J% X8 K$ [7 J* c# S
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
7 ~: _# W4 V& E
}
0 G' z8 W" b* G: x
nLevel = 1;
3 F. |. a% j7 a
}
; l- E/ R1 R7 x% d- l
else istrin.clear();
, r7 Q5 c7 x- \% `
}
: O/ B0 X3 C( A/ `2 x! X
else{nERR = -1; break;}
$ w* G" n+ y2 ^+ v: @( i% T9 O2 Q8 `
}
, k- i- K% J3 A- [% S3 F
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
2 {: x& F2 | l! o4 r
else nReturn=GetExpValue(t, csym[0]);
( O- D8 i7 S) o1 I
return nERR==-1?1:0;
/ Y% _; F0 C& t# M5 j
}}
, k* N% m+ F7 @2 g% t8 t
; {( t! G! t( H2 u: @/ r! e# e2 w
! v# e. R L# C) V& X* I
7 m1 S2 a! y6 }/ f2 ^3 Q
函数模板使用示例:
; f/ f+ Q/ b" a
在以上那段代码的后面加上以下代码:
( X( R/ e s2 `4 w
7 t; W1 s2 l. ]: A
6 I5 P' g% T' X0 p, L8 H
3 ^1 F9 D0 H/ G+ A% `
程序代码:
+ ^- v) \+ j t$ x" Z
6 ^9 U* m1 ^( K* Z
#include<strstream>
& ~7 K% M+ j1 H# u, D& _2 C4 p
#include<iostream>
) R5 ?9 U* m2 i
#include<string>
& R) z* O( l" ^$ ]' f4 w
using namespace std;
/ v$ t( U8 f/ `( A3 X( {
int main(void)
2 N3 X1 G$ K* f, C, x1 a+ q! O
{
: R( W5 y4 r& B6 Q
string s1;
% E' M$ Y$ i! f( s! O
while(cin>>s1)
% _' A7 W0 }' V1 U$ n* P
{
) F6 c! n8 ~' N; L; D2 V
istrstream isin(s1.data());
" w, L1 H8 m* D% E( v
double d;
1 {7 x, o M0 W+ e( }3 c/ t# \8 o7 `
if(fy_Exp::GetExpValue(isin, d))
: s, L5 P: y2 t! k8 I7 t
{
# C- C1 X8 S# G/ W! L! P
cout<<d<<endl;
S7 s1 T& `8 G
}
( S- C, Z [- G9 F G0 {$ J
else
0 L& x% W3 I/ y, ?6 q5 H9 U
{
: \% \. s# Z, X' i4 B; W) P
cout<<"ERROR"<<endl;
9 D; ^# {# _) y" A
}
0 A2 d* X/ Q; D2 Q$ I! u
}
6 S, _' {, D$ [: z2 {: }
return 0;
% V- j4 ^4 \) B$ L+ X
}
* O% E1 R" i+ q7 a: R y
7 r e+ M$ V2 }: A
8 h3 Z# X9 a! m6 f" x. R" `
然后编译执行就可以了(*^_^*)
8 b/ |. P: Y5 L; l) h7 E, i
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
. q- B; {" D% z7 @% q5 a( ?
建议使用VC7或VC更高版本,或者使用GNU C++编译
欢迎光临 捌玖网络工作室 (http://www.89w.org/)
Powered by Discuz! 7.2