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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
n3 Y( F1 y, z: N一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
' w; Q4 P. s7 t+ M& f- _只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
3 F! \% U3 m9 E5 c9 |/ F, I参数解释:
4 k' G& e0 P; F% }7 w8 F* `% `0 O( Nistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
6 f) M; P! K# }3 W% znReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定4 `1 H4 g3 n) p8 t; J) @
返回值:/ p5 \4 W g& e& o2 C' u5 m
返回非0表示计算成功,0表示计算失败有错误- {2 J5 Y; k. r
; ^& E, p0 \, q% m0 c Y" B
% @7 [+ \; n5 q2 S
9 B7 E9 B* J, S* o' c程序代码: , [! ]# B" ^& ?2 Z/ c8 n& s( J0 G' W2 Y
- R X5 f& _$ M# g8 Q! s
namespace fy_Exp{5 [$ r& L1 l+ L5 f! i
namespace {template <class _T>
( f: e5 L% B! d8 w" }' `inline _T GetExpValue(_T t[], char& csym){: N) q% k9 {( S3 u1 D6 }# G/ p) X
char c=csym; csym=0;
# p" M4 f( \% \3 B6 c switch(c){
6 c! n7 ]4 O9 f* o3 h9 d* [ case '+':return t[0] += t[1];
+ F1 T' J+ k; C: j U1 Z4 Q6 |$ }9 a case '-':return t[0] -= t[1];
1 x9 Q) v* O' `/ Q8 O4 m% G$ F case '*':return t[0] *= t[1];+ o6 ]( I" p2 f! V, i/ u
default: return t[0] /= t[1];//case '/':
! L0 D8 [! h2 L5 F. x }! L! A3 Q( A. c' O
}}9 y3 _2 l; H/ S6 r& w( a6 F
template <class _T, class _Tstream>9 v9 M& }+ F. o3 B
/* _Tstream: inputstream, _T: get return value
+ p. L" t: I* P* Return nonzero if get value successfully */
) K) M3 W' a: jint GetExpValue(_Tstream& istrin, _T& nReturn){
- q5 P1 S0 ~6 g2 p7 Z _T t[3] = {0}; //雨中飞燕之作0 E9 b4 Z; Z7 f" \ k
char csym[3] = "++";
' B4 f+ F5 \0 ~- Q int nLevel = 1, nERR = 0;. t v- c3 Z1 f2 Q8 }
if(!(istrin>>t[1]))istrin.clear();
+ q8 `" {. L# q7 r for(;;){
+ n Y1 v! C2 ?% f# v! U( ]6 g if(istrin>>csym[2]){
9 ~# Y! k: i9 K switch(csym[2]){
2 R, H. `: p6 K& D case '(': F# c! i. o' b
if(!csym[1]){nLevel=0x100; nERR=1;}else8 U! N" T* _! i! J4 `
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
- w3 W1 o* K( t else{nLevel=0x100; nERR=1;}
. w& }$ F, O) Z% u2 G break;+ G7 z: A5 A: h7 @2 E
case ')':+ e6 e! C( u4 O
{nLevel = 0x100;}break;
5 a0 H+ Z6 t9 ~, F% i. L9 C case '+':case '-':case '*':case '/':7 `& Z8 B$ p; \; i
{csym[nLevel++] = csym[2];}break;
) G9 v' g$ i$ ~ z- Z( W case ' ':case '\r':case '\n':case '\t':continue;! V2 t5 q" x3 X1 J! x
default:4 q# A: i+ k" }% S4 X* U
{nLevel=0x100; nERR=1;}6 M5 L' _5 o' E6 [( j: ?5 H$ {
}
l1 N* @& n# v6 ]& O if(nLevel==0x100)break;
- P0 v! p8 h7 a% D+ } if(nLevel&0x10 || istrin>>t[2]){
+ ^4 G# \% r9 P3 H1 ?9 {: f) h nLevel &= 0xF;/ |: S- D% \( }! d2 `
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
) k* e! j8 R5 ^ _1 Z: T4 h if(csym[1]=='*'||csym[1]=='/'){
. @$ r; l" _! x9 F+ N GetExpValue(t+1, csym[1]);
6 D4 c+ Q2 }+ Y/ G9 ~ }
( Y$ n' Q+ h C/ ?3 q- m: l else{4 W! M! z0 _: P- |* M5 G# P2 ]
GetExpValue(t, csym[0]);
" y# q" ^, P: i) I9 d. h t[1]=t[2];csym[0]=csym[1];csym[1]=0;- `+ m1 v B* c7 b1 w
}+ C* S4 ]) ?4 J5 b i' b
nLevel = 1;
* h. a; l3 g- e e: g }
7 i' d" b7 \3 v7 W6 Y else istrin.clear();
4 u% Q& E" K$ D' [$ F% S- p& j }
" n% Q7 H- t2 V$ x) R0 m7 y1 r else{nERR = -1; break;}5 P) a8 v% D3 ?$ ?. r6 q$ ^
}& t$ t2 a- y+ n E/ I
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
9 g5 u% s9 w5 a9 ? else nReturn=GetExpValue(t, csym[0]);/ q3 S/ G; @# I
return nERR==-1?1:0;
; a5 d0 e6 f$ m2 O3 O0 v3 N4 }}}0 W; q- N W9 t& I
6 t. C4 n. v% c% i7 ^; |/ J
% e6 u9 n5 n! ^
( H: _' [0 O; V* o函数模板使用示例:
) t3 `# x8 i3 T在以上那段代码的后面加上以下代码:0 j6 r* h. {: S
& h$ U- @; [1 Q, l( _& e: ^7 y& }
5 j1 Z' v; p6 n0 m, ?6 K5 b+ d0 h# F% A& D! n
程序代码:
" G+ `3 N, r8 c/ J+ b/ }, X: b& U/ g# p+ o( R4 G: \) u
#include<strstream>
3 j p$ ^; I) ~$ d#include<iostream>2 i6 Q8 o, Y7 q$ q0 U# X
#include<string> F: w' m0 Z2 E5 D* ~( A: ?4 ?1 [
using namespace std;
2 h4 B4 g2 o/ q3 ~int main(void)0 l) u/ g& Q e T
{) I& U' }# O0 O5 q6 ?
string s1;- ?& W( k/ w0 a# ?
while(cin>>s1)
. e! E' B- L' d- q0 o( ^ {
9 p# x# B* }" ` istrstream isin(s1.data());" r: G9 Q0 q6 a8 E
double d;
# y+ r' N; Q3 z$ J if(fy_Exp::GetExpValue(isin, d))( `* q5 z( n: R. b1 ?
{
8 p9 f* O, ^: N5 `' I7 Q m9 h: H cout<<d<<endl;: E+ M' ^$ v- T2 N0 |, x
}2 |0 H$ I6 O8 B$ L. @& L) G
else5 w7 b( R# _0 R4 k2 C4 Q% Y6 [ c( ?
{
" v" h! b' W8 ?0 m cout<<"ERROR"<<endl;9 d' u8 o/ }9 b( C
}2 X8 \. |$ x2 g1 ]. C! y
}, V7 R$ d0 H7 V( b9 D7 ]- ]( {
return 0;: o6 O+ y5 S0 O) E3 L1 `; S
}3 w) b5 }$ L j! p" n
5 M6 Z) p4 f6 n
' L1 L3 }8 ^1 E9 k4 x$ @2 |" J6 [然后编译执行就可以了(*^_^*)$ i0 K) n8 E8 c6 t8 j; z( H
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
1 e, ~2 W: E# s7 h* n. i 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|