|
  
- UID
- 133
- 帖子
- 51
- 精华
- 1
- 积分
- 186
- 金币
- 55
- 威望
- 2
- 贡献
- 0

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,0 t/ e& F& @' Q. ?& G2 [& {
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式1 H5 s! H z) P ~+ X6 Q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
/ {2 v$ ~2 W$ W: P U2 b3 M参数解释:
- g, {2 e* |/ @6 W) ^istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流1 D# k6 l+ T4 c: r" a: ]
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定7 o5 E" W& c7 O, ^+ w: H9 N9 {/ i
返回值:
* L! h. O3 L( C返回非0表示计算成功,0表示计算失败有错误! U! {6 o- j$ }) I
4 y: O! J3 g- {/ A9 ? ( P& o/ y8 u; d; L4 }' C
9 Z6 q8 g, }0 ^$ e
程序代码:
) g; F0 C- d7 N" M' V6 g( ]
/ M9 _. l( N! j! J" {! a% enamespace fy_Exp{
# @9 H) L0 I- A( }' @3 x$ e1 [: N5 {namespace {template <class _T>
7 v8 e4 p9 c8 D6 y; `inline _T GetExpValue(_T t[], char& csym){
/ F2 e6 I: p( b! ~4 U5 g char c=csym; csym=0;0 w3 o2 F2 p' G, B/ S: t; ]2 G; P
switch(c){2 N6 q, P3 C# X# [; L5 D- n% D
case '+':return t[0] += t[1];
% x& _1 R+ x0 V' C& l case '-':return t[0] -= t[1];( p" g) I( [) ^, b1 h- b) f
case '*':return t[0] *= t[1];
* p: V3 Q% k% D default: return t[0] /= t[1];//case '/':1 a e" j8 r; q+ j$ o! u
}
- ], I! k! T% J3 Y6 f3 ^}}
9 }7 m" }# q, c& T" |; X) Ptemplate <class _T, class _Tstream>& c% }# G. r& W9 G/ J
/* _Tstream: inputstream, _T: get return value
9 S2 E/ G: Q/ ]2 \4 k& q U2 J* Return nonzero if get value successfully */
; p$ C0 R0 _. T& ^9 Z6 B) Tint GetExpValue(_Tstream& istrin, _T& nReturn){% }% J/ y8 \4 h: X* W# |/ f
_T t[3] = {0}; //雨中飞燕之作" j, M9 X+ B- g" U* U1 c7 A
char csym[3] = "++";
- Y" v8 t. Q' x# b0 f int nLevel = 1, nERR = 0;
% |5 w1 }$ J+ N& E7 c if(!(istrin>>t[1]))istrin.clear();8 f$ T( X& x& ^8 E B( m' N" h
for(;;){
5 }9 i5 c) w S$ d if(istrin>>csym[2]){ v* b& R+ f- z3 [# U4 W
switch(csym[2]){/ a/ T/ j+ P; x6 e
case '(':7 d$ f8 m* I; j* O
if(!csym[1]){nLevel=0x100; nERR=1;}else
$ _ s6 X) J; Y2 c if(!GetExpValue(istrin, t[2]))nLevel|=0x10;0 W- I: }1 P2 N- C5 e: R
else{nLevel=0x100; nERR=1;}! s4 `% \2 F, B
break;
0 q ]* l" t4 @6 d# r' | case ')':5 p: Y1 U3 M- O. s3 Z$ }$ C
{nLevel = 0x100;}break;
/ Q4 p- z1 `0 L4 U1 w case '+':case '-':case '*':case '/':3 ? E' R! }9 m2 B' s D
{csym[nLevel++] = csym[2];}break;! X3 A# p5 n( ^6 \# N0 u5 t# i
case ' ':case '\r':case '\n':case '\t':continue;7 R X2 i, o+ A% B5 X
default:
' y/ F' k X7 n; c) d' g+ n {nLevel=0x100; nERR=1;}* a1 W( h+ x5 M" W0 W
}+ z& b8 ~8 Z- W% c, b1 W( P0 {
if(nLevel==0x100)break;
_9 _" n6 b8 ^ if(nLevel&0x10 || istrin>>t[2]){
5 d1 M( v. v0 u m% \$ O$ I nLevel &= 0xF;% P; h; N. X( L0 }
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
6 @0 I) z3 k9 k: V if(csym[1]=='*'||csym[1]=='/'){
) Q. h7 v/ Y- t" e' x, b- L( D& |# W! X GetExpValue(t+1, csym[1]); `- Z6 ~+ j% a# P: i
}, w( |6 b& q d$ g
else{
; ?' @; w0 P6 U5 ]* P m4 m5 o4 ?2 o. H$ B GetExpValue(t, csym[0]);& d/ m3 {! N3 E$ O
t[1]=t[2];csym[0]=csym[1];csym[1]=0;" O7 j" h' O; h6 Z3 S! x# `
}/ E) V$ X7 T% S& D
nLevel = 1;) L7 R( N; C! Y, h7 o
} ]& ^* x- H7 Y# F x, W
else istrin.clear();. |6 o: v; ]8 u+ y# m
}1 @3 d+ h: ~' Z, _) D- W
else{nERR = -1; break;}# ]( ~: W* i, R
}
4 I, Y P9 ^8 S) L9 z) q if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);9 Q+ n& j: `* |' d4 x6 h( q U$ C" B: V: r
else nReturn=GetExpValue(t, csym[0]);
" f4 \/ S6 X! p( L7 k& E% H return nERR==-1?1:0; E* P' W( ?. A/ A% J5 Z! r
}}3 {+ ^% d- p) }/ C
9 f; N6 y9 g L0 @6 H+ o) x" j0 m1 \( c2 h
# q8 k! d0 [$ @2 W1 [" b4 \0 ^函数模板使用示例:
% e' e4 |" d. s1 P( G在以上那段代码的后面加上以下代码:! @3 U5 F) @" E
^2 v4 \' c3 a4 `3 n
; j3 j5 e \9 f& e) q7 d$ T; _+ K( K( o
5 e) _. T5 C, v4 |程序代码: " M# k+ m2 ?) L8 l2 g: h
, m6 K( ^$ S: X2 l7 k
#include<strstream>' y7 U7 T1 K6 G8 y/ T2 |$ v" i0 z$ P
#include<iostream>
" q/ `1 P) o' x' [; C3 l#include<string>
* {; b' a$ y0 \( r! ]0 n0 ^4 Eusing namespace std;( n7 X. C- C; K: t% R3 l& D- m; G* S7 U
int main(void)$ x0 F5 D# d9 a4 _
{( I: x! y# b7 a4 Z3 h
string s1;
" q" c( j" K. }' y/ p( q1 h while(cin>>s1). Z- ^& H6 Q% l0 a+ ^2 R
{
1 U3 M1 t& Z6 P. C* l# X6 ~" r6 @( L istrstream isin(s1.data());9 M) x( R2 i( L" c: \9 }
double d;2 M3 g! g% I2 a( |/ c% R/ ?
if(fy_Exp::GetExpValue(isin, d))
8 ?5 ]( M5 z4 k7 J7 U7 }% g {5 L$ n1 U5 U. |6 ]
cout<<d<<endl;
, c/ D. J- y7 K2 A3 R. B }
' e1 H3 [* z5 ~5 f: v else
! [! B$ K/ J3 _; i; {6 P {
# j! H$ K& g& `4 R8 T cout<<"ERROR"<<endl;1 @. ?) a: D) t3 t
}. L2 ]9 G6 |8 K, F; f$ n
}
( N/ E, N9 P5 v& w return 0;6 {) m& @3 [+ n- \1 k
}
+ B3 J) [9 K- v# ?# B3 d k" p3 [8 N2 |1 s3 @* k
( k, Q7 r( y* v( }1 L& P然后编译执行就可以了(*^_^*)
0 w$ `6 T; B" P% i- ]- P! y: [其它:TC++上一定编译错误,不保证在VC6上也能通过编译% R1 ?# a9 Y- Y# H) _, O* Q6 V7 T
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|