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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
% j5 ~, M1 h% k一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
8 r/ H' X; ` z6 l) ^只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)( {+ ?7 I/ I8 ~9 S/ i9 j7 s
参数解释:
9 ?. F9 C$ v8 uistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
2 A( j" a2 c' {! b- }nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定$ ?/ e3 r7 o P) [+ \
返回值:6 Z& K0 z- [4 T- t) j
返回非0表示计算成功,0表示计算失败有错误3 {1 H8 v& O- ]8 r
& L9 T7 Y: j: q! ]/ A5 e
* }8 Y4 }' G0 C7 E8 k6 R* j1 e) @8 O! ]3 y# z4 S5 f
程序代码: ; w; e3 C4 N; p" ^
8 f5 k; I |. c( R4 hnamespace fy_Exp{
2 L4 \) h3 j5 t' `' Cnamespace {template <class _T>
" H4 i: P+ ]5 g# B& Tinline _T GetExpValue(_T t[], char& csym){$ U: b6 ?5 `9 [: ]- i7 I
char c=csym; csym=0;+ R6 V' x6 r* s& x
switch(c){
$ ?/ S( s2 }, D7 T) l- u case '+':return t[0] += t[1];- f- A; v3 e! |# i' z
case '-':return t[0] -= t[1];
8 }( Z2 `9 L8 b0 U" R case '*':return t[0] *= t[1];$ u& d5 }/ I" P1 D9 y6 Y
default: return t[0] /= t[1];//case '/':5 ]' @1 U: V/ ~, d9 E2 _* d: D% C1 H1 h
}( @' n( ~8 D" h7 V
}}' m" W0 K: M' B' U
template <class _T, class _Tstream>4 A" w0 H1 B) E! X1 x9 X2 L
/* _Tstream: inputstream, _T: get return value& g# a: `' q: ^. t; K0 [$ u" g: E# E: N* x
* Return nonzero if get value successfully */
9 ^) i0 m* u( T0 I( t- g% ^% |- Sint GetExpValue(_Tstream& istrin, _T& nReturn){4 |9 R+ P) l! E3 s0 b
_T t[3] = {0}; //雨中飞燕之作; f& o: g# Q) F# m
char csym[3] = "++";7 L8 z4 Z0 L! z5 k. r0 P1 z. ~
int nLevel = 1, nERR = 0;; `" o" u5 C' p$ ]3 g
if(!(istrin>>t[1]))istrin.clear();0 s; H' q( y! g Q
for(;;){' r% m0 j0 M6 y: {
if(istrin>>csym[2]){
9 O9 T9 \1 _* X& L. @( Q switch(csym[2]){
7 z; u- ^# X, h# O& p+ A case '(':" A- M) m! m+ n& V* k! m
if(!csym[1]){nLevel=0x100; nERR=1;}else8 z3 a4 T1 k& ]4 U, P5 X4 q
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
2 M6 L. K8 {+ t v% I else{nLevel=0x100; nERR=1;}
6 a" b* V. D$ e8 ? break;
( H) Q1 [; a" s( K case ')':
: D' Y# ~5 C( C* G% Y {nLevel = 0x100;}break;3 M9 | @8 R1 {1 ^
case '+':case '-':case '*':case '/':: w5 J) V' r* g k( I8 g; L- N9 n. {
{csym[nLevel++] = csym[2];}break;2 w% i5 E3 W+ R
case ' ':case '\r':case '\n':case '\t':continue;
7 ^: V* l/ v8 t5 `2 f5 r6 I% c; @$ o default:9 b- Y8 g; u) |) |
{nLevel=0x100; nERR=1;}
- F# S7 E4 D* F4 D: D$ N }" [* l+ L4 Q4 a
if(nLevel==0x100)break;
" ~) u) P* { t- L) c# ]" y8 J if(nLevel&0x10 || istrin>>t[2]){, T; y5 \* q/ M) j" e$ @4 }. u
nLevel &= 0xF;
8 L4 D) K: n7 S if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}9 x: x5 o% g1 \% `7 t. x
if(csym[1]=='*'||csym[1]=='/'){
5 b/ a. F7 N2 H6 P9 [7 H* A+ G2 } GetExpValue(t+1, csym[1]);
) f: k% i. V5 P; a1 b1 o+ T C }1 I. U5 U% |4 k4 S) x1 V5 a5 ?% J
else{! |0 N1 q/ c; U( J# Q
GetExpValue(t, csym[0]);
+ Q3 V- n' b/ F t[1]=t[2];csym[0]=csym[1];csym[1]=0;
+ a$ f; h% L* L3 n$ Q8 T3 v; [& n }
3 S s. d$ ]/ a$ ]) h% R0 F nLevel = 1;
. X* V* r3 f" U0 K1 `2 j9 V6 } }/ K$ u" @+ s+ f% L: ?
else istrin.clear();! R( K7 c# V8 Y, o
}
; n: Y- d6 K% r, i( x+ K% o! @6 k: \ else{nERR = -1; break;}
$ i' G% j6 @ W- V }
. _: d( G9 t. ~1 A7 a4 i( z if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
. g M4 b/ O3 a& }* U- Q else nReturn=GetExpValue(t, csym[0]);
6 r. n$ q! ?$ j5 ]+ C return nERR==-1?1:0;
( e' h+ A0 {9 A; _' k. g5 W1 M}}
# L# U4 S8 w- `) U# g1 M& g- N9 ]
3 r* R9 }( x1 k, O
+ U0 O9 M+ M- Z1 ~5 U函数模板使用示例:
3 W; z1 p5 T3 k! L$ S在以上那段代码的后面加上以下代码:- \# B4 L. n4 ~' |8 w
9 _7 o; v# O+ C+ f : h7 b# h+ h' `, J# \7 [
) u t. l ?8 n" A; n& q: h程序代码: / ]3 G# b' q' b
; _: p, b: u% L: @# y#include<strstream>9 z; K# J5 a" @0 H! g+ @0 r
#include<iostream>
) p5 q# v! y, s8 ]. p0 O#include<string>
- `" r0 k# z! j4 s& A! tusing namespace std;- u3 R! F; q, N. s* c, S; `
int main(void)
" ?3 n% B V K0 {6 @& i{
u% h5 |. y% h" O& A# K string s1;( ]3 e( d7 ]/ @1 x% k# x
while(cin>>s1)
, [0 f- A6 r; @: N' x9 L# @6 F$ M+ U {7 E* U3 V" G5 L" R. u% B; J- l9 g
istrstream isin(s1.data());
) X) T, T: f7 N6 z4 m' S double d;6 h n" W* n0 M# |+ }) R
if(fy_Exp::GetExpValue(isin, d))
+ C+ [1 y# s5 C" v9 A# W6 g: Q {
$ l% z, z/ [7 T3 b cout<<d<<endl;) }" X, `+ w! B4 W
}
3 d" o! ~! o& G else
7 P$ L) ^2 C) [0 w6 b, q. W, j {
( e3 O/ F) U" D1 G# ` cout<<"ERROR"<<endl;& d9 ^) U# n+ T) G+ s) t- [
}
3 C& [0 l$ C: F0 N7 q- E }- v+ i4 j6 K! t9 E
return 0;3 k. c; e( t8 u1 b
}
# ^& w% `2 q) ]; \7 H* I9 U) P- ~' q: g0 h
" j" M+ z( E% t! w: w
然后编译执行就可以了(*^_^*)
6 B# F. p# V$ Q& K( ^) V1 T Q其它:TC++上一定编译错误,不保证在VC6上也能通过编译" U, [( W5 w! p& r
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|