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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,9 b! M4 m8 Y6 I1 a1 A8 a9 G; g/ L. m
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式7 H! E: K4 i8 c0 c' }+ E
只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)8 g+ _; v9 }; |, m/ m1 j( ~
参数解释:
- k. k0 Z( s( K+ G/ t6 kistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流8 z8 I6 n0 c ~- V! x
nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定" U% l4 k! y) l& `) q6 Y( X
返回值:
( e) m$ _$ J" |, L3 j; Y e返回非0表示计算成功,0表示计算失败有错误
! o! E, ^& c% M3 B! K9 ^5 ?1 k! o6 j! `1 h4 @0 T3 z4 x9 N
8 l" m4 ]6 l# F3 I5 z
9 g9 Q+ r! ?! P& L
程序代码:
! G4 f) n2 M/ T) _* O
1 D: h- {9 g5 c! X0 snamespace fy_Exp{
c! T N9 u, B: |$ [namespace {template <class _T>
1 M4 ?1 {9 m: D9 Ninline _T GetExpValue(_T t[], char& csym){
5 j: l4 S' w3 A- i+ L2 G char c=csym; csym=0;; K6 o: z) P1 }+ n# M* Y
switch(c){
! z: _8 C, K0 ^3 d case '+':return t[0] += t[1];
0 [- F1 t2 c$ v3 I1 F case '-':return t[0] -= t[1];
- e0 _8 I1 S9 k1 N8 s0 g, z0 ]) m0 { case '*':return t[0] *= t[1];
" k& u! a- e2 s default: return t[0] /= t[1];//case '/':3 Z1 ?0 ]0 d, }! Y/ m8 O0 N; D; Y
}2 v/ r# w2 Z( }( X" z
}}' u' r* ] w7 ]/ m$ D" U
template <class _T, class _Tstream>
1 e' P X" K7 Q' V9 }) `1 n/* _Tstream: inputstream, _T: get return value" J# d0 N- V) H9 h! V/ g
* Return nonzero if get value successfully */7 P: S% E! C. Q' {. l
int GetExpValue(_Tstream& istrin, _T& nReturn){
4 p7 W9 O: r( L- W3 H7 i _T t[3] = {0}; //雨中飞燕之作3 p& |2 G* C2 f& c
char csym[3] = "++";
+ f$ l! e* }+ z6 c3 ` int nLevel = 1, nERR = 0;+ w" x" p" m% `2 T' v7 u
if(!(istrin>>t[1]))istrin.clear();( s" p: r9 L& `6 k5 t
for(;;){
! n, Z+ `" L- w) |& I0 C$ k if(istrin>>csym[2]){0 ]; ~# B3 _6 f( ?
switch(csym[2]){6 y9 V- g r2 |# t
case '(':
, T8 [8 g/ F& D# | if(!csym[1]){nLevel=0x100; nERR=1;}else# Z: U1 a9 Z2 H" [
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;' [" M( Z2 V6 I3 l: K0 s z }
else{nLevel=0x100; nERR=1;}
0 t4 ^% t7 V1 |# q f" q/ L! e break;$ [! B6 l5 w& Y4 ]; k' h
case ')':
# x1 Z7 J1 X/ q+ e3 c: M: q {nLevel = 0x100;}break;7 y# L0 t; c- g, D7 ~4 _6 p
case '+':case '-':case '*':case '/':
6 K, h* @9 l4 M; x {csym[nLevel++] = csym[2];}break;
1 ^# y+ D0 t# T/ \2 Z5 p% M case ' ':case '\r':case '\n':case '\t':continue;
( s1 V5 t+ C% X' z6 j default:* W" n7 [1 a. y
{nLevel=0x100; nERR=1;}
" F) K$ S+ d3 F, q" w. V }2 } y# G' h5 `( M& K1 z
if(nLevel==0x100)break;
* h$ L3 B2 q" m2 z if(nLevel&0x10 || istrin>>t[2]){
3 u( @" k* @" v: M nLevel &= 0xF;" Y. ^' d; g( g
if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}; G7 H* H& b5 u6 }, D
if(csym[1]=='*'||csym[1]=='/'){
8 P! M& u! P) C1 g4 T) ]0 x% D GetExpValue(t+1, csym[1]);. S9 i" e0 u' C _6 k" ^( b( t# S
}
1 } J: t* R8 I. ]7 m9 f else{
; {8 y. o. x4 M& t% y2 `; C GetExpValue(t, csym[0]);
& j( K b/ N7 E* [' v1 D: t t[1]=t[2];csym[0]=csym[1];csym[1]=0;
* V; i: ?0 Z' G }
# g3 Y$ l8 B3 x nLevel = 1;( J) {0 W; K0 X+ m& d( }
}
) z# T9 M4 L. r& q1 \ else istrin.clear();
+ U1 T0 V5 Y& E5 R& a1 Q }
. D, g4 T5 O! K% E# q else{nERR = -1; break;}
. e$ u+ e; l) B v; O' }7 m7 _ }
+ c E& _9 ?* x, H if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);( Y1 O5 C1 W- X+ \+ \/ F; T$ S1 y1 U
else nReturn=GetExpValue(t, csym[0]);
4 ?( R3 f1 j9 W, ]; u return nERR==-1?1:0;$ O' N* U' I2 H* h% t5 \/ x7 k
}}
$ B% D+ U0 o7 v7 c8 O, y. |" N. p: o- z# a5 n/ V( r
$ V4 p O4 E+ P6 W- j' R4 [2 y& S7 E. t
6 D/ D% G7 W9 U$ e
函数模板使用示例:3 x4 Z. Y& k* ?1 u: D, H
在以上那段代码的后面加上以下代码:" r2 ?( W) [7 l0 h) l
! H* }# \8 ~ ^( [9 T
& T9 S( O# }* T7 N
5 }7 K. u/ l. O! x2 v) b程序代码: 2 h( ^7 B5 ^# [. t* F
( A0 {# R1 f7 ]7 j#include<strstream>* `' r7 O T3 _" w* w0 e5 ~8 _
#include<iostream>
* N/ f( g! ?. f* a M/ S: k#include<string>
' g; W' j$ u6 `) T+ y- }" {$ {using namespace std;
Z. z7 r* F+ z" n% N6 U# l6 g& bint main(void)+ i: b+ X& h- Y3 G6 A. K
{
& d! D( b! { p string s1;- E, }9 x$ |2 n: d! G
while(cin>>s1)7 L/ W, d F' W* M, w5 J
{
& u5 l/ M" G' n; }3 A1 ? istrstream isin(s1.data());4 L9 v; g: j% Y' N
double d;
9 [( A: z G1 Q: M4 O! W if(fy_Exp::GetExpValue(isin, d))
& U% C& t1 q6 R4 P {
' H l5 D }& v- k% E cout<<d<<endl;* ` @ B9 ^6 Y$ A% [, ^
}. B# b; e, u4 \+ J' P
else
6 P( v8 J5 f5 W" b5 h; I1 y7 X& n {. u; n8 a" c9 }& s6 a7 E. H
cout<<"ERROR"<<endl;
9 V; m5 c' D- y0 ?8 |( K. A }
* ? T3 z- M/ A" d6 X" D/ y! r }
( n' W, Y% T7 ]3 M% t% {( t L return 0;
% \3 a w m# J8 q/ \5 O}0 q" t: _; O+ x2 G
% C' L$ O0 M/ N3 I3 w/ s
0 Q5 V9 m$ l. `$ J/ w! k9 Z% x然后编译执行就可以了(*^_^*)6 F3 z% x# x3 N$ Q" L( l4 r8 @: A
其它:TC++上一定编译错误,不保证在VC6上也能通过编译( e& [3 ?, e1 b
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|