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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的," C& p- |9 V1 R* s
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式7 r) }) l3 e" j1 \8 C
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
4 W1 ]- j7 \/ O2 Q+ q参数解释:
/ g: e1 k. c9 g1 ~4 Q V6 A. ^istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流6 ], A5 r% M, @" S6 M
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定
# _2 b `' t2 e2 p9 S返回值:
. v0 O) w$ T7 N. d: u) ] r f7 D返回非0表示计算成功,0表示计算失败有错误$ y( |0 _# Y; o8 a
7 F0 N1 F$ J4 U7 B6 ]: m
% A2 g9 ?0 \/ {" T. o' y6 u- M1 D$ o0 ^6 q9 c M1 q
程序代码: ' O& i& q6 m) t* o+ ?+ Q! G
$ u8 s4 I8 z- ]4 _4 c* }0 x
namespace fy_Exp{( s5 }1 z1 ]- q4 H/ c
namespace {template <class _T>
. h9 d$ W; D; j5 p6 q+ q- b4 Iinline _T GetExpValue(_T t[], char& csym){
# a! o6 @( A3 e9 _ char c=csym; csym=0;
7 [+ O6 g& V7 @! n switch(c){
) x' W, j5 M e! l. ] case '+':return t[0] += t[1];
* \2 n! j, c$ ~ case '-':return t[0] -= t[1];
* q2 _ m% D9 N# k* X) U case '*':return t[0] *= t[1];0 o, C: Y/ U0 `+ S
default: return t[0] /= t[1];//case '/':& Z/ \4 D7 m- ^" r
}3 q5 |( p4 Q% o* B1 a
}} Z+ D$ n, V1 S4 w0 i
template <class _T, class _Tstream>& b" t2 u1 u! g4 g4 }
/* _Tstream: inputstream, _T: get return value
. C% B0 I, T# T, ^' u6 Q* Return nonzero if get value successfully */
0 X! t$ l* Z. V$ t8 ?/ k" iint GetExpValue(_Tstream& istrin, _T& nReturn){9 B D* D" ?9 R9 b
_T t[3] = {0}; //雨中飞燕之作- F" ]$ @" r7 ]+ ` ]4 ~/ O
char csym[3] = "++";6 P% y4 |+ } j' F' Q1 d
int nLevel = 1, nERR = 0;
: V5 Z: @0 _: W8 G5 H' u$ j& a if(!(istrin>>t[1]))istrin.clear();
# m' U+ Y, F2 I, f% |* q5 l: t4 |) i for(;;){: e h R+ ~$ [! h1 a0 |
if(istrin>>csym[2]){
3 j& d& ]/ n: V" R/ M. l9 V" | switch(csym[2]){9 {- c! r) }. i! R! _. _+ g0 J% [
case '(':; a/ y% z2 `% ~0 X* Q4 s# T
if(!csym[1]){nLevel=0x100; nERR=1;}else: ? H5 k6 {8 C; q8 i0 c6 W
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
) x/ }* M4 w& Q& N3 C8 K! y7 ^: d# k9 G. x else{nLevel=0x100; nERR=1;}: k& q7 |- i; C+ l# S, m+ k
break;
# P' ^( G- g1 ]. ~6 d case ')':
5 y+ {+ V- C. p d% P7 ? {nLevel = 0x100;}break; O9 l, T" D \& D
case '+':case '-':case '*':case '/':' ?) W5 N& R% V: z0 N
{csym[nLevel++] = csym[2];}break;: |! z" [8 X: c# w1 y
case ' ':case '\r':case '\n':case '\t':continue;7 K% ~2 z# K+ v& S7 G
default:2 t. n" {( J6 N' a( Q1 W
{nLevel=0x100; nERR=1;}
* H' ~& U# B+ a! T- P3 y }
$ y1 r! k* `4 ?) Z: u! i" [& Q1 v if(nLevel==0x100)break;
$ D: n& @- p& Y0 Z: r3 N if(nLevel&0x10 || istrin>>t[2]){
3 F* c3 m2 c( k+ ~3 p' y7 c* O nLevel &= 0xF;
- s; P4 a$ O3 r if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
8 G5 ?+ V: N4 i' @/ `- f( r1 I if(csym[1]=='*'||csym[1]=='/'){' d7 J. W! B! M. H2 Z/ {
GetExpValue(t+1, csym[1]);
3 \: V2 o) _2 r$ Z/ L1 _# N) Z }' Y% C/ |) d" P+ H7 H
else{, \1 b4 u; L# Q: h' t+ U- U5 e
GetExpValue(t, csym[0]);
) _& N: W& o8 a. i. o6 l1 d# _ t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 P0 q" a* S/ A; t
}+ [' d" ^$ ?. S1 [
nLevel = 1;
8 G- V' ^+ ]7 _ }
8 U( b/ m2 F4 I: v; ^* n/ E else istrin.clear();
6 F" `! s: R) C! Z, h9 W }8 V: j: u1 D& b0 E$ \8 I% {
else{nERR = -1; break;}5 B" J- Z; j8 c( S8 k L
}
% z$ g& r0 Z! v/ e' v; D if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);. v. `# r1 z1 h0 A
else nReturn=GetExpValue(t, csym[0]);
6 C p! s/ m+ o return nERR==-1?1:0;# O( A2 U; h; L. \2 J1 ^
}}: l+ t$ {8 q: B5 z6 M$ U
* S2 h. s3 t% ]$ I1 J I1 ^
! L! ?4 ^: V2 R. x- {9 B
" p9 C0 |: s5 J8 K2 b2 Y函数模板使用示例:& j) m# j2 b9 M. S" O n ^# N1 R1 E
在以上那段代码的后面加上以下代码:
- V( K' ^ t+ I1 y) H2 x3 n1 @) c1 x# Z' W# u1 \
Z2 z! }" E* x" Z- n: O, E8 Q& w* @' ^, N, w5 O
程序代码: ' i5 V* A2 D0 s t
3 p/ F2 r& t/ R! d6 V* B#include<strstream>
: ?5 l( w4 o! F' K3 G#include<iostream>
6 r6 r! u5 M: n1 n" ^ P#include<string>) {% e. \5 y& J, }. ?/ O# b
using namespace std;# z4 V* A5 T) ?! r( V: ~8 z+ j4 X# |
int main(void)
/ a5 k* _3 l& O- G) w{
3 G V p6 B( |8 t string s1;
3 i5 W: }' p/ ~/ B) Q, ]7 v1 y8 ` while(cin>>s1)
+ r& E- `/ p9 v3 ] {
; Y0 w- C) _* |. k9 j istrstream isin(s1.data());
* v% i2 \* Y' i' h; C9 s* U- d; U; F double d;
; u# ^1 V' b% P+ z' a) | if(fy_Exp::GetExpValue(isin, d))
" }* d3 V) [9 i: F2 d6 A {! }! e1 o6 X- J, `7 R
cout<<d<<endl;
3 u0 T0 w7 J. |4 S( f5 t6 d2 k! m; I }) M5 n# X% o+ \; K$ |9 N
else- E" Y! F2 W; V/ t/ Y/ f" O
{+ \. w% C% u$ K, e) {$ B3 s2 c
cout<<"ERROR"<<endl;4 @. r1 b' j/ Y# h6 ]) I
}1 \4 o* Z7 C0 z3 `6 Y' s e- n6 U
}0 a: X* e) K5 e/ o- I" \
return 0;7 Q# R3 Q4 ?% _ ]* F- p+ J C; } h3 d
}, S$ }8 J% L: D# S
$ _3 h+ s( \9 {1 m0 Q4 r
, E' b- u6 ~; M2 c然后编译执行就可以了(*^_^*)( n( i6 ~. V. z- M( @, M' V) G. n
其它:TC++上一定编译错误,不保证在VC6上也能通过编译
; Z: x5 J. j6 i& ~ 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|