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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,% `* s: T" @: }9 `
一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
6 w7 v8 ?0 J U3 Z: A# a. |只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
" ~* _+ j# I: w4 m, R6 L参数解释:
: u# q' ^& {' aistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
2 I0 N- M8 m r# v3 ~nReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定' o1 s( [6 i+ W
返回值:, F0 T* |8 l: w- E" ~7 `# {. }
返回非0表示计算成功,0表示计算失败有错误% A: @4 v8 y. K7 N% {$ P
7 E+ V: A: W5 a
6 W$ @! ?: E' F* M. X8 }3 n+ i x7 k: {: {/ e) `' {
程序代码: & Y$ z# Z$ \% [4 o! N
7 F/ B( k q+ B0 y
namespace fy_Exp{
* }, u0 W+ H1 N2 X, ?" V- V! Tnamespace {template <class _T>
; O. S/ ^. f6 r; a8 yinline _T GetExpValue(_T t[], char& csym){- T- W/ w8 @! m2 K% ^2 Q5 L
char c=csym; csym=0;- J3 Z- E$ Q0 Y, n2 v7 Q
switch(c){5 l$ |! `9 X) X7 V0 g6 S; h' j
case '+':return t[0] += t[1];$ p$ a5 C# [' r, q1 V3 U q/ C
case '-':return t[0] -= t[1];" [% ?, ` E2 Q2 N7 E% \; ]5 ]
case '*':return t[0] *= t[1];, n5 ]4 U# P# z% z- T# p
default: return t[0] /= t[1];//case '/':' u8 o8 [5 ?. o9 C
}
) W6 {! }* [% L! V}} G+ d) N% h0 ?- r% c; i" T2 d
template <class _T, class _Tstream>
* ]# u; F' z$ p6 Z/* _Tstream: inputstream, _T: get return value: A5 @. K- f% p* ]% ?4 R$ ]9 w% G
* Return nonzero if get value successfully */, F" }0 y7 b, `6 e0 z5 X& |4 c
int GetExpValue(_Tstream& istrin, _T& nReturn){! Z6 z- y' [2 N9 q
_T t[3] = {0}; //雨中飞燕之作
3 f. L; U6 m( h( `. U9 g' k char csym[3] = "++";# }% C$ n& I# T/ F5 c9 k, `
int nLevel = 1, nERR = 0;
0 ^9 f K9 a7 o k; x if(!(istrin>>t[1]))istrin.clear();& [" [( Q& f4 S! a* e! Y8 y9 o
for(;;){4 j5 N; m6 o: B% n- W: o, z
if(istrin>>csym[2]){) E" R# V+ l) [# u
switch(csym[2]){
7 A3 U- W# H! H8 l* y case '(':. S5 ]. \/ ?# X
if(!csym[1]){nLevel=0x100; nERR=1;}else% l' b0 ], Q; u- C+ y$ y
if(!GetExpValue(istrin, t[2]))nLevel|=0x10;
& O& c1 x, ~, J! K( a4 N& M else{nLevel=0x100; nERR=1;}
0 ~3 Q# u# T% e% `6 m break;9 U- J0 Y: a7 c
case ')':
2 S2 [7 B6 X, x {nLevel = 0x100;}break;& Y+ @! C* n& b7 \, G1 |/ r
case '+':case '-':case '*':case '/':; P0 H/ @; ]- h3 z+ ^- p" A, k6 c
{csym[nLevel++] = csym[2];}break;
; g) i5 B4 t% j0 f* {' q/ l case ' ':case '\r':case '\n':case '\t':continue;
' N4 C+ {9 J [" @/ D default:' X1 U& Y$ p0 O; O9 A# A7 q
{nLevel=0x100; nERR=1;}4 Q/ d' y0 g) ^: L4 Z/ i6 K- [
}
% @+ [) O3 {. E if(nLevel==0x100)break;+ T* y, h; n2 L# T& c
if(nLevel&0x10 || istrin>>t[2]){+ _; ~( e! }4 I& k9 O# I
nLevel &= 0xF;
( ^8 |& z% V; n; k if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}
1 N; U6 O& N% o7 c( V) v if(csym[1]=='*'||csym[1]=='/'){6 h8 p( \0 l; c' w
GetExpValue(t+1, csym[1]);3 F$ Z2 E4 I; A
}
- i, s% p, m2 |( r' J else{& v/ u# ]0 l! o' |- w/ D0 N: G
GetExpValue(t, csym[0]);
$ A' \* w4 W/ [: x6 b t[1]=t[2];csym[0]=csym[1];csym[1]=0;' ^4 K; |7 ?( A! r2 b- v7 z3 W
}/ k) Z% ^0 o. D1 x& d
nLevel = 1;0 Q: e1 U9 y/ U8 g; ^& O# R
}
0 B* {4 u$ N. A8 [/ S/ K else istrin.clear();
) x u4 d! S1 Y, F4 [7 \/ ? }
0 P3 H2 ^; S( l# [" m else{nERR = -1; break;}( v& p8 a+ _$ e
}
8 ]6 A7 E4 ~+ u if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);
+ a" P9 ~# U( c6 V: r; r3 D+ _5 r else nReturn=GetExpValue(t, csym[0]);
- N: H" D; `* |% C! g: e5 ~) S. U return nERR==-1?1:0;
) W' |- |2 e! |9 X' _}}9 f8 n0 e' T1 ^, a f
; r" ^5 v# |) `$ I
7 F& p) ]9 C+ Y
8 I1 Z( E8 x, ]; r# W函数模板使用示例:3 V1 b" ?# d. A. z0 P, T
在以上那段代码的后面加上以下代码:
# H# \+ b: z4 C/ j( y8 v% ?: d+ N/ W; e9 h6 [% X0 w
- M1 c0 R( a0 S
/ S( R4 B$ o5 g& [程序代码:
8 _7 ^) Q+ }& p# H. j+ g5 b' P0 ]; M; D6 r
#include<strstream>0 A' r, ^/ t6 v2 ], H
#include<iostream>4 {! Z% ^8 e3 X9 t7 o
#include<string>
) ~4 _( a% w, U5 z, v$ A1 |. {! S1 d' Wusing namespace std;1 g8 b$ |4 i1 c/ g" [- i
int main(void)
: _% k! z/ _& \6 c; t{: h4 r Y6 C, ^. |; [
string s1;5 g/ H1 `+ T$ s. b, @
while(cin>>s1)' Y2 L5 i0 q( g7 l* l$ t
{1 L8 e3 X, T6 \# r* T
istrstream isin(s1.data());
3 I) ]- V: m/ F- k! ]+ N/ ^3 a double d;
6 _* Q# J2 {: S8 m if(fy_Exp::GetExpValue(isin, d))
. z& t! }+ ?" C3 c( a {( W. a. L5 @5 x; v8 H9 U
cout<<d<<endl;5 ~. @1 q; ^/ e! u4 d. c- Y0 x
}
) }0 K# u+ `/ w1 j# g' ~& U1 s5 d+ S else, \; o: k3 f+ S$ _' J
{
, Q" C; V) [1 \5 P% ]; K cout<<"ERROR"<<endl;
5 L" a6 B1 K; y1 k# I }% |+ Z$ {' m2 R$ e1 Z; @8 u
}
7 \/ B, }0 b: L7 x; x return 0;
; Z; l8 j, h. Z$ V}
3 `; n: w# m- J, I T9 z# x5 R2 H( ?, X0 u% G3 p9 c- s7 }2 a, J
* J8 v5 k. @3 j. B X/ N8 T z
然后编译执行就可以了(*^_^*)
4 B) X8 A( G! p5 `- p其它:TC++上一定编译错误,不保证在VC6上也能通过编译
% I A% B) M# p* [7 q 建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|