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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,0 W7 W3 y; B l8 n$ A, s9 n
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式' u5 y( Q' E) z$ I
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
7 h- s8 }: q, V9 C6 h+ M: g参数解释:
! q P8 Q, e' N3 P: e# Ristrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流; [. e, }' U8 t8 c1 y6 L
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定' S7 v7 A$ y6 s; @% K4 x
返回值:7 Q' w$ F- Q( m" q' ^2 h
返回非0表示计算成功,0表示计算失败有错误
: r7 \; n0 G0 W9 n0 h& F; ]4 ]. g9 L& H- K: O) P
7 N9 y$ X5 e: d8 s2 M( C0 z! c% f0 d8 i9 J
程序代码: ; P. c& @# D3 R! r( L' ?. p1 `
& X2 I1 B. l6 D% D; t6 {namespace fy_Exp{+ N% Z0 ]' B, R+ }1 _5 S
namespace {template <class _T>
- C' d: X( h |6 r Ninline _T GetExpValue(_T t[], char& csym){
& [. B$ [% A$ ]! v- r8 p1 z5 \ char c=csym; csym=0;8 m+ z! q" X6 y
switch(c){3 }# m+ g: Y& x
case '+':return t[0] += t[1];9 c$ J) L( T/ B; R# p# g# J# J1 h
case '-':return t[0] -= t[1];
9 p) `1 d* i8 |+ b, [5 C case '*':return t[0] *= t[1];, z8 P% F! J; \& K
default: return t[0] /= t[1];//case '/':" _4 ~( I8 B7 b; C& r6 f8 A
}6 | M9 J7 c1 A
}}
4 ~- E7 Q' X; t: G0 \( Y4 l e! jtemplate <class _T, class _Tstream> y' u3 |* O' v6 X& D2 F
/* _Tstream: inputstream, _T: get return value
4 q' |* d* c8 O0 o' s" y0 E6 k* Return nonzero if get value successfully */
+ a/ N6 Q" x5 H4 sint GetExpValue(_Tstream& istrin, _T& nReturn){. v" S! D( \! p6 a' B2 k
_T t[3] = {0}; //雨中飞燕之作) R1 M/ E4 q3 |0 j f9 [( T' h
char csym[3] = "++";; I7 z: ~) i7 G
int nLevel = 1, nERR = 0;
- r4 V$ @" m! @3 m5 U8 V" B0 [, y if(!(istrin>>t[1]))istrin.clear();$ @; o" J+ ]& e; s
for(;;){
4 ?# K% [/ b7 a& v if(istrin>>csym[2]){
; x/ c ]! F& M: u9 g' s& B+ { switch(csym[2]){
: V7 |2 R+ l7 V) ] case '(':
3 a' L, F( g- o4 y5 r' I' ^ if(!csym[1]){nLevel=0x100; nERR=1;}else
! W& p* ~5 a8 U: [. Y6 z: E9 o3 b if(!GetExpValue(istrin, t[2]))nLevel|=0x10;% J# Z8 D/ |8 g) D1 O* f" H
else{nLevel=0x100; nERR=1;}
( X/ L' f( f. U" a; j break;
4 S% N% l6 X6 m0 P case ')':
; j* C+ J) j, m; U) T {nLevel = 0x100;}break;, L. Q5 e: ^0 e
case '+':case '-':case '*':case '/':; c% h8 Q; K- y! R
{csym[nLevel++] = csym[2];}break;
d! ^0 v) o2 h0 m& h' w, Y case ' ':case '\r':case '\n':case '\t':continue;
; }- P: Z3 ?) K2 S. }! Z, r default:+ Y* ?; K8 q: P6 ~
{nLevel=0x100; nERR=1;}. u/ l3 h$ f! M2 T* v
}
/ q: }4 D9 b- C9 o7 s6 D. D1 V if(nLevel==0x100)break;
* k0 h& V# p' f2 t# ?6 A% n if(nLevel&0x10 || istrin>>t[2]){, L# {; T4 K M3 p
nLevel &= 0xF;
# f$ m* M; e; e8 N6 K if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
* F V! i, X) q1 f. _1 R if(csym[1]=='*'||csym[1]=='/'){
9 T# g3 m- ~$ D GetExpValue(t+1, csym[1]);
9 F$ b7 W: {; e' l8 N* m( D }7 w1 f3 }1 u; P5 D
else{
0 o# W l P+ Y, P8 Y$ t$ I1 F GetExpValue(t, csym[0]);
1 n2 @8 T% \* R t[1]=t[2];csym[0]=csym[1];csym[1]=0;8 y$ t/ }5 r2 I! W
}
+ _+ c' m- c2 c$ P- h9 [ nLevel = 1;! w5 |# N* r" m# v; c
}' o) h. i# N8 ?
else istrin.clear();
; c- L. B. f8 N" r. H }
) m8 w# B' {% m' \$ `% d9 n else{nERR = -1; break;}
' q. q# R) m% a- L }4 J' t& H8 H8 T# }: I
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
4 S) \ W' K, C% X. \* A% A else nReturn=GetExpValue(t, csym[0]);6 q5 t3 _/ d8 j2 `: R E
return nERR==-1?1:0;: z# h0 p& g, J7 q
}}. e; `4 d. g+ @% S% L; ?" ]
$ y4 _" p* F. @1 X$ Z7 ~
* q3 a0 k* A" F
9 T5 ]0 c1 g# M8 n; `函数模板使用示例:
8 V, V2 h# ?2 A/ O5 U+ e' H! i$ v在以上那段代码的后面加上以下代码:
/ O6 C( u4 {, N' F
$ X/ P3 n5 t% ?. H* S3 H
% s/ R& |/ F0 Y3 H0 v: S9 {6 Y5 z( p+ p9 b0 l' z% m3 U* _: S1 q
程序代码: % u! X& H% U3 y; M% j
: b+ |: p' j+ G: c' G#include<strstream>, Z8 n& N$ h, a2 Z% L0 d- d0 z* |
#include<iostream># q1 O7 d2 E: N) i
#include<string>" v9 G9 n9 c7 v6 X. c0 o* E0 I
using namespace std;
$ ?- d3 i9 O2 i3 G0 c; B5 Cint main(void). r+ `+ J, E& U
{
. {: N! H3 L/ J string s1;' s1 \. V6 e& Y# a. P1 v2 X6 y
while(cin>>s1)% q5 @ o* s8 i- M- I
{
4 _4 h4 A4 h0 ^ v& e. b istrstream isin(s1.data());8 K0 |' ~ `0 w, i* ^$ v
double d;6 k, a) _- R" m1 t6 r
if(fy_Exp::GetExpValue(isin, d))
1 g0 A5 v/ Y) R) ~ {7 M! Z+ n) C! s( I8 {
cout<<d<<endl;
) ]. F* X$ [$ W9 S5 ]) L- C2 Z4 w }- r0 Q* \; d. E* q8 k+ o
else
$ X. V4 l& \. Q' {: g: Y' B8 N0 X: K' i {
6 G: L% T2 a& u cout<<"ERROR"<<endl;
5 J5 q# j8 r6 y }: W6 V/ W2 @# @/ |7 z
}% X% t" V7 q2 e5 ]8 C
return 0;
+ M' J2 g7 q) B1 V5 g}4 v; F4 H& X% e* i
# E: ?; l W! B
1 m" ?- r% d1 j8 q3 V, v然后编译执行就可以了(*^_^*)
' z& ?7 R2 r3 i其它:TC++上一定编译错误,不保证在VC6上也能通过编译$ J! B2 I& `0 R6 r7 ?
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|