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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
2 l) `1 Z, z( Y8 {, T一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
4 U) S: _# q1 ^1 z只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
! F! S( k' a# s1 s$ |3 f参数解释:
& `0 A* O# d2 }, Q, [5 H% R2 Uistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
' I* e( q4 E* c4 e y) qnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定( O, {& n* v7 ~: r$ }
返回值:& |# f8 \/ V) z/ M9 X$ Z. k l; Z7 ^
返回非0表示计算成功,0表示计算失败有错误
' v) O2 g0 z4 n- U- M
3 v, f0 i8 ~: f' j' g
/ Q$ a, B+ c/ R0 Y
0 a+ b, s: |9 B# y2 M6 @! x7 q4 B& j程序代码:
+ x1 F( u9 y3 f- {" J
" J/ P: i7 C. U, e2 M, \namespace fy_Exp{1 l4 i6 J) Q! R7 n& v6 v
namespace {template <class _T>6 t* G4 s7 N5 K( n% w
inline _T GetExpValue(_T t[], char& csym){% ^2 _7 O0 G8 t/ k' v) j- V' E
char c=csym; csym=0;* B, x& X L; X
switch(c){
- y8 }) o1 @: z' M3 u1 W case '+':return t[0] += t[1];
$ T1 ~4 B2 c9 n7 Z' @5 y case '-':return t[0] -= t[1];
* M- r6 {6 v' I Z case '*':return t[0] *= t[1];
1 I& i0 J7 I* S$ @ default: return t[0] /= t[1];//case '/':2 z% \7 p; p. ]: _
}8 l# R) q" A+ D. h$ j2 W3 `, K5 Z2 N
}}4 x9 o. m% s1 @# A% \
template <class _T, class _Tstream>1 q3 U" D: V' F* b" v* z
/* _Tstream: inputstream, _T: get return value
* h A8 w3 z; i* [# c4 m* Return nonzero if get value successfully */
: Z+ |, a8 p' [ \6 Jint GetExpValue(_Tstream& istrin, _T& nReturn){
; ^ j0 o7 J0 g4 p% p _T t[3] = {0}; //雨中飞燕之作0 D, P g4 J: }* T0 @
char csym[3] = "++";
& ^. U$ X% l" h7 ^, k/ {3 A9 q8 k int nLevel = 1, nERR = 0;8 ?. R4 r& l& R$ R* s
if(!(istrin>>t[1]))istrin.clear();& _ [$ f* q5 p" ] Y8 C
for(;;){
3 p- X3 }5 g7 V {$ d if(istrin>>csym[2]){* z4 P. z$ X2 t9 ]6 v! X
switch(csym[2]){
0 d1 B4 M! ]. G* w: x case '(':2 Z w; w0 d0 F C* {
if(!csym[1]){nLevel=0x100; nERR=1;}else [# A3 |/ R2 d. B1 f' B) Y1 y. n
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
^) K7 O3 M1 @3 L else{nLevel=0x100; nERR=1;}# V: T. e7 W; l6 P y
break;- a& f6 `$ d6 ?9 N, A$ l3 T
case ')':
6 j: L- _$ R2 \/ A ` {nLevel = 0x100;}break;
! z9 u6 n4 G/ J4 r; S* Z/ w& J0 F case '+':case '-':case '*':case '/':
( L ^' a$ Y! ]3 n' Y {csym[nLevel++] = csym[2];}break;
3 y" z4 {" _! v) T3 E7 L0 f case ' ':case '\r':case '\n':case '\t':continue;
- t9 r4 Q% a( E. Y' P9 y$ y: m default: Y5 r' E0 @ ]8 U: i' N
{nLevel=0x100; nERR=1;}
; ?6 g8 v+ F3 ^- T! z+ {& q }$ a' e4 y# e" `8 |$ z! u
if(nLevel==0x100)break;
/ h4 A( N7 P6 B+ X% {$ e if(nLevel&0x10 || istrin>>t[2]){
' m7 r9 @( ?0 B' o. S% d nLevel &= 0xF;
; c0 N; n0 l P+ e4 e6 j if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}! P0 l" }; O' b0 J
if(csym[1]=='*'||csym[1]=='/'){
6 A0 [4 C5 r1 _4 K! U6 R, d7 N GetExpValue(t+1, csym[1]);" a' J( C1 D/ j+ r2 I' w
}& c4 I, B* L- u; P; M$ c) W3 g( q% U8 l
else{
( O6 D- n. Z# U/ r+ G6 {( U/ X* x" D GetExpValue(t, csym[0]); u* h+ n( A4 x g& N6 o" ~
t[1]=t[2];csym[0]=csym[1];csym[1]=0;4 o% ^' V R4 n
}& @* ~4 y# U8 S* h9 r( {5 J
nLevel = 1;7 N5 o5 h8 h, e' o& @
}( U& _# h, F: S# `2 s8 W
else istrin.clear();
) R: f! D8 n$ Z) \3 V }5 @) D, D4 F9 i4 z
else{nERR = -1; break;}
8 h3 x3 B5 Q/ e5 R* Y4 K+ d, m }. E! ~* @! d9 a9 B" j
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
X$ b' z* w" s4 u8 g else nReturn=GetExpValue(t, csym[0]);2 g: A Z/ }% h5 J: k& V
return nERR==-1?1:0;8 {: `5 r- f" W6 }; V5 A+ Z4 l
}}
9 D7 o$ j6 A* J H1 b
, Y1 k) F' L- @+ `. Q a+ o
4 ~& a- D! J; x# q0 }0 R: m
% f) o1 f2 n' z函数模板使用示例:
5 H F6 }5 ]6 T在以上那段代码的后面加上以下代码:
$ H* e3 ?0 Y. @/ V: O6 O b! m+ ]( z' {. K8 l. P; ?! \
+ l( F0 K1 L. w) L, V- c
: T- s( n% d9 b) y% ]9 V程序代码:
: \% ~' H+ d% L9 ]* o$ i9 i8 F6 `
6 F; N9 k5 V) I. U#include<strstream>: r1 A! L. R6 Y/ w* B
#include<iostream>
}) A, t: K3 [# I7 C' l+ W#include<string>3 q- S$ ]/ U/ i2 Q7 X8 _: Y. G6 P
using namespace std;
6 H9 v8 N: K0 X1 ~- rint main(void): [& l) X6 k1 |( B, n% X
{
D6 m6 S! J! F! {" _ string s1;3 n5 [( W( e3 F% w
while(cin>>s1)
1 A2 Y+ f% L* d0 H7 c6 _5 a% w4 v" @) r {6 r3 G6 ^. p, X/ R8 J' L% U
istrstream isin(s1.data());, x8 z* N" C* Z$ P g
double d;3 x$ [1 s& I v5 z) M
if(fy_Exp::GetExpValue(isin, d))
5 L/ N3 I8 t! A8 k- F) U {0 a! |8 ^- v1 z* w( b @. S
cout<<d<<endl;
O% B6 k3 F! s% l. ?+ p }
* H: l% P: H N1 ^5 I else
+ x8 `7 ]+ L$ _* g; R3 d7 l {
& i4 ?1 e6 |) @* [' {' g! `' B cout<<"ERROR"<<endl;5 p2 H4 a: J r8 O# ]% D; ?
}1 U2 c m; W, H' w8 `( k D7 r
}
! O) {8 h8 z, L return 0;
' S& T! e" A- T/ U}% M8 f) T- Q9 \$ J- M
) O' T* A: c* H1 D7 a$ S; R$ |+ R5 }( t$ k" i
然后编译执行就可以了(*^_^*)
) D T* s/ ?: v; w) g4 v0 `其它:TC++上一定编译错误,不保证在VC6上也能通过编译. D- _' m0 Q: U; b. |
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|