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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
% [4 g5 g( b1 S一个很方便的函数模板,可以并且只可以计算含括号的四则表达式7 |. j, K0 ?, p% v! U1 l
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
* I2 @/ J) Y: X0 K1 \参数解释:# p$ T9 ~/ e: F/ `2 k7 g
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
& \7 h& s y6 \3 @( MnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
* O: X, R8 X2 E; f) H8 q0 G, s+ [返回值:
! }4 N* o' v) G返回非0表示计算成功,0表示计算失败有错误$ p9 A, S" [. h7 ~+ f7 L4 k7 ^
( `* |( }4 |, i C' \' n; r
2 F5 k2 {1 l) Y" L/ a
! o3 M' h) r# S8 ]! R
程序代码: " [7 }/ z- S0 h( ]
5 N; V% Q3 q# p- f' P3 s- vnamespace fy_Exp{8 y3 }$ _, U3 g+ O1 ~2 b+ t: [
namespace {template <class _T>' _9 t2 o' x- j0 d! l" r
inline _T GetExpValue(_T t[], char& csym){( d9 o( g9 s4 p: x
char c=csym; csym=0;
4 I+ s0 h2 P. X switch(c){( |8 Z" `" U' `6 j
case '+':return t[0] += t[1];% M- w+ h% k, y" D7 ]0 E( N
case '-':return t[0] -= t[1];
9 U% B0 F4 y& e& l( {! V+ S6 d case '*':return t[0] *= t[1];
2 o$ r. E+ m' A0 V: H% V3 b default: return t[0] /= t[1];//case '/':) W9 q* v+ v0 Q+ i: d( X
}
^/ d- T/ f f9 K8 H% ~}}
( @8 }" _ x- T# h/ S( Ctemplate <class _T, class _Tstream>
+ A: v7 b* [7 f6 ?+ y2 l. e/* _Tstream: inputstream, _T: get return value
5 e1 E) ~2 Q, p" L2 j* Return nonzero if get value successfully */6 V1 Y" {3 c" ~) X9 P3 \) U5 z
int GetExpValue(_Tstream& istrin, _T& nReturn){: F- P3 K7 [! R! I1 Y" M0 n
_T t[3] = {0}; //雨中飞燕之作
* t, R/ \1 [# P/ l. B7 k char csym[3] = "++";: P; `( |* r2 M0 U" D% f8 N+ E
int nLevel = 1, nERR = 0;
. g! J5 W8 T a9 C5 I! N. ~ if(!(istrin>>t[1]))istrin.clear();
) K) i- v9 J0 H! }5 ]9 H for(;;){. K$ ~: a, A" n( A6 x# n$ l: m/ p
if(istrin>>csym[2]){' V( z5 R: L* `" L5 d
switch(csym[2]){
4 _3 S9 T y% O. }; C8 C! o case '(': _/ w$ ?& d4 |2 `1 v& o. e* R
if(!csym[1]){nLevel=0x100; nERR=1;}else. U$ h) S5 y1 v: z+ ?
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
1 H1 d& j1 D; e$ `1 a else{nLevel=0x100; nERR=1;}
- S: Z K( N/ @: C4 z! L$ v; Y' b break;
# C; }- }3 _- Z* U' s1 K case ')':' H. I6 g) T m
{nLevel = 0x100;}break;
$ H# `& f: A' c' t- ~ case '+':case '-':case '*':case '/':
. S& w5 I* Z, B {csym[nLevel++] = csym[2];}break;
* }. n9 E# _% ?. ~& {1 j case ' ':case '\r':case '\n':case '\t':continue;- B0 |! m1 O2 L6 h% ]: a' h* [
default:: B2 D! R; ]* o+ y
{nLevel=0x100; nERR=1;}
& ]4 _# d$ n* K3 ?. n9 } }
$ h/ B( p; ^" W) r5 ~6 m if(nLevel==0x100)break;
0 e/ k% F' m7 j* ^/ @3 E& Q if(nLevel&0x10 || istrin>>t[2]){. H# O) X" ^2 n: B0 u1 O2 Y
nLevel &= 0xF;: |- e# f' b+ ~. I
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
: E3 B) [. }# R9 U) y/ z if(csym[1]=='*'||csym[1]=='/'){5 t% Q! e- ?+ F" A1 Q8 j& g
GetExpValue(t+1, csym[1]);
+ _3 h- M' v! X4 [2 W% ?2 P7 ]* G }& Z9 D! @$ E% n- Y
else{; L+ c# B, p' H" r4 f8 X, i! P5 Z
GetExpValue(t, csym[0]);
5 w6 L+ P0 _# P# x9 I2 } t[1]=t[2];csym[0]=csym[1];csym[1]=0;
. h% B* N" Q4 E- f+ q4 r# j }6 p+ E @; k: \- o
nLevel = 1;
" b1 y% e! z6 R. L3 C }/ n2 j6 K8 i" O" d, R5 t
else istrin.clear();& {9 ~8 V" t0 e+ W2 y
}( P0 @: x0 H/ u: r( i/ f# o
else{nERR = -1; break;}
1 C' o! s0 H, C# S$ C }
7 r5 X2 K$ L% u" l Q1 V if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
7 p- ^* W& I! a1 H else nReturn=GetExpValue(t, csym[0]);; e( ]3 ~4 {* B# ~5 ?
return nERR==-1?1:0;+ l! z* J" f% K& q
}}* \9 P! i( v* E
1 {% s: D% w" G% @: c
, R5 k- O7 V9 w
k/ B) o# {' W9 { o* h& T函数模板使用示例:9 C+ s% m K4 P* G J
在以上那段代码的后面加上以下代码: I; E- l9 C3 o
7 k! M5 l7 e9 K- W$ ]
4 `7 n& S/ F* p/ p/ @( h, B6 \' j1 @8 B. m" p1 |: t
程序代码:
w/ x/ e q" n% p' `7 T8 q( \5 S" z. Z/ t
#include<strstream>& F0 g5 b8 C; S& @$ l) P/ G
#include<iostream>
5 \* T' d m/ a6 }+ F0 p#include<string>) v, p' J" w5 b2 x8 {# M% Y Q) |
using namespace std;
" K9 d7 c; Q' m: I) d! wint main(void)3 {) B5 y" I+ b* k$ A: a
{
- R2 }; M0 O4 O; ^! w string s1;% @5 _/ v3 G1 Y$ n: n% V
while(cin>>s1)
& D6 D" ]% G# }9 s {+ C: D6 P$ y2 w/ P/ l4 E
istrstream isin(s1.data());& T! V' ?! W8 v. X# K
double d;( n2 y7 M+ H5 U( A
if(fy_Exp::GetExpValue(isin, d))
; E% y& A7 a# ]3 r! q {
) F* A, d0 G* S' v4 ~/ R' \ cout<<d<<endl;/ W6 Q* @9 @1 v
}
8 o# n$ v3 Y' }# d0 n# \ else0 g/ R) J' c' K+ T) X5 z
{
u7 e: m6 V. z* Q1 u. Q% G" [ cout<<"ERROR"<<endl;/ D6 V& ^; Q& O' o% X* ^, p
}
/ N0 A6 A/ C/ Q8 y/ V }
& {7 U3 N6 W( P/ I return 0;' g# _, M" l8 y( |) e1 D
}
r6 U& n, h& j0 A# g
! U3 H0 |) k3 x% [# m0 T% {9 ~& [2 Z4 }2 F6 [
然后编译执行就可以了(*^_^*)
2 c% g2 `2 o3 i+ B2 _其它:TC++上一定编译错误,不保证在VC6上也能通过编译
5 _# E7 u- i) o c# c2 Q! g 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|