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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
' @# X, _4 o/ |) i一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
5 H; t- d. W7 h0 Y9 b+ c3 R只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
* h7 f. D' p& S/ c- ?" U" O/ u$ ?参数解释:3 x! Q% Z) T3 I3 ^1 m. u9 H
istrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流3 F B3 `! e6 q1 k1 k9 o# m
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定5 g# M4 f! t/ V9 z1 d" N$ S! U! `
返回值:
z3 v7 C) C! \5 I, |# Z4 Y, J; T返回非0表示计算成功,0表示计算失败有错误3 F. ~- q4 I: U7 H5 Y
/ |' Z/ c p' o- @/ @
+ p# O4 }, W% p# @* T% V
) d" i/ j, W3 z: q) a, g# E程序代码: & a5 ?7 M6 ~3 a
9 u; o& @+ {1 a( g$ [2 t; dnamespace fy_Exp{$ i" `3 [* p% U* M9 {9 }
namespace {template <class _T>
7 |& [9 k+ E& D: e+ P! r. Sinline _T GetExpValue(_T t[], char& csym){
5 c' l# A/ o; O+ E char c=csym; csym=0;5 d$ e7 X7 `: Y( ]* Q t6 i/ l5 r
switch(c){
0 X% G6 i. M) M; L case '+':return t[0] += t[1];
" c3 h; T% r/ ^7 U1 y case '-':return t[0] -= t[1];- s: P4 q! n+ a, `9 y
case '*':return t[0] *= t[1];8 r. k+ Y: Y- Y, P) s
default: return t[0] /= t[1];//case '/':
- v8 D' ]" T+ m3 E9 k }, P+ [- F0 O: ~& A9 Q
}}0 v7 G+ E( \6 f5 d0 [
template <class _T, class _Tstream>
, Q( ]5 D/ s8 I |( ~5 S' }/* _Tstream: inputstream, _T: get return value0 A$ F* l, e1 _& n3 ?
* Return nonzero if get value successfully */8 a* o9 z, {6 t _5 U/ m* }
int GetExpValue(_Tstream& istrin, _T& nReturn){6 R; ]. Q$ C+ ^
_T t[3] = {0}; //雨中飞燕之作% ] }, U. b# W& o' L
char csym[3] = "++";' Y. B, I4 I! u8 R: q
int nLevel = 1, nERR = 0;
( ?* o! u, Y& c2 s2 \0 T if(!(istrin>>t[1]))istrin.clear();& [- H5 c, t/ H" k0 q
for(;;){
+ `1 ] W0 a+ M E' R4 w& H, M( O7 y if(istrin>>csym[2]){
) S/ j1 }3 C! s switch(csym[2]){6 R6 ~, [2 p+ ~8 ?* I
case '(':5 ]$ R1 a, E, }3 ?$ }
if(!csym[1]){nLevel=0x100; nERR=1;}else
5 j/ [% b7 t3 a if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
8 q! T, M% r* B else{nLevel=0x100; nERR=1;}
6 }. \3 Q7 Z4 }5 c. A8 n/ i7 | break;" s1 @/ e A! q* R; E
case ')':' z( V' u% M' M4 B( j4 S- E9 X
{nLevel = 0x100;}break;8 {- |/ n5 Y) V
case '+':case '-':case '*':case '/':
& k7 T% j; `' H {csym[nLevel++] = csym[2];}break;
; ]" c+ t3 ?" m$ A# [* h* x' D+ X case ' ':case '\r':case '\n':case '\t':continue;/ d9 O* w$ ]6 H. \* A
default:
% }7 a0 |5 ] }) [; {& d4 R {nLevel=0x100; nERR=1;}2 `4 Y: \" H2 N9 P! ], Z
}
8 G* N9 m" {. ~0 ]6 [! I if(nLevel==0x100)break;$ f7 q' [ p; g7 h
if(nLevel&0x10 || istrin>>t[2]){
. b d9 @% ]; D nLevel &= 0xF;9 n* E# Y" X5 P. F3 L/ q
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
; N, y$ X$ T+ V6 X" M2 V! l$ f, ~ if(csym[1]=='*'||csym[1]=='/'){
+ j, H0 p! f: ]9 q+ Y7 }" Y GetExpValue(t+1, csym[1]);
" R R" K: D, [2 D% |0 O) k, n }. n. C, S/ |0 a! @2 O. @
else{
6 T3 p6 i6 ~' m$ R GetExpValue(t, csym[0]);9 Q4 m# X. Y! w6 I7 s
t[1]=t[2];csym[0]=csym[1];csym[1]=0;# ?; Z2 x2 p. s& A3 v
}
! R* ?* n( f' |4 E3 f: k nLevel = 1;6 ?0 G/ l' b, E R1 _( z
}
1 P! T F* K8 J* a4 d+ _( B% A else istrin.clear();6 X0 E! p5 c# E2 A
}
- i) }$ k' Y9 X; O1 A else{nERR = -1; break;}4 e4 F. G( r8 Q" W6 ^# C/ F" g
}
) r3 g) h/ O% f' Q+ C' f if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
. \# m9 e/ z. U+ O: F! V else nReturn=GetExpValue(t, csym[0]);
/ n% e7 p) P# G! p! I1 n return nERR==-1?1:0;% b# c- u; W- M& \) Y7 T9 j
}}
3 [% i9 w( r! m& ? }% Z5 ?
# J- Q- E+ d- ?3 A
3 |4 O# A' v8 @8 n. b0 P+ l# D. Y! J9 ]# g8 u N
函数模板使用示例:8 y" `3 x: z8 C7 a7 i
在以上那段代码的后面加上以下代码:' m' A4 h; E0 A. h G
$ Z" ~3 z/ u! ?" W) F* u) x0 q 4 T7 t7 k- Y: h- O, O! B- X
% y; `0 I; L. S% W) C程序代码:
" J8 x. Q! P+ @' H3 u2 u Z: ^5 r" z) _/ ]
#include<strstream>$ ?7 Y& h2 ?. a' N
#include<iostream>
4 W7 ]/ [6 W5 E#include<string>
a3 M6 h( K# }- S* p4 pusing namespace std;' h0 B0 [3 a# r3 [+ b# i
int main(void)1 s: |+ ]! Z, N& B% x- c0 i
{+ X0 |+ @$ z' Q) u4 z3 I/ U
string s1;; Z8 H; U8 w$ ]2 K; K
while(cin>>s1)
4 r0 n, k" f1 d! v1 D8 K$ {6 j {
3 m5 |, ], Q! A1 U! C' R% E istrstream isin(s1.data());" _) g J. }2 a2 \4 j
double d;
0 f# o) H+ C* | if(fy_Exp::GetExpValue(isin, d))
' Z8 r9 T( ^! R5 W {
! H* F: K" [+ c* x8 q: { cout<<d<<endl;
) f! W6 n; M7 R% I' b }
! b2 l9 _/ g ^$ g5 B6 k else
) d* v9 u9 l: k" u3 \ {% e( Q1 N0 L% z; A" @
cout<<"ERROR"<<endl;0 @! n% E8 Y3 u& s f& K
}( ]; P E6 g O5 Q3 c$ @
}& S8 p/ P2 G' K2 s# @% W, `, W; [8 j' d1 |
return 0;2 [, t2 T' u3 S* a3 Z5 S
}% g2 N* L+ O) Z1 C! j, M
( E! z; @& w) y$ d$ ]
" i' B* w" c, Y' q- {, C( n; R/ l然后编译执行就可以了(*^_^*)! e$ L f9 m! b5 m, R: g
其它:TC++上一定编译错误,不保证在VC6上也能通过编译4 N$ Z# C6 o- ?( ~( S& N8 @: V
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|