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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
2 Y- _2 v+ n3 V, T I; S; Y一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
) I+ {0 Q6 E) u2 y' p" \# Q% \只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)+ o4 {6 U h( V, B: s1 r9 X
参数解释:) ]- t5 P. l3 U8 x! Y/ c
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流% b- |; g; G1 _
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定1 G; {$ \2 v q1 w
返回值:
( j; n4 U/ w& A返回非0表示计算成功,0表示计算失败有错误) a$ ^2 @" f" O- O3 z* ]5 }# ?
1 M: @. @ h0 _ v1 C
1 E6 f4 }- |" a# ^- S1 c4 T3 ?
% D9 G$ Y6 `: I7 m程序代码: 5 _$ q! Q6 d$ X9 T7 n
* r$ N) c; T% t
namespace fy_Exp{+ z3 A' R6 a( k4 n/ w Q
namespace {template <class _T>' ^9 r! i2 I$ J, h; y
inline _T GetExpValue(_T t[], char& csym){
2 y4 i& Y) d$ x1 U! b4 d char c=csym; csym=0;. L p+ `0 N0 e4 D; y/ Y
switch(c){
: W q. r# K1 n( v4 z case '+':return t[0] += t[1];
9 ]# M6 B% A% V* t# U: u case '-':return t[0] -= t[1];6 I0 @5 f6 X6 t/ ^( Y5 b$ b
case '*':return t[0] *= t[1];& U7 [: B W' ]2 X+ y& \: {% [
default: return t[0] /= t[1];//case '/':0 u, \8 O; z" {% L6 A* S; S# _- @
}8 k6 O3 Z" w' z6 e/ k& w( ]
}}
* S; @0 q3 G5 a; ^template <class _T, class _Tstream>8 h2 C# n) g+ `( @, `# [4 L
/* _Tstream: inputstream, _T: get return value
6 V3 ^; t. Q* w0 L* Return nonzero if get value successfully */3 a; K7 F' |3 v) Y4 V6 F5 c+ |
int GetExpValue(_Tstream& istrin, _T& nReturn){, {; X+ S5 \2 M _4 v. [2 O
_T t[3] = {0}; //雨中飞燕之作% v. c! o3 Q8 p5 @& q
char csym[3] = "++";/ Y+ p9 k9 T9 W
int nLevel = 1, nERR = 0;
% U% _: ^ A6 w8 B2 G. Z' v) f3 s7 ?& c if(!(istrin>>t[1]))istrin.clear();6 b: E0 B- m5 w0 [& w
for(;;){
: q1 R6 r, ~/ x3 J5 V5 C+ l8 ^, q if(istrin>>csym[2]){' C' Z% O( b4 W$ p6 p4 z& c# J; A# ~
switch(csym[2]){
. U$ C/ U7 j8 m4 `5 j case '(':, u) n3 G7 c4 m1 m# p6 _1 c ~2 Q5 @
if(!csym[1]){nLevel=0x100; nERR=1;}else
2 g, F! V2 k) o! } if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 x" b. d( t u: T9 s$ E
else{nLevel=0x100; nERR=1;}
- G- t y7 q) B( O break;7 k; H' f6 H( {: B4 p+ e( t
case ')':- [, [$ K: F; I9 ~. h, N( Z) a9 M& }, h
{nLevel = 0x100;}break;
! Y: n( ~1 y) n j( k+ R2 i; {; S case '+':case '-':case '*':case '/':
! e+ t7 P* s5 h" {5 R" Y {csym[nLevel++] = csym[2];}break;9 b6 z4 |9 u) \ }2 H
case ' ':case '\r':case '\n':case '\t':continue;% i/ ^/ x4 T- L
default:' K) b \% @5 I9 W7 Y
{nLevel=0x100; nERR=1;}
- K d* {! b3 S: m. M) m" h }- c$ l: Q! F$ A# X" f4 Y' k8 a: l
if(nLevel==0x100)break;
$ ]5 ~. T! `! y6 m4 k6 R if(nLevel&0x10 || istrin>>t[2]){) w" V: i) O6 G3 S. n
nLevel &= 0xF;; @' Y W! _# S* m% B: t
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}6 E" b& W8 p4 i6 M
if(csym[1]=='*'||csym[1]=='/'){/ ]- d4 r. u6 ]( p) h: g/ }
GetExpValue(t+1, csym[1]);% p% n; X0 d2 R6 X `3 v
}! @* m- E1 x- ]7 h& V
else{* l# }0 g8 N* e5 j3 G" [
GetExpValue(t, csym[0]);
p3 }7 D) d6 z6 S' A2 P t[1]=t[2];csym[0]=csym[1];csym[1]=0;5 M5 \! B5 {5 P, F; ~
}
& K0 G4 i; J+ \& s3 y nLevel = 1;2 F4 @ b, W7 ]: L2 S- |7 j
}
* A( s6 q+ N2 m- r else istrin.clear(); b2 Q: a0 `# q3 B6 ?( A4 x; |
}
8 j7 e; c' n% ?7 h else{nERR = -1; break;}, D$ G& H/ p; k9 D6 n
}
5 R! D; W) p+ p- x, F7 q if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
% S6 z$ X* {* F% |; B( t e5 F else nReturn=GetExpValue(t, csym[0]);
, s# K0 H- f& r# X- ] return nERR==-1?1:0;; m5 A$ @. }5 {9 O: M
}}
2 [$ ?; G. B# N7 l; y$ }6 \8 Z$ `9 V+ {. B
' O) L% X! u% F: k+ T
) x& F9 j7 i `$ S函数模板使用示例:+ u' A# M. \9 k2 N: S
在以上那段代码的后面加上以下代码:
8 N$ W! G% l& V. L! _! t
6 B, V9 Z( p0 ]* o9 A3 A
4 p# ~9 c8 ?9 J) Y. `6 P3 X w8 g/ W+ |5 q' _
程序代码: ' \$ A+ E: U/ X8 k3 b$ X9 x
/ x2 S& X& ]9 Q) V1 J) N
#include<strstream>+ V# b3 O. }6 v$ W k0 S4 b9 N4 B
#include<iostream>2 d) R! W' Q" ]+ c+ ~+ w# W
#include<string>% e' x7 x- W( n& z/ X: s8 p" w
using namespace std;% ~- H) H, @1 G) y
int main(void)0 n, F2 x$ c" ~7 {
{% x+ I0 L {* `7 Z3 g6 i) E: w
string s1;/ A" V* d( L* b! I/ ~7 w( A
while(cin>>s1): `' f9 {; I; O V1 H: {
{
4 B. P8 M( x) X8 \; G istrstream isin(s1.data());, f% \ ~! g9 {9 A& T
double d;
4 @0 ^2 ]& e A( k4 L if(fy_Exp::GetExpValue(isin, d))
! a- m. b/ Z7 V4 |- f1 H {
3 R. E3 ~) U: S( ~3 v cout<<d<<endl;) _# r5 Y2 Q, |) }6 B/ [! _
}- q, k3 v B7 A9 a- l
else% T, ]# D/ T/ D* \
{
$ A; T! d5 P4 j C& ] cout<<"ERROR"<<endl;
- i* O9 x0 Q7 t5 d* d& D) v }& h E" K' \1 c- j( u/ ~
}
" ~% u* p* u, W9 Z/ `( f$ \, b" K3 z return 0;0 F1 [' {4 n0 C: o6 X/ v$ d3 i
}
9 V% c8 X' `2 E: \+ I
' N1 e5 Y( z! K9 e. w$ d! i
8 a3 ]( \% Z5 M然后编译执行就可以了(*^_^*) x! @, I, I+ d+ y
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
/ c& K* E @" i* i1 \; _" e 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|