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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的, x, y; K' [1 H- Z
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式) x# s9 o6 O# U" c8 q
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
3 r- y* h' Z- s2 Y- L参数解释:6 x5 h) |/ g4 F0 B
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流! K: i3 i* ]9 j6 G$ Q! t5 c
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
5 r/ V+ k2 l' ]6 c0 `' I返回值:2 l1 i0 |& b( ^ G6 R+ G
返回非0表示计算成功,0表示计算失败有错误
6 c9 T, k$ P1 {6 K3 y4 J! W0 X- W3 [3 m
8 Q& d o" N! W! b ]$ ^ a w+ ^* B$ z5 L- _) m
程序代码: 6 c( d7 ?$ p; ^* E
0 M2 j- n4 T; I! {+ q& {% L6 B1 k
namespace fy_Exp{
: n4 v! r. |4 Znamespace {template <class _T>
# e f0 q' Z$ r) l5 V3 }inline _T GetExpValue(_T t[], char& csym){( t$ x) q- V& K( A* w6 n% S. h
char c=csym; csym=0;
6 F8 A. o: O$ d" m& ~ switch(c){
3 G0 X+ B- Y( n0 m case '+':return t[0] += t[1];
5 h) A( j! G: p3 f) X7 a) x case '-':return t[0] -= t[1];
; \; J1 M) A+ a8 U% G1 ^ case '*':return t[0] *= t[1];
( F* V9 h/ Z+ ?8 G default: return t[0] /= t[1];//case '/':
2 P9 k0 L1 ^7 I }2 h! I6 ^+ Q" k9 E4 A! l
}}. ~1 G! U& G, q" A2 ~
template <class _T, class _Tstream>
v* ~# |6 s" |/* _Tstream: inputstream, _T: get return value, P }( |0 {3 Y; Y
* Return nonzero if get value successfully */
& w& z. a" \# Xint GetExpValue(_Tstream& istrin, _T& nReturn){
3 c( h6 ^ E# K6 K* z _T t[3] = {0}; //雨中飞燕之作9 s+ H, y: X( l+ o n K
char csym[3] = "++";
8 ]- ~- _; V: P$ C+ V- b. j int nLevel = 1, nERR = 0;9 u' Z2 \0 J+ {( y; C5 v, @1 M
if(!(istrin>>t[1]))istrin.clear();6 l0 _3 U0 V) D! F' O: L: ]5 _
for(;;){" G* Z8 L0 Z# Z/ A
if(istrin>>csym[2]){
1 F: @% p D# k switch(csym[2]){
% ^1 m' S* Q1 C case '(':
+ W7 K+ v3 v) `0 }3 q1 F5 [* K' j if(!csym[1]){nLevel=0x100; nERR=1;}else6 F' u6 W5 Y& B5 c: J5 I$ x
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
; R! }$ y" _! \! z else{nLevel=0x100; nERR=1;}* Z, s4 m) w- d$ h: r
break;* x/ A8 `$ h: U9 z/ L- A% [6 K
case ')':; Q) F3 `/ s0 ]& Y2 B* l% Q
{nLevel = 0x100;}break;
9 i' e9 ^' A' q2 ~. m case '+':case '-':case '*':case '/':5 h) S& K6 G" x4 F) u' v; f
{csym[nLevel++] = csym[2];}break;
) ~9 d4 k' |6 E( r! `) I case ' ':case '\r':case '\n':case '\t':continue;
2 B" j2 O$ @' A6 D9 U default:. E0 U& T# C2 E. @1 c" u- q
{nLevel=0x100; nERR=1;}
0 f# @: g% D. Z! w/ ] }
5 ~. A) r" M8 N: K* I6 } if(nLevel==0x100)break;9 a- B' D( b g
if(nLevel&0x10 || istrin>>t[2]){/ Q9 M. f/ k1 Y% X4 q
nLevel &= 0xF;
z- U! t8 U- s# F" h if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
' `: n4 L T6 Y" n4 W* N. ? if(csym[1]=='*'||csym[1]=='/'){. G `/ x" j+ _: \
GetExpValue(t+1, csym[1]);
( g1 l" v5 j" \$ z6 F! I y }, w( c+ B. ~& y$ L% j5 t8 N
else{/ G2 x# J6 {' u# c
GetExpValue(t, csym[0]);
7 ?3 @2 I! f- \& ?* p t[1]=t[2];csym[0]=csym[1];csym[1]=0;6 c! t9 b3 R. A: Y2 |/ S6 H( S
} @! F# h. i7 b `4 B
nLevel = 1;$ N2 t6 `) Y/ [$ G# i5 S* X
}
( A$ i7 F6 M0 O0 {+ F' c else istrin.clear();, D; r' @6 N+ ~ G O. P4 `
}
, P8 _2 R8 L. f) a9 M5 O9 X6 B else{nERR = -1; break;}
# E- E* S% g& C2 W' O1 U6 ]8 u6 J- _3 r }/ @; x$ v" m% ?8 x0 S. T% H
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);8 i* ]( g! Y) a# m
else nReturn=GetExpValue(t, csym[0]);
0 W" n6 J: I* y0 `6 d& T return nERR==-1?1:0;1 X; R4 ^! x8 o+ O. V! ^
}}
6 g3 D& ]/ |; ~( u
8 d% k8 V: n( f
7 Q$ m3 t. Q+ s' B! U T! y1 B5 V$ B
函数模板使用示例:; a& p: ^; v5 L8 k8 ?/ a
在以上那段代码的后面加上以下代码:
$ G) ^- s \& R% _4 y7 w
% X+ R% l& c! U" Q 2 v; F+ ? X+ |# w# M# j& o5 M
7 l/ {; ?+ [! A8 F4 _# i, a) W% [% Z
程序代码: , [8 Z9 x8 H* X' [8 a. H
/ N6 R7 z$ H3 Q9 ]$ s. i" v#include<strstream>6 N8 ]4 r0 g7 w$ x
#include<iostream>' w9 g( g, o6 U
#include<string>
; X% @! m' o8 h' a/ h( dusing namespace std;
" O( K0 ^+ l: e( K; jint main(void)/ }1 H2 l) j- }, z4 O& R {7 e
{
o% ^5 Q+ c) M3 ~' i R string s1;
4 `% s- P W5 L, Y/ m while(cin>>s1)
N% J0 }5 z, @5 U/ `( k# r {
% J' Z H( v# J istrstream isin(s1.data());. @. a j$ x( }* _0 j: p4 i
double d;5 c0 L( P5 u; \0 n- g
if(fy_Exp::GetExpValue(isin, d))
( l/ S+ F7 _5 P, Q7 |7 u/ L {
* v c+ O) X. k8 q& ?' d8 q cout<<d<<endl; H7 o6 x9 N. d' h6 s4 z) r
}
" R- E* Z1 x4 A+ |4 Z w4 ~ else; [* n! r) d( U. J5 q2 |
{
4 [" ]/ p4 E, U" { f. k/ u cout<<"ERROR"<<endl;
* O) p3 k4 n) @: |! y6 o1 y; ^ }
. G5 Y! x* ^3 E; N }# A+ q6 G, H3 Y' r
return 0;: h* v; g. d) v3 N) |: H
}( w; K9 V! A4 I' T6 j6 [
$ c2 Q! k+ U* [. ~/ {( J& z) o$ o! c
' g+ g8 K8 @& Z4 L# y e
然后编译执行就可以了(*^_^*)
& C) n! P8 d7 X& \% Y其它:TC++上一定编译错误,不保证在VC6上也能通过编译. [; P6 a" | c2 H4 o q8 C
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|