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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
6 x: f0 O+ ?7 O$ S# f8 P一个很方便的函数模板,可以并且只可以计算含括号的四则表达式+ W# `% S7 a E+ }7 x& E
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
2 h% {$ A9 s0 J- d; M2 G参数解释:
$ ?* K* l! z+ }0 u3 o& yistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流" w" z* K. l) m9 Y/ b0 H1 H
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定: q' ~/ t! |* _$ T
返回值:
8 O# T3 I* l! s1 _返回非0表示计算成功,0表示计算失败有错误* {' N' I: l1 \& K0 c) i
$ l& T6 v* E# q8 G. w# h
0 Y/ m. S( ~1 K
/ L) x' C4 ?' `: ~9 v程序代码:
% E2 p+ P/ \: T4 C3 |+ t. Q
4 I$ l5 v7 r" f% S, ]$ J) k$ \3 mnamespace fy_Exp{/ E( \5 w* E: C# u0 ]
namespace {template <class _T>
+ e" J6 u& Z- `" d) Xinline _T GetExpValue(_T t[], char& csym){
8 y3 x8 D4 \" `3 P- [) s) A) i3 u char c=csym; csym=0;
& I+ L' i2 l: f' W$ a) M switch(c){, k% ]2 w$ S3 h3 q3 ~- A
case '+':return t[0] += t[1];4 M: J U& Z# |5 O: S: a0 z5 w
case '-':return t[0] -= t[1];+ ~2 h8 S1 F( Z2 l) w
case '*':return t[0] *= t[1];
' y& B. V: X8 B7 |) S) P, L" ]' k default: return t[0] /= t[1];//case '/':. h/ \) T p7 N
}8 l w( o( H( v) v7 X
}}) c- A4 n# S! |' b1 K1 V' C) I+ o$ S
template <class _T, class _Tstream>" P) I" h# _8 d/ Y; M! |% m
/* _Tstream: inputstream, _T: get return value, C! }4 r& ~# m5 O: S) y, f
* Return nonzero if get value successfully */) p1 w: ~6 Q# W* o" `
int GetExpValue(_Tstream& istrin, _T& nReturn){
; S) l _; ^$ A8 H' X _T t[3] = {0}; //雨中飞燕之作
' [+ C* M; D- _% m6 p& }) a; z char csym[3] = "++";
3 y5 g7 b1 f+ A: k/ p: z& c int nLevel = 1, nERR = 0;
9 T2 {# c1 ]1 K# g! O# X. g if(!(istrin>>t[1]))istrin.clear();
. w2 ?7 }% c, {. N1 P. q5 R$ t9 i: B for(;;){ p, Q( U0 |7 Q Q3 E, s
if(istrin>>csym[2]){8 `7 q# w G1 k" w- a5 o- Z2 _
switch(csym[2]){) H8 `' U w& `' D, B8 m
case '(':' j9 \( m- h% a1 S( Z9 |
if(!csym[1]){nLevel=0x100; nERR=1;}else
' e- \6 u$ n% g2 Y- x8 `. E$ i if(!GetExpValue(istrin, t[2]))nLevel|=0x10;: X4 i. q, `2 ]4 z
else{nLevel=0x100; nERR=1;}
/ D. D+ H V$ w+ ~+ D/ L% ? u break;$ h, S0 K. `4 |! [+ q4 }
case ')':
& e8 W: Y/ v: w' B* p {nLevel = 0x100;}break;
; V' X6 C$ ?( _# r" I1 g1 I& W case '+':case '-':case '*':case '/':2 Y; g+ q8 V: J, M
{csym[nLevel++] = csym[2];}break;
' t; o' H9 q) q0 r: T' J) N case ' ':case '\r':case '\n':case '\t':continue;; H. S( U7 k2 i: p9 u
default:
. e, M1 w; A5 C1 J- N& p* t {nLevel=0x100; nERR=1;}' X; L7 e. |1 p2 \% c: D
}
* F; L: u& \0 j+ y; z if(nLevel==0x100)break;
; ~/ e3 x. h$ k, M8 |6 n; G- f if(nLevel&0x10 || istrin>>t[2]){$ u6 @4 c x/ o3 Q9 t7 e
nLevel &= 0xF;6 U4 }6 r2 S" h$ r( Q2 ~
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
: z/ q$ X# @) B5 a6 c/ G if(csym[1]=='*'||csym[1]=='/'){- A; n% M2 L5 v. P: p3 S$ Y
GetExpValue(t+1, csym[1]);
" c$ ? t/ B- ~' n6 |( K }* g: g' T+ S5 g
else{
: c4 t2 f9 R3 i1 k$ Y& i4 I GetExpValue(t, csym[0]);' P" } v J7 j7 Q9 k
t[1]=t[2];csym[0]=csym[1];csym[1]=0;3 }( }& i, Q$ B% R
}
" a- i) f) h& D nLevel = 1;' D( ~( {4 a( R3 i: |. P, s1 M
}
; U/ {6 I# G7 r else istrin.clear();
+ C7 t0 ~* Y0 n6 K, s' n }/ F/ {, j! ^; ]2 X2 g/ c+ }9 t
else{nERR = -1; break;}
, F X( g3 _& j5 i! ` }
0 T7 u( x- F$ {+ z5 J: w) p; J& c if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
; m6 j& o9 ]' w E j) k else nReturn=GetExpValue(t, csym[0]);
4 p7 ~+ z0 p( m% e. Q! i% h return nERR==-1?1:0;0 o! k* {6 |7 I' _" _% i- b- E
}}
3 Y1 ], _' P: @, X6 g3 q( E$ p) w. `
) D |1 T: Q# B& x' W! d# i6 `! I {! e+ A6 M) N8 M
函数模板使用示例:
3 H* L) C, x5 Y8 t! y: T. ~/ i在以上那段代码的后面加上以下代码:
2 A! K. i, ?2 w( [; Y, R. A8 n. F' x3 g, b1 r0 I
- m9 u9 ]: {+ B. \1 I" i' a
. k- G$ S4 w* k; |- x程序代码: , y: U( e% h3 t2 V o1 d
* ]8 G( B1 N) L) c( o/ A#include<strstream>
( p* O# s' T1 Y" C3 O#include<iostream>4 ^" R& W# n* O1 K8 W( {# K) Z+ J
#include<string>
r) t; e1 a8 \ A, R2 J# `using namespace std;
! N+ B- ]& x8 a1 w# @+ Fint main(void): Y* ?% y3 N' a# ?5 B
{
3 a* z, n; O. u# B string s1;
9 _/ [$ z+ N; ~: p! v2 N+ A+ u while(cin>>s1)
3 i/ H% j* B! k( m# I% A. q6 i {$ v3 @3 J: c* j& M. F
istrstream isin(s1.data());
* Y% P7 _1 t( d& E double d;
8 ~8 m4 S! Q m& i0 X! [" [ if(fy_Exp::GetExpValue(isin, d))# S: _$ r8 `8 F5 e8 O
{
* _% n* J( U- o$ H. L# { cout<<d<<endl;
# C- _8 T! s# N4 K }
( e0 g: z) J' y- t( [4 N" O7 b) ^ else
; r6 p8 D' o0 q) I0 g {
+ f+ @( ]5 o! W+ T cout<<"ERROR"<<endl; B$ A) @# ?) R
}5 K; Q* f. X' }7 A$ B9 B
} ]- R/ m! M2 a% `' p' X
return 0;- Y t( o- G$ d
}. l; S6 c2 \$ B5 b/ L& ?
3 g; Q0 n# R/ A+ g
% G; J1 A |/ r* e然后编译执行就可以了(*^_^*)
2 i" N* X$ y( v2 x$ e: W其它:TC++上一定编译错误,不保证在VC6上也能通过编译
# `: ?' I7 u6 ]; Y0 Y" B& p 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|