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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
* }# e. @/ i6 [, R8 u! {. Y* s一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
( b3 g8 a0 y9 m: u: ] @: L$ y只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)3 o6 M* M* a& r) I
参数解释:
( _: ` _2 R8 n+ Tistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
- b E' L! G! v7 ]nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定% q( ]' \% r, E4 {7 c E& X9 B
返回值:
; z. f7 F7 d( L* z; U3 ~返回非0表示计算成功,0表示计算失败有错误
# y$ F! @ f$ [$ a
8 T8 L+ P7 a- a+ Q% c& W5 S5 D : j( c4 z3 @9 D7 Z: ^, s' h: o, o
; }2 }) F6 }0 i( a+ U* \
程序代码: & I: @ _; E: D2 C0 P1 G8 f
* Y8 Z4 y; \* }% r
namespace fy_Exp{& j, A+ j4 ?" |* N3 f
namespace {template <class _T>4 f5 G3 K7 z! V- N7 _
inline _T GetExpValue(_T t[], char& csym){
B" T5 k w8 d! _ char c=csym; csym=0;+ L0 c4 @( _& V
switch(c){
& \7 a( \; J. i6 g, Z: r case '+':return t[0] += t[1];
, y# H! A2 I$ r, t. v case '-':return t[0] -= t[1];
# {$ G3 n" j- Z$ b, j case '*':return t[0] *= t[1];1 w3 n. y8 L% x- d" Z0 _
default: return t[0] /= t[1];//case '/':8 J7 o( M) R8 C6 G* O2 r7 c' v9 L
}. a, l" R& g) D( \ F1 O9 D
}}
6 ~" I0 N, @( Y* Stemplate <class _T, class _Tstream>3 F7 h9 [9 e7 q
/* _Tstream: inputstream, _T: get return value/ d2 n7 h& l2 @
* Return nonzero if get value successfully */6 K# Q, z2 T6 C" H
int GetExpValue(_Tstream& istrin, _T& nReturn){
8 t K6 x) _) k9 { _T t[3] = {0}; //雨中飞燕之作
0 C( d1 N& Z: M, D/ \, N char csym[3] = "++";
; f1 V3 f8 q( @7 `: ^ int nLevel = 1, nERR = 0;9 I9 s3 K. _4 D G
if(!(istrin>>t[1]))istrin.clear();( d& B; L# i' K1 t+ p" ?) C
for(;;){
6 n* S" o4 v9 N6 s if(istrin>>csym[2]){
# t8 `; Q8 Q8 T, e9 V+ s switch(csym[2]){
4 R8 [- W) z& L4 ^ case '(':$ r [# o# e; X( M% v) m
if(!csym[1]){nLevel=0x100; nERR=1;}else! z/ [. t; l, j H! E* G' E
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
, J! Q& V& R1 s* F else{nLevel=0x100; nERR=1;}
- T6 Q( l( S. L. b$ C break;
2 o1 R6 [9 h8 z' J6 l! X case ')':# n8 q t3 |/ h' C6 W- Y, U" @
{nLevel = 0x100;}break;
- u$ a* i$ _5 j0 Y( U/ D case '+':case '-':case '*':case '/':! a* b$ `' m- W& X! F
{csym[nLevel++] = csym[2];}break;7 y' R& W1 a$ T* W
case ' ':case '\r':case '\n':case '\t':continue;8 D' n! W; [; p% M3 D
default:
1 r2 E8 P& z* P5 ]5 Z4 `1 ~) t: \ {nLevel=0x100; nERR=1;}0 f( x+ D0 K! q5 _
}
% u7 M# G. L( h1 X8 I, p if(nLevel==0x100)break;
# z% X$ H7 \% v$ H, Q if(nLevel&0x10 || istrin>>t[2]){
9 j$ u9 g) k4 L# R1 X: L nLevel &= 0xF;
9 E; I4 D/ T; t+ O if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
4 K3 p( [( {* d. e if(csym[1]=='*'||csym[1]=='/'){. x9 d7 y: N! L2 C9 _: P
GetExpValue(t+1, csym[1]);. Z3 y7 D$ j% u3 c
}
3 f" L: c V1 q+ U% Y else{) o( M; E4 S9 v3 G7 v- j
GetExpValue(t, csym[0]);
{; w! `$ N& c# h7 Z/ v t[1]=t[2];csym[0]=csym[1];csym[1]=0;) t) f! t) M) n6 f6 U
}( G1 z$ P: N+ d& W- T
nLevel = 1;. J$ P9 H2 D4 U3 F) m1 v
}% q' _/ n6 n1 M4 ^- v
else istrin.clear();
* W2 L5 ~* ?( K7 {7 e. ` } [0 m: R& V2 j
else{nERR = -1; break;}
& b- ?! y8 X+ W3 _$ A }
( X& H; J$ k% h' |- u T if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);) C) M* g2 h. [. q L
else nReturn=GetExpValue(t, csym[0]); R# Q% d; c) q9 Z' }
return nERR==-1?1:0;+ ^9 y( F/ U1 ~; B
}}
, p5 P* P( V/ ^, W, C" L5 D+ @& V/ p. @
b; T" y$ `( H" I! L+ m- Y% O" ~. n" G
函数模板使用示例:1 q) f$ x- e b; F0 Y1 F+ B
在以上那段代码的后面加上以下代码:! u- r* I; R' }' H3 ^; o
4 M T$ E+ x; Z. ?
# _ @/ F. G) A. u2 D+ ~* S3 n# S% x3 Q& Y6 J0 K
程序代码:
% d( ~; C4 j% x/ } ] c
0 g8 C" ^ h( ]1 z3 j#include<strstream>, ]2 Z" m5 ~0 a+ H5 V. ]2 H
#include<iostream>
7 `9 d6 d. ]2 r6 K$ I#include<string>
- |) C% u# l. W" [using namespace std;$ L$ p4 q8 j% h* |; L0 ]
int main(void)
. p2 P2 i1 c. E% t! J% O{
2 o$ l0 w9 B/ q9 b string s1;
/ ^6 x% s0 ^6 S! i% S while(cin>>s1). B! G' P3 G1 w, _, M: h4 z
{
1 X3 M1 m" `6 R4 f istrstream isin(s1.data());& M0 y$ k+ U& I
double d;$ Q# s* b3 T/ m+ T E* J5 ^) t
if(fy_Exp::GetExpValue(isin, d))5 w9 b5 c% I/ e4 X5 R
{
- _' m5 H3 G) a ]5 I/ m cout<<d<<endl;
: \- A; J8 P) }4 ^' D }* |3 t- F- g8 A* T" Q- t8 p
else0 l! P i" d) }% }$ i
{ L; Q7 ]* I4 A& G" D! h- @; A
cout<<"ERROR"<<endl;
* ?/ e1 }1 @5 h$ s- r+ J' q }
6 I3 x# V$ Y" r# {6 R- `: ^ R }
4 D; Y% @7 g* u9 W return 0;( M0 J$ k) O1 R9 t2 C# v
}
' g, d; ^ q$ y4 i4 M- f
6 V. ?9 w8 ^/ a, b2 _7 S F
- N, t7 o; Z ^' S7 @* n然后编译执行就可以了(*^_^*)
6 I8 ^) I$ v- y' ?! u1 l其它:TC++上一定编译错误,不保证在VC6上也能通过编译4 a5 P$ K% v* I! w9 R& A( v. \
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|