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

|
一个计算四则表达式的模板
在9月8日那天我特意编写的,给大家分享的,
1 l# Z/ V7 m! q一个很方便的函数模板,可以并且只可以计算含括号的四则表达式
( k' f; g, i/ ?* |. ~# v只有一个函数接口:int GetExpValue(_Tstream& istrin, _T& nReturn)
9 _; U6 z# M# f G. Y参数解释:
5 d" v/ K+ l: u4 }, nistrin: 一个输入流,可以是标准IO流,可以是文件流,也可以是串流
' H1 C4 `1 ~8 `8 U/ Y' F, OnReturn:用于接收计算结果的变量,计算所使用的类型由这个变量确定2 D& x } Z' @9 q4 L/ s
返回值: E0 N5 |$ s0 }+ P$ N4 u, H
返回非0表示计算成功,0表示计算失败有错误 Z2 e7 H% O* i) d3 s: j2 D
& b/ G! V z. A% ~
6 f5 N4 P/ l! I+ {- C1 B4 `
C& x. ]0 O' M0 n3 p' o/ d程序代码:
: U3 ]; F6 P2 S
1 A1 S/ ?, w. y7 {8 K6 jnamespace fy_Exp{; b7 `- E! s `6 x, A5 @
namespace {template <class _T>! q, w3 D4 P& g$ j) U$ T# w
inline _T GetExpValue(_T t[], char& csym){" u. a9 }" ~4 y: w2 @: N. b9 `
char c=csym; csym=0;
, M6 u. R& @4 ], \, o switch(c){% f, M8 D9 O. ^, a4 l" |
case '+':return t[0] += t[1];1 }5 D7 ^+ K: @. ^
case '-':return t[0] -= t[1];4 F3 q, P& ?: x" u9 d# S
case '*':return t[0] *= t[1];8 z. w! \/ A" L, A8 V
default: return t[0] /= t[1];//case '/':( P- c. q( F. T: [# ^
}% o; u: k: A4 _; G4 F" F% X
}}
$ R7 S. k# n1 U5 X3 k# etemplate <class _T, class _Tstream>5 R& Q( M; K4 x' `! A9 n- I
/* _Tstream: inputstream, _T: get return value8 r2 I9 }! K9 b# H3 x! N+ `( K
* Return nonzero if get value successfully */. R. H7 S) G7 c8 ?3 G+ e/ m) I
int GetExpValue(_Tstream& istrin, _T& nReturn){5 d: z! P& { e: r" ?# {
_T t[3] = {0}; //雨中飞燕之作
7 D' ?1 T. C7 \5 }' F% d4 } char csym[3] = "++";4 i& p/ B% o. r5 y7 [' s X
int nLevel = 1, nERR = 0;
, d1 A9 ^" N }: J if(!(istrin>>t[1]))istrin.clear();
6 b1 r {/ G4 X# s9 s+ l @: }" M for(;;){
9 G. V& W, l) f0 q5 [7 _ if(istrin>>csym[2]){
& C4 n/ @1 v; u" e, R% a2 f switch(csym[2]){
1 l# D7 _7 p2 r case '(':
2 F! I7 H( Z* o& p if(!csym[1]){nLevel=0x100; nERR=1;}else
+ ? O- k( R- k if(!GetExpValue(istrin, t[2]))nLevel|=0x10;3 B5 o& |7 a- H' O* p
else{nLevel=0x100; nERR=1;}9 t7 v0 ~% P5 E0 h
break;: c* H0 F! {9 E, I! \, F
case ')':
& i; q) w* D' b7 r) w {nLevel = 0x100;}break;
3 z+ ^8 A- p/ s- X! O case '+':case '-':case '*':case '/':% |+ S! n4 E+ ]6 O
{csym[nLevel++] = csym[2];}break;, Q+ i: }: r) x5 [5 ]
case ' ':case '\r':case '\n':case '\t':continue;
6 ~( N/ t1 \* ^" V" k default:
7 W: | @' @( T4 c* Y {nLevel=0x100; nERR=1;}# V, W/ E7 |, g+ q
}
$ g* o" D$ C2 |3 [4 y9 y5 h* C if(nLevel==0x100)break;& ~6 |! L/ t# b" L* M" _0 j( J8 n+ u
if(nLevel&0x10 || istrin>>t[2]){
7 P0 Z( B! L, G7 j' s nLevel &= 0xF;
* e5 p1 k$ R, o! F* q# M" M if(nLevel==1){t[1]=t[2];csym[1]=0;continue;}% W5 ^8 i! {. m* t A C; p
if(csym[1]=='*'||csym[1]=='/'){
3 D3 }2 n c2 `) ` GetExpValue(t+1, csym[1]);6 @3 G1 S$ ^: M L3 [& N7 Y% o9 v
}
l5 p- b4 L& K7 P( a else{
5 H& W% l7 V8 P- V( d GetExpValue(t, csym[0]);1 y) Q/ ^ ]/ \% J! v& U* D
t[1]=t[2];csym[0]=csym[1];csym[1]=0;
, }9 w6 F4 }. }1 a, P" U1 f9 E$ U } V( g' |9 Z' v$ v& O w5 e& Z
nLevel = 1;
# _' u; B+ E# ], i }
% i1 q& Q2 D' G, Y, { l else istrin.clear();: z: D# j- z9 i1 P
}3 n3 ]! {) i5 W; H' c7 Q9 X6 g
else{nERR = -1; break;}
/ t" E3 r7 t' ~: G: j) h- E* z }7 ]- X. W/ W! O+ ^: p6 u9 {4 _
if(csym[1])t[2]=0,nReturn=GetExpValue(t+1, csym[1]);# T' L2 m F9 M
else nReturn=GetExpValue(t, csym[0]);
; Y8 T0 z. d8 G9 c9 ~) N% ~ return nERR==-1?1:0;
' S4 n# E! k# Z7 U}}! C& f& S% j4 w: h4 M: b! R* b
1 I4 ]+ ~$ l: c1 F( n. Z& T& B8 U
M0 P, L: O& f4 B
[7 c- l6 ^3 s9 A; d! ^( V. {- h函数模板使用示例:
2 J; H8 l" x2 \' u: z在以上那段代码的后面加上以下代码:
) Q$ H6 U; R o" l! v- I0 _! C" S
9 b6 n1 b$ d: H }" f 8 r2 V: d: I$ N5 O( Q$ }' p3 k( M
: p4 W" U# G) }. | c程序代码:
6 A# ?& Z1 ?) S- V M* v; c; b" k( E
#include<strstream>
5 b: T& l: L9 U r4 ^, `#include<iostream>: N" M: w/ T" l
#include<string>
, ^3 U3 z, o( ^ nusing namespace std;: f- t) {; n- b. P
int main(void)! X; \) ?$ r8 A. `+ l
{8 U) a8 Z! `1 H* S+ C8 z Q [
string s1;( \+ @% K$ [8 B1 P! \9 S
while(cin>>s1)( e# l1 V0 M% ]& [
{2 N+ H& n S* S3 s6 \
istrstream isin(s1.data());
/ i" Q1 Y( a, `1 L: T- v$ Z; j# t double d;# f: Q) x7 }1 T7 U: i! Z1 F
if(fy_Exp::GetExpValue(isin, d))" Y5 ^3 K9 n: w1 \( n% u
{
# [/ E. P: Q8 T2 P cout<<d<<endl;
! i! m6 \6 C, e M+ T. S }' a' B8 ?3 o2 s
else
) [4 T9 W4 g6 h' l" W7 \/ _ {5 U# P% f2 t2 L
cout<<"ERROR"<<endl;9 j. B V: n0 F) ? f/ M
}
% K& e" {4 s, V4 `' y- _9 U }
`" m1 X1 W0 H return 0;) d' ~# h3 q/ ]* `/ o3 a
}
) |3 p" `# S% R i, M; Y; H$ X
- `; p [+ y. L+ H8 [% \' @! j4 u4 R K0 j2 k n, f
然后编译执行就可以了(*^_^*) H! {( B- D7 Z
其它:TC++上一定编译错误,不保证在VC6上也能通过编译8 z7 G4 U3 Q, M- N9 ?$ t0 e
建议使用VC7或VC更高版本,或者使用GNU C++编译 |
|