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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,% p' G) ?, [' P
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式0 r' l/ w; O; p; [3 p1 [- i
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)" w( ]- K# \% t3 l% C8 z
参数解释:7 @# b: t- Y- `1 R% V* t
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流2 o- l# g* ?- P1 L5 C3 M: |8 d, [
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" n, h# w i2 M. |4 g* G' S. Y
返回值:2 k6 }7 s( W+ X* I9 }
返回非0表示计算成功,0表示计算失败有错误/ o- I. o# O( K3 D& @+ w3 m; p' Y
- v: B1 x( d2 U
- {* N2 z' g# L! Y! x
4 v2 A/ n1 s9 `5 ~0 R& _+ N" L9 T% V程序代码:
9 p/ b. J/ J$ I, B, e1 D: l% N! g; e4 b
namespace fy_Exp{+ C( F f0 t$ R' g% d
namespace {template <class _T>3 @9 g# @6 O% Z4 t* T; H
inline _T GetExpValue(_T t[], char& csym){( C9 t) q$ ] r% R
char c=csym; csym=0;- `6 a# U/ y" j9 k0 P
switch(c){
/ {9 T8 X& v4 Z case '+':return t[0] += t[1];& Q" h/ b& L# F$ A+ ^5 X8 P
case '-':return t[0] -= t[1];% d2 u% V$ G7 |5 g3 ?9 _
case '*':return t[0] *= t[1];
; Z# ^4 [3 p9 W7 G default: return t[0] /= t[1];//case '/':$ P3 H/ f t4 ?8 k Z9 M
}% N4 [( ^% _+ o- b2 R5 f! g$ q
}}1 I7 y J& l6 H& ^2 \. V
template <class _T, class _Tstream>& v0 E5 b# [% O7 Y4 |
/* _Tstream: inputstream, _T: get return value- x |! u5 ^; K* v
* Return nonzero if get value successfully */
/ A" x2 e; Z. ~4 s5 z2 gint GetExpValue(_Tstream& istrin, _T& nReturn){$ F, p, w: ?8 S( S% ~0 y* {0 a$ o
_T t[3] = {0}; //雨中飞燕之作
0 K% @& D) y2 p4 h3 F/ p8 }. X- } char csym[3] = "++";
) v6 B& `5 g& E) T int nLevel = 1, nERR = 0;
( L* x4 @% y0 \) V+ z if(!(istrin>>t[1]))istrin.clear();
a( k' z L) ]: s6 \, N for(;;){# ?2 P# V) J$ T$ S6 z
if(istrin>>csym[2]){& S3 x! D# Q1 K- b
switch(csym[2]){
) T @; h! E9 r* V+ o: n2 N case '(':5 e9 i; ]1 v4 ?" }+ X
if(!csym[1]){nLevel=0x100; nERR=1;}else1 W- Z% t& e4 S; T* U% x9 u
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;0 f0 P. @, b; P; h# K7 ~" R
else{nLevel=0x100; nERR=1;}
! z$ O, ]; F5 ]% i3 `9 p break;
I, A4 i+ i7 J1 \/ p4 J, Z case ')':
, r% o% @; Z0 ^/ A {nLevel = 0x100;}break;
' b5 ?4 d" v3 a7 V3 k( q case '+':case '-':case '*':case '/':; R' ?) Y8 l( @5 P% f! t2 ^: y
{csym[nLevel++] = csym[2];}break;: @, P9 `1 u5 I' m) x# g; Q$ M
case ' ':case '\r':case '\n':case '\t':continue;
2 V$ V! n2 a- ^3 n default:& v }9 n# o+ x: M! w
{nLevel=0x100; nERR=1;}8 P3 W( w6 m+ @3 V% g
}1 Y0 n2 |" j4 ]& D. Y* n8 Z
if(nLevel==0x100)break;
! u, v# v% f# U0 D if(nLevel&0x10 || istrin>>t[2]){
# h% o2 P; Q: [5 A4 O nLevel &= 0xF;
" p/ ?( M; |8 m1 U2 f if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
2 i- z) |$ f3 I0 F if(csym[1]=='*'||csym[1]=='/'){
; E# t0 Y: |$ C GetExpValue(t+1, csym[1]);
' y b4 T3 T8 N$ l }
3 I( H; R9 S B0 ` else{/ ^& w' A9 D+ R* L9 e/ j6 | K
GetExpValue(t, csym[0]);" E5 u5 P9 u2 T V" N/ _( m
t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 b+ C# M. P: e, v( M
}3 ^4 q0 |2 t! U0 L
nLevel = 1;
9 W4 O: |: H) D3 W/ m }# G# G9 z# J0 A' [
else istrin.clear();0 e5 r( H0 {; R
}! O5 ~8 ]( A! X9 U
else{nERR = -1; break;}9 ^, e# F3 @' w) |, e
}; c5 Q! \, ]# S! Y' J. e& Y [
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);% s3 e! j y: ~* @! C/ A
else nReturn=GetExpValue(t, csym[0]);+ a I6 M% T& A8 s i9 u
return nERR==-1?1:0;
) |. y5 B) | s}}9 I0 z0 b8 a4 Q* h
4 C3 [1 A8 K% i, v: d1 \7 n
V0 ]: Z" R% K) p
. b1 E2 o5 u: H5 R8 @/ w' y; a" w U函数模板使用示例:
: v% _; J! ~! W1 O; L/ R在以上那段代码的后面加上以下代码:' O+ f2 R% ~0 L# s0 I. y. U
; B) d3 O! T1 z( F. { ( X4 w* w; A$ `* o/ B! V
& ]& m k6 @3 J$ f程序代码: b2 O9 P: Q" G% ?+ F
5 E! s+ w$ [/ z2 ?8 G! B+ k$ s2 h#include<strstream>$ f* |7 {- u4 @ T( k
#include<iostream>
. H$ C! R0 J5 y% F#include<string>
5 k9 n# U: K+ o( ^3 v7 Susing namespace std;+ C M$ A7 R; i7 y h! L7 F( @
int main(void)3 ]% e6 l% [' j' x) c( d* l
{/ }5 ?' Y0 G* X- Z
string s1;
$ r& j3 B& s: \$ J- J/ T while(cin>>s1)
* h, y3 R) [' t# y {
/ }2 T5 z# l, _, P1 {8 x( X4 L istrstream isin(s1.data());5 H, U! L: ~( W
double d;
8 z* |8 F m: j; D. O/ Z if(fy_Exp::GetExpValue(isin, d))0 }/ f0 C; p2 L! F6 V
{
" X, k& n. N9 l' ]( n% n, h. z% M cout<<d<<endl;
/ s' E+ ?5 m) t- z( R4 a" ^ }% c6 A2 x$ I" y6 r4 o' d
else
* `8 Z3 ]& ^; L+ h+ j {# u$ H) y- m. B6 g8 ?
cout<<"ERROR"<<endl;6 K+ R' u$ Z5 X3 M m5 }
}: o w/ [$ z* S& @3 [' q1 m: m
}; d6 x. i% x2 j& q
return 0;8 W; W9 \) Y- _ i8 K& J' q
}) J, a, }! F2 g. J
, a1 J, |/ l$ Q! u0 x- I, f
+ u1 I6 B* }2 W, t+ h2 O, ~ D% X$ H然后编译执行就可以了(*^_^*)/ a% p' T1 W: P# ^# `
其它:TC++上一定编译错误,不保证在VC6上也能通过编译& ^, K1 }# ~2 B9 P. e3 T1 A3 ~6 @6 Z
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|