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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,5 B, c# {6 k+ ^) b7 M
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
. n3 D, r! ]5 Y' V: K只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
9 K# w& v; I1 ~: C( G9 W1 d参数解释:) B- l$ ~: w' s7 K) r
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流6 p2 B" H- F9 t# J/ L, y0 u8 a
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定( U! [2 R' O# M7 A; d
返回值:
& M. N# G8 l7 R: A返回非0表示计算成功,0表示计算失败有错误
/ R- H z% [$ R" Z- N/ ^' a: B0 G
# C0 t8 R4 D% L( v+ q. z ) Y; m( T( H; j9 V
$ L& i) m0 Q ^8 w5 |3 c6 [
程序代码:
$ [- s9 I: t; ]: Q4 V D4 B/ n$ j, w( n) P! P& z
namespace fy_Exp{
* a" |, b9 j3 ]. h" S0 knamespace {template <class _T>
+ y" g2 W1 O" R. Zinline _T GetExpValue(_T t[], char& csym){
* S: a3 |; [, ~0 a char c=csym; csym=0;% _& V* K. {. Y
switch(c){" i, ~9 D' P$ y: c' t q
case '+':return t[0] += t[1];
. n% z8 q2 J! y case '-':return t[0] -= t[1];
" L# N5 X* n, B+ [% V case '*':return t[0] *= t[1];0 c) v$ m8 |3 X$ L* Z7 T9 |
default: return t[0] /= t[1];//case '/':, i/ X4 S( t( Y7 g: b) ~* i
}
; I5 x( W" C1 T. X}}4 K$ @& }4 w a9 v$ u l g
template <class _T, class _Tstream>
. x. o9 O3 c. X/ n/* _Tstream: inputstream, _T: get return value
6 T% e8 s8 M2 i4 P7 g* Return nonzero if get value successfully */& \! u3 `; X, x. P- I# ?
int GetExpValue(_Tstream& istrin, _T& nReturn){
C4 o( t6 K% C. X5 L: _ _T t[3] = {0}; //雨中飞燕之作
& x) q% r) `/ ?. b# k9 v( k char csym[3] = "++";7 s. }# X; x, X9 ]7 S5 |2 A2 a
int nLevel = 1, nERR = 0;% C6 Z5 R9 k7 c; s% @9 v
if(!(istrin>>t[1]))istrin.clear();
7 x" F- O/ D. O Q$ r" B( D for(;;){( G0 t& ?2 [6 Z/ o, D0 n
if(istrin>>csym[2]){
0 d9 p/ z: Q0 V& W: R, C3 g; v switch(csym[2]){
* `# @2 w. ~* t case '(':
, A6 S, u& S/ e' \: ] if(!csym[1]){nLevel=0x100; nERR=1;}else
0 d1 a4 Q% e. X" p, O if(!GetExpValue(istrin, t[2]))nLevel|=0x10; Y8 S" m9 W; n& [' @
else{nLevel=0x100; nERR=1;}! r; D8 V8 T) a, H
break;
5 G" z) k: [1 s7 b, a H0 P/ `+ E+ q, {1 U; W case ')':& u. ]5 g% B& I4 U
{nLevel = 0x100;}break;5 ^0 k% Q) b% M$ J
case '+':case '-':case '*':case '/':& k; C2 i; q6 u( i! {- x& i* q
{csym[nLevel++] = csym[2];}break;! @- i6 O" J5 J& F) _4 H
case ' ':case '\r':case '\n':case '\t':continue;3 @+ w. S! K7 P8 }6 n: y8 X+ G
default:& ?5 v+ Y; q: Z2 E C; d0 H1 Q" I
{nLevel=0x100; nERR=1;}( W( u3 Q8 U& s# s- E: c" D
}
* W6 |4 B3 t a4 t' d if(nLevel==0x100)break;" p/ Z$ F- s, d9 \% _* M+ v- y
if(nLevel&0x10 || istrin>>t[2]){
6 {/ z" k+ t" N nLevel &= 0xF;
; `& n) ?4 q% F if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
# D1 F N5 p5 [5 [ if(csym[1]=='*'||csym[1]=='/'){1 P7 N# y5 E: |1 \1 p7 K
GetExpValue(t+1, csym[1]);
0 Y+ ^6 u' ~) G) M! F7 a X* D }# Y8 E; ^. h Q/ [: a: G
else{# r1 y! O$ @7 K
GetExpValue(t, csym[0]);( Z& r. r& Q( c4 k2 h! t5 w
t[1]=t[2];csym[0]=csym[1];csym[1]=0;) x" o' }; z' _- h8 L9 e
}) e9 K! x* B8 f( ]/ s6 F1 G8 ], ~
nLevel = 1;9 n1 q, v6 b. }5 C
}
% E/ V+ A0 a* O8 c- B3 j0 N( u else istrin.clear();; O; p, G7 [5 a- w# V
}
" G5 r# s. z5 u+ d# _6 i else{nERR = -1; break;}
( }) l/ a& _& W# H- v }
% A% g" `0 q3 j$ Y if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
5 H- S9 V/ m6 N' w else nReturn=GetExpValue(t, csym[0]);3 B3 w9 l' x/ K: v7 _8 b- {+ b1 a& s
return nERR==-1?1:0;
. v' w N/ w/ F; W}}
& t7 T+ x/ U7 |, y; `! S3 c! ~- b4 }3 s. n
4 S' @* B, y* ]
9 d7 ^, J) m4 j# L5 B: a函数模板使用示例:
# i7 ?- @8 a/ F; F2 [在以上那段代码的后面加上以下代码:4 Y0 ]2 R6 `* c- d; v6 I5 o
6 d9 x9 `0 F8 v, U! R/ G
$ x% B1 B+ r' {. P+ I1 v/ a# Z/ `, m' g! f0 J$ P7 X9 W* u+ v
程序代码: ! N& y& t; l; f' E
. p( M5 `5 I! V w1 u3 p& u' g#include<strstream>" K: j+ @) y, L
#include<iostream>
' e% B) b2 D+ i#include<string>
+ b" R5 k+ h& d/ z- t0 J8 jusing namespace std;
) k- I1 I' U( B! d: I+ b- [3 H7 Oint main(void)& h9 z1 p$ S4 d! [
{
3 |$ g) Q) ]% g" @6 D6 X/ i string s1;+ D6 }2 I6 ^' z5 O- @
while(cin>>s1)
# v2 l# W# S+ W0 ? {
" ?7 M0 r* g8 V istrstream isin(s1.data());. `, z2 J y+ q" I2 ^
double d;
& V- O0 y, M( ^# ? if(fy_Exp::GetExpValue(isin, d))' `' z# J c2 J, B1 s
{
; i& j1 z2 A3 p cout<<d<<endl;; E6 ^( _. N# ~# D+ y
}
7 y6 |6 a+ l2 } else
, |. v/ X9 x! g5 w% a {# G7 g) c4 W2 W9 F: h9 A7 q- l5 L
cout<<"ERROR"<<endl;: w. g% t, p4 g7 r
}
7 T# |* q, Z/ K1 X8 F }
$ B# Q; C0 q. m return 0;0 G1 s4 x1 N5 ~4 S c
}
$ T9 |. D* r0 {
# v9 m- w5 ?, I( q1 S( Y& M5 [& c1 C% @$ |, F* B* @
然后编译执行就可以了(*^_^*); [: Y, {/ v) {" _* K3 \
其它:TC++上一定编译错误,不保证在VC6上也能通过编译, E! U O8 z& |7 M3 ~
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|