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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
4 L g* a* z* O% Q! |7 S一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
, T" I/ P; Q$ o: U7 F: x只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)3 n0 W5 a% U" O, c
参数解释:
; }# X: A1 \/ R- }; ]istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
; s* B1 `& V/ Z$ h P6 B) `8 p: inReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
8 i6 `' u6 B0 r9 F& r返回值:0 d* {! r8 m4 ~3 L* j
返回非0表示计算成功,0表示计算失败有错误0 Z' B+ m, j( p2 ?- b
; r5 P. P8 o' H/ p/ [0 s
$ R1 g" ^ [: E. R! m0 E
0 F$ A/ M$ z- b l; O. G程序代码: 0 f& a+ R! k4 C- `3 s
- o r6 S( H4 |6 \) [9 W. t& t2 @namespace fy_Exp{8 a( H7 ^' j# r$ p7 W5 }, T' Y
namespace {template <class _T>2 ?. Z( T6 V( U0 \* K
inline _T GetExpValue(_T t[], char& csym){
5 J" f" \" q- d, [$ P char c=csym; csym=0;
$ R6 E5 D- f: ?( g switch(c){
2 c: S- A; ? X1 `. X( d' W- f. Q case '+':return t[0] += t[1];
" _+ ~. n# S$ @; _1 i y# o case '-':return t[0] -= t[1];2 I2 C; ^5 H- ?1 A
case '*':return t[0] *= t[1];
0 ]# E$ I J: M( k$ O( q" @2 u default: return t[0] /= t[1];//case '/':2 [# P0 s( o$ f B
}( u3 c9 X3 ` a% C
}}
. z0 f' X) q4 h3 O% jtemplate <class _T, class _Tstream>
& H: N2 U3 T& C9 B4 \ y/* _Tstream: inputstream, _T: get return value$ [4 z& I2 g& t3 K# q) f
* Return nonzero if get value successfully */
7 s' [+ [) C. Aint GetExpValue(_Tstream& istrin, _T& nReturn){8 x- U; ]2 d% z% P8 p J8 Z
_T t[3] = {0}; //雨中飞燕之作- b9 J9 T7 O8 q% I
char csym[3] = "++";! ?7 q8 O/ X' \, {7 r8 j
int nLevel = 1, nERR = 0;
3 t1 D' R1 r" E( H if(!(istrin>>t[1]))istrin.clear();! ?) X( {4 o3 g/ M% u; i* N- `
for(;;){, Z7 U0 @ g0 L. T4 \
if(istrin>>csym[2]){8 c5 [2 z/ I" u$ K3 o- a
switch(csym[2]){) [; W, U1 F& p, S% K
case '(':6 ?6 [6 c. S3 E) @1 ^
if(!csym[1]){nLevel=0x100; nERR=1;}else4 u3 j& p7 M+ G$ W6 H5 t
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;/ }2 `: v) z! C& J
else{nLevel=0x100; nERR=1;}- z2 l2 _2 |0 {8 F6 ? `
break;
5 Q; a# n& T: @1 a' F' T( r2 x case ')':
1 A+ y4 K- n$ N8 b% p/ C {nLevel = 0x100;}break;
) n/ Z3 m. X) v. [; Y case '+':case '-':case '*':case '/':
, m& m1 h5 p9 V1 w: N$ o {csym[nLevel++] = csym[2];}break;
! Y1 D: }3 r8 h6 N. z# O3 K& ~! k; l case ' ':case '\r':case '\n':case '\t':continue;
; W( W6 E) a) ?, F: J. W default:
. w S9 h$ u/ `( X0 ^, I! B {nLevel=0x100; nERR=1;}7 g8 u f8 y4 j' \
}7 n8 l' D2 S% Q+ X
if(nLevel==0x100)break;
; w5 E! d V4 I$ i3 b0 | if(nLevel&0x10 || istrin>>t[2]){4 \1 N8 l" ?: }: O4 Q2 P
nLevel &= 0xF;
; Z5 \1 l( m/ h# ~0 ]2 E4 q if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}; x4 ]) t- T0 i* j/ \, U8 C$ W' w
if(csym[1]=='*'||csym[1]=='/'){
( p$ | O( U5 T% J7 J GetExpValue(t+1, csym[1]);5 P" B; M* ]) p9 p8 }4 ~0 |
}) i1 a, D" F9 R* E: O9 j
else{" g; N! ]- P9 u% ~6 p9 k, H
GetExpValue(t, csym[0]);- t( u7 I3 ]- ?! p
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
% K1 a4 Y, M4 K. |$ } }
( n& Y% x% ]% y3 @ nLevel = 1;
, V* N* M, Z& z. {, Y H }
1 R! a, N6 Q: x) T else istrin.clear();
: v2 c, _: J2 u5 t# s }
! ]( b8 T5 J8 ]% K( D. }, z else{nERR = -1; break;}
, b, M& T. r2 l. `% h# C7 a }
6 H/ s3 [# m# m. B& A8 n5 B if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);$ F, w! e3 Q) z' H4 j
else nReturn=GetExpValue(t, csym[0]);/ M( S3 D! k* J
return nERR==-1?1:0;
C: }, l0 L2 S" x( n}} W" o4 e0 C& ?& v O+ `+ P
+ D ?# m3 S6 _- l: @# e$ ]
$ S7 ]* v: K- a9 x/ x
# w& p6 O: U5 I函数模板使用示例:
+ Z* g) {! }1 ?. Y! ^& L/ L% _0 I在以上那段代码的后面加上以下代码:: J v( P5 s- J8 p
# B9 z$ s1 Q: v w
( f0 F I; \: b3 z+ q
6 D7 _) d) Q# f
程序代码:
) M( q$ M/ t" X9 p/ x# b
: `: u- ~) g E: \1 i; _4 q! e, ?. g#include<strstream>
" p' ~) R! m' Y+ ?$ \, j+ H#include<iostream>& [$ N$ u5 d$ c8 _- u
#include<string>4 x% J4 T7 e8 Q Z8 W q
using namespace std;- L: H. g. C2 J7 L: \$ F, e
int main(void) T L# M# p; I% k/ g
{: Y( j4 q; p% X1 A! @
string s1;& y; G( K7 [$ p5 a
while(cin>>s1)7 W! {/ _0 ~9 R4 F; f
{
9 |% ]- c2 a, C( E istrstream isin(s1.data());5 L6 p, i3 @' [4 p! s
double d;
0 K; V5 X+ L& d$ | if(fy_Exp::GetExpValue(isin, d))
9 T7 }+ p; p, E3 T$ X {9 V& K1 {3 Q" @5 `! q4 \
cout<<d<<endl;" F d4 S, l0 I! o
}
- v$ { A, ~1 |! K, i else
7 g1 G" z1 o: O4 K% D {
; z5 q* n3 Q( O+ o/ G* y cout<<"ERROR"<<endl;
6 ^/ v6 N# m( [# B }
, H. z0 f) b* p: d* E! n7 q }* a5 J5 a. T$ |0 t9 c( T7 q
return 0;
1 j; U7 k0 v3 L; i1 Q+ c6 k0 n}! N+ K( h/ D4 I! P8 d4 e$ D/ n
/ f7 D5 V$ f2 L# ]
- w- B) ~# j1 U! z, Q# K) z1 P& M
然后编译执行就可以了(*^_^*)* [1 B* D% h3 }3 I
其它:TC++上一定编译错误,不保证在VC6上也能通过编译8 K4 P; S: Z& A' r6 \& g3 V
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|